收藏 分销(赏)

CAN芯片选型.doc

上传人:天**** 文档编号:3317282 上传时间:2024-07-01 格式:DOC 页数:17 大小:69KB 下载积分:8 金币
下载 相关 举报
CAN芯片选型.doc_第1页
第1页 / 共17页
CAN芯片选型.doc_第2页
第2页 / 共17页


点击查看更多>>
资源描述
现在市场上的两款主流独立CAN协议控制芯片对比 MCP2510 SJA1000 完全支持CAN总线V2.0A和V2.0B技术规范,通信 速率为1 Mb/s: - 0 - 8 字节报文长度 - 标准和扩展数据帧 - 可编程位传输速率可达1 Mb/s - 支持远程帧 - 两个接收缓冲器, 可优先储存报文 - 六个完全验收滤波器 - 两个完全验收屏蔽滤波器 - 三个发送缓冲器,具有优先级设定以及发送中 止功能 - 用于自检的环回模式 • 硬件特性: - 高速SPI 接口 (4.5V 工业级温度范围时可达5 MHz ) - 支持 0,0 和1,1 SPI 模式 - 带有可编程预分频器的时钟输出引脚 - 带有可选择使能设定的中断输出引脚 - ‘缓冲器满’ 输出引脚可配置为各接收缓冲器的 中断引脚或通用数字输出引脚 - ‘请求发送‘ 输入引脚可配置为发送缓冲器的控 制引脚, 用以请求立即发送报文, 或配置为通 用数字输出引脚 - 低功耗休眠工作模式 • 低功耗的CMOS 技术: - 工作电压范围3.0V 到 5.5V - 5mA 典型工作电流 - 5.5V时典型待机电流为10 μA • 18引脚 PDIP/SOIC 和20 引脚 TSSOP 封装 • 允许的工作温度范围: - 工业级 (I): -40°C 到+85°C - 扩展级 (E): -40°C 到+125°C 说明 Microchip Technology Inc.( 美国微芯科技有限公司) 生产的MCP2510 是一款控制器局域网络(CAN) 协议控制器, 完全支持CAN 总线V2.0A/B 技术规范。该器件支持CAN1.2、CAN2.0A、主动和被动CAN2.0B 等版 本的协议,能够发送和接收标准和扩展报文。它还同时具备验收过滤以及报文管理功能。该器件包含三个发送缓冲器和两个接收缓冲器,减少了单片机(MCU) 的管理负担。MCU 的通讯是通过行业标准串行外设接口(SPI)来实现的,其数据传输速率高达 5 Mb/s。 特性 -- 和PCA82C200 独立CAN 控制器引脚兼容 -- 和PCA82C200 独立CAN 控制器电气兼容 -- PCA82C200 模式即默认的BasicCAN 模式 -- 扩展的接收缓冲器64 字节先进先出FIFO -- 和CAN2.0B 协议兼容PCA82C200 兼容模式中的无源扩展帧 -- 同时支持11 位和29 位识别码 -- 位速率可达1Mbits/s --PeliCAN 模式扩展功能 --可读/写访问的错误计数器 --可编程的错误报警限制 --最近一次错误代码寄存器 --对每一个CAN 总线错误的中断 --具体控制位控制的仲裁丢失中断 --单次发送无重发 --只听模式无确认无活动的出错标 志 --支持热插拔软件位速率检测 --验收滤波器扩展4 字节代码4 字节屏蔽 --自身信息接收自接收请求 --24MHz 时钟频率 -- 对不同微处理器的接口 -- 可编程的CAN 输出驱动器配置 -- 增强的温度适应-40-+125 --电压 4.5-5.5V 从以上两者的性能上看,MCP510的各种性能都要优于SJA1000, 如:MCP510正常工作电压为3.5-5.5,而SJA1000的工作电压为4.5-5.5,MCP510的抗干扰性比SJA1000强 MCP510 - 两个接收缓冲器, 可优先储存报文 - 六个完全验收滤波器 - 两个完全验收屏蔽滤波器 - 三个发送缓冲器,具有优先级设定以及发送中 SJA1000 一个发送缓冲器,一个接收缓冲器和一个接收4位验收滤波 Mcp510采用的是SPI接口,而SJA1000采用的是8位并行数据传输(数据线和地址线分时复用)。 采用SPI串行传输比采用并行传输要节省8-11根线,也就是节省8-11个IO口 所以综上考虑选用MCP510 PCA82C250 TJA1050 MCP2551 采用先进SOI技术 独特的防失效功能 收发器可连接110个节点 在未上电时以无源型态表现 产品线可满足各种应用与网络配置 完备的防失效功能则有助于安全运作 支持安全及高频数据传输,速率达到1Mbps 卓越的电磁发射(EME)与电磁干扰 (EMI) 效能 低反向电流以确保未加上电源的节点不会干扰网络 工作频率0-1M 工作电压:VCC 4.5~5.5V; VCANH -8-18V VCANL -8-18V 工作温度:-40~+150℃; 与“ISO 11898”标准完全兼容 速度高(最高可达1M 波特) 低电磁辐射(EME) 具带有宽输入范围的差动接收器,可抗电磁干扰(EMI) 没有上电的节点不会对总线造成干扰 发送数据(TXD)控制超时功能 发送禁能时的静音模式 在暂态时自动对总线引脚进行保护 输入级与3.3V 装置兼容 热保护 对电源和地的防短路功能 可以连接至少110 个节点 工作频率60K-1M 工作电压:VCC 4.75~5.25V; VCANH -27-40V VCANL -27-40V 工作温度:-40~+150℃; • Supports 1 Mb/s operation • Implements ISO-11898 standard physical layer requirements • Suitable for 12V and 24V systems • Externally-controlled slope for reduced RFI emissions • Detection of ground fault (permanent dominant) on TXD input • Power-on reset and voltage brown-out protection • An unpowered node or brown-out event will not disturb the CAN bus • Low current standby operation • Protection against damage due to short-circuit conditions (positive or negative battery voltage) • Protection against high-voltage transients • Automatic thermal shutdown protection • Up to 112 nodes can be connected • High noise immunity due to differential bus implementation • Temperature ranges: - Industrial (I): -40°C to +85°C - Extended (E): -40°C to +125°C TJA1040 比C250/251 有几个优胜的地方 􀁺􀀃 如果不上电在总线上完全无源如果VCC 关闭总线上看不到 􀁺􀀃 在待机模式时电流消耗非常低最大15μA 􀁺􀀃 改良的电磁辐射EME 性能 􀁺􀀃 改良的电磁抗干扰EMI 性能 􀁺􀀃 SPLIT 引脚代替Vref 引脚对总线的DC 稳压很有效 PCA82C250 是一款比较早的产品,TJA1050是前者的替代品,在性能上优于前者,尤其是在防电磁干扰方面。 目前世界上使用最广泛的CAN收发器当属NXP(原飞利浦半导体)的各种收发器了。过去的一些PCA82C250/251就不说了,在很多场合都已经有很广泛的应用。通过工艺改造和技术创新,前些年,飞利浦推出了TJA1050和TJA1040两款升级的CAN收发器。也在各种场合得到了很广泛的使用。     MCP2551是微星公司生产的一款CAN收发器,在市面上也有一定的使用,但广泛程度远远低于TJA1050。这两款芯片都是新的收发器,但为什么会发生一边倒的局面呢。下面从一些重要的方面进行比较(TJA1040性能远高于MCP2551,故不做对比): 1.最低波特率:新的CAN收发器为了防止MCU的TXD管脚长时间处于低电平,从而影响总线。所以都做了最大位限制,即最小波特率限制,稳定运行情况下,TJA1050通常支持是60K以上波特率(最低支持20K),而MCP2551是16K以上波特率(最低支持5K)。可以说TJA1050在总线错误时能更快地切断错误信号,保证正常通讯,这在汽车电子通讯中十分重要。(汽车中波特率一般是100K、125K、250K) 2.兼容性,TJA1050可以兼容过去的PCA82C250收发器,而MCP2551在PCA82C250系统中是不能工作的(我曾测试过,当8个左右节点时,混用MCP2551和PCA82C250,是不能通讯的)。不过,TJA1050却是可以兼容MCP2551系统。故使用TJA1050的兼容性很好。 3.EMC性能:TJA1050采用自动斜率控制,即使输出的电平拥有极低的电磁辐射,而MCP2551却是和以前PCA82C251一样,需要用户通过波特率,来调节斜率,以使EMI通过。从使用上TJA1050比较方便。 4.输出对称性:TJA1050由于拥有极好的输出对称性,所以即使在不加共模线圈的情况下,抗共模干扰能力也很强。我的一个客户曾经测试过,果然TJA1050在群脉冲测试中性能比MCP2551高出5%。 综合以上比较 选择TJA1050 can--saj1000设计总结(转) 发布:2009-11-02 21:43 | 作者:liu513201 | 来源:本站 | 查看:191次 | 字号: 小 中 大 can--saj1000设计总结(转) 发表于:2008-11-07 06:04:57   点击: 251   我在学习CAN应用设计中的一点心得体会,也算是走了一些弯路,现在把它写出来和大家共 同交流。 不知道各位注意到没有,大多数情况下,SJA1000是与8250+51系列单片机的方式来做 CAN的控制应用。如果是1M/s的通讯速度的话,实际上的流量只有大概500多K的样子,此点 希望大家在以后的应用设计中需要考虑周到。 上诉问题产生的原因是SJA1000的发送缓冲区只有1个,应用程序在判断发送完一幀 数据后,需要计算下一幀需要装载的数据长度,然后根据长度再装载相应的数据到缓冲区 ,这个过程要消耗掉了一定的时间(特别是标准51内核的单片机),因此CAN总线上的数据 流实际上是发送一幀就有一个比较长的空闲区(单片机装载数据的时间),这样一来就浪费 了总线资源。微芯的MCP2510有3个发送缓冲区,在5V的电源下以5Mb/s的SPI端口读写数据,可 以较好的解决这个问题,但是多数的51单片机都无SPI,这样也给单片机的选择上带来了一 定的麻烦。具体选择怎样的方案,只能看各自的应用情况来定了! sja1000调试经验 去年年底的时候,一个公司给我打电话,问我最近有没有空,说要请我帮忙做一个基于 CAN总线通讯的东西,我去看了看,是一个数据采集系统,下面是一系列数据采集的智能板 卡,上位机是基于WINBOND的一块486的工业嵌入式控制板,操作系统使用的是WINCE。智能 板卡通过工业底板和数据线两种方式和上位机通讯,通信协议选择的是CAN,其中底板上的 通信选用高速波特率(1Mbps),数据线选用低速(100kbps)。 去公司的时候,公司给了我一个参考的东西,采用SST单片机+SJA1000的方案构成的智 能板卡,同时告诉我可以自己设计方案。考虑到SST的东西没有用过,P8X591是PLCC封装 的,烧写起来不方便,于是我设计了如下的方案: 1、智能板卡上的通讯采用AT89S51+两块SJA1000的方式进行; 2、上位机通过PC104总线和一块CAN控制板卡连接,CAN控制板卡上同样采用AT89S51+两 块SJA1000的方案。AT89S51和上位机通过PC104总线共享内存(使用IDT的双口RAM); 3、采用西门子的组态软件进行WINCE下的板卡驱动开发; 由于以前没有做过CAN的东西,于是决定了先调试CAN通信,然后设计板卡的方案。 方案确定之后,首先是上上下载了全部的SJA1000和PCA82C250的资料。然后 始设计电路板。采用了SJA1000应用指南中推荐的方案,采用SJA1000的时钟输出为AT89S51 的时钟,没有采用光电隔离芯片,把TX1接地,TX0和RX0分别连接到PCA82C250的TXD和RXD引 脚上,RX1连接到PCA82C250的VR上;加上了5欧姆的限流电阻和120欧姆的匹配电阻(用110欧 姆替代),另外加上了一个调试用的串口。没有注意而且要命的是把SJA1000的复位引脚和单 片机的复位引脚连接到了一起。 第一次的板子用的加急,用了三天,结果那次的板子做的极差——连铜皮都翻起来了; 我马上让那个电路板厂重新做了三块。在做板的过程中我发现了复位引脚的错误,SJA1000的 文档上提供的是一个复位电路,但是没有给出电路的详细组成,于是我就误以为和单片机的 复位电路是一样的了。在设计这块电路板的时候,最担心的事情就是SJA1000的输出时钟能 不能够驱动AT89S51,如果不能够驱动,那么一切就OVER了,可惜的是我的担心成为了现 实,板子焊好之后系统不工作,在SJA1000的时钟输入引脚上有信号输入,而且输出时钟也 正常,但是单片机就是不工作。于是我先把SJA1000的复位引脚连线割断,连接到了AT89S51 的IO引脚上,再把S51的XTAL的两个引脚连接到SJA晶体的上,可惜系统还是不工作,这次电 路板设计失败了。 在总结了第一次失败的经验后,参看了21IC上的一个设计,决定把AT89S51和SJA的晶体 分开。并且用单片机的一个IO引脚来控制对SJA的复位。   第二次的电路板比较成功,焊接好了之后首先测试单片机的串口和LED指示灯,一切 OK。然后就开始测试SJA。ZLG提供了一个BASIC模式下的参考例程,我看了一下,然后又找 了本《现场总线CAN的原理和测试》把SJA的寄存器详细看了看(由于开始的时候比较忙,所 以直到这个时候才算是仔细看了看SJA的内部,至于CAN的基础协议我是根本没有看,这给我 后面带来了极大的麻烦)。然后就参考ZLG的程序开始写SJA的测试程序,那个程序写的很 大,也很全,因为我想快点把东西给做出来,于是弄了一个1000多行的程序,以前我的调试 程序一般都很小的。写好程序之后就开始测试,首先测试的是测试寄存器,然后一步步测试 下去,在BASIC模式下所有的寄存器都正常,但是在发送的时候是总是不正常,启动发送之 后就一直在发送,状态寄存器的标志位一直处在发送的状态下,然后就是报总线错误,不知 道是怎么会事情,很郁闷,上bbs看了一下。bullfrog告诉我单个CAN节点发送是成功不了 的,如果没有收到接受CAN节点的应答,发送节点就会一直发送,直到超出错误计数器的允 许值使得总线关闭。同时在精华区发现在peli模式下有ECC(错误寄存器),可以跟踪错误, 于是开始看peli模式操作过程。这个东西比较麻烦,zlg没有提供公开的c代码,我找了一个 汇编的作为参考。 我第一步的目标是自发送,在peli模式下有自发送这种模式,在有匹配电阻的情况下可 以进行单个节点的接收和发送。第一次调试的时候没有成功,给北京zlg打电话,北京分公 司说让我给广州打电话,给广州打电话,几个问题都得到了很好的解答(在此谢谢zlg的工 程师了): 1、自发送的时候必须加上匹配电阻; 2、5欧的限流电阻可以不需要; 3、每次发送完成之后 4、建议使用中止发送来进行单步发送; 另外他告诉我可以在zlg的论坛上找到很多很有用的东西。 听了他的建议,我第一件事情就是检查我的电路板,检查的结果让我大吃一惊— —我的ch和cl竟然是短路的,万用表的狂叫不止。一步步检查,发现那个110欧的匹配电阻 有问题,万用表碰上去就叫,于是把那个电阻剪下来,量量还是短路。于是我怀疑把5欧的 限流电阻当成了110欧的电阻,于是把匹配电阻都去掉了。没有想到的是当我把新的110欧电 阻拿来的时候,万用表还是叫,这时候才发现这块万用表在300欧姆以下都要叫,可怜我又 打理了n长时间的电路板......再仔细阅读了一次peli模式下的操作指南,又仔细阅读了zlg 提供的初始化规范,发现在子发送的时候发送的命令应该是0x10或者是0x12(即CMR寄存器里 面有一个专门的控制位是用来控制自发送的,和普通的发送命令位是不同的)。在发现了这 个问题之后,自发送一切顺利的通过了。 接下来就是两个节点的互调了,我首先用自发送程序把两个节点都调试了一下,保证单 个节点发送硬件没有任何问题。然后就用双绞线通过接线端子把两个系统连接到了一起。第 一次调试采用的是1M的波特率(由于ZLG只给出了16M晶体下的BTR0和BTR1的初始值,我在ZLG 的论坛上找到了一个网友自己计算的数值,后来证明这个东西有些问题),没有成功。发送节 点通过串口利用串口调试助手来控制发送,接收节点通过仿真器观察数据。虽然没有发送成 功,但是通过串口的反馈数据和仿真器的观察窗,可以看到ECC寄存器都发生了变化,证明 数据线上有数据过去(由于我没有示波器,只有采用这种办法)。于是我改变了两次波特率, 最低到了5k,都没有成功,最后我从21IC上的一篇应用文章上找到了两个参数,这次就成功 了,通讯速率20k。现在一切稳定,在写这篇文章的时候哪几个LED正欢快的闪烁着。 最后,总结几个经验: 1、一定要详细的阅读sja的手册和CAN的相关知识; 2、SJA的复位是低电平,而且不是用一个非们把单片机的RST反相就可以的,有两 种解决方式:第一种是使用单片机的IO引脚来控制SJA的复位引脚,好处是单片机完全控制 SJA的复位过程;第二种是采用适当的复位芯片,ZLG给我推荐的是CAT1161,我没有用过, 其好处是同步复位。 3、在自发送的模式下,需要匹配电阻,而且自发送的启动命令和普通发送的启动 命令不相同; 4、BRT0和BRT1的选择,和串口通信中只要两个的误差一样就可以了不同,一定要 精心选择,建议SJA的外部晶体选择16M的,这样有利于参考ZLG的标准数值 5、SJA和其他外部器件连接的时候,数据线在373前后都可以; 6、最好有一个示波器; 7、不要太大意的相信万用表的蜂鸣器; 8、这是从ZLG网站上转载过来的peli模式下的初始化流程 a)检测硬件连接是否正确 b)进入复位状态 c)设置时钟分频寄存器 d)设置输出控制寄存器 e)设置通讯波特率 f)设置代码验收寄存器 g)设置代码屏蔽寄存器 h)退出复位状态 i)设置工作模式 j)设置中断使能寄存器 这是一个自发收程序,采用at89s51+sja1000,分离晶体,at89s51晶体11.0592 sja1000外部晶体为12M,通过串口进行监控 ****************************************************** 以下为头文件定义 copyright by alloy ****************************************************** #define SJA_REG_BaseADD 0x7800 #define REG_MODE XBYTE[SJA_REG_BaseADD + 0x00] #define REG_CMD XBYTE[SJA_REG_BaseADD + 0x01] #define REG_SR XBYTE[SJA_REG_BaseADD + 0x02] #define REG_IR XBYTE[SJA_REG_BaseADD + 0x03] #define REG_IR_ABLE XBYTE[SJA_REG_BaseADD + 0x04] #define REG_BTR0 XBYTE[SJA_REG_BaseADD + 0x06] //05保留 #define REG_BTR1 XBYTE[SJA_REG_BaseADD + 0x07] #define REG_OCR XBYTE[SJA_REG_BaseADD + 0x08] #define REG_TEST XBYTE[SJA_REG_BaseADD + 0x09] #define REG_ALC XBYTE[SJA_REG_BaseADD + 0x0b] //0a保留 #define REG_ECC XBYTE[SJA_REG_BaseADD + 0x0c] #define REG_EMLR XBYTE[SJA_REG_BaseADD + 0x0d] #define REG_RXERR XBYTE[SJA_REG_BaseADD + 0x0e] #define REG_TXERR XBYTE[SJA_REG_BaseADD + 0x0f] #define REG_ACR0 XBYTE[SJA_REG_BaseADD + 0x10] #define REG_ACR1 XBYTE[SJA_REG_BaseADD + 0x11] #define REG_ACR2 XBYTE[SJA_REG_BaseADD + 0x12] #define REG_ACR3 XBYTE[SJA_REG_BaseADD + 0x13] #define REG_AMR0 XBYTE[SJA_REG_BaseADD + 0x14] #define REG_AMR1 XBYTE[SJA_REG_BaseADD + 0x15] #define REG_AMR2 XBYTE[SJA_REG_BaseADD + 0x16] #define REG_AMR3 XBYTE[SJA_REG_BaseADD + 0x17] #define REG_RxBuffer0 XBYTE[SJA_REG_BaseADD + 0x10] #define REG_RxBuffer1 XBYTE[SJA_REG_BaseADD + 0x11] #define REG_RxBuffer2 XBYTE[SJA_REG_BaseADD + 0x12] #define REG_RxBuffer3 XBYTE[SJA_REG_BaseADD + 0x13] #define REG_RxBuffer4 XBYTE[SJA_REG_BaseADD + 0x14] #define REG_TxBuffer0 XBYTE[SJA_REG_BaseADD + 0x10] #define REG_TxBuffer1 XBYTE[SJA_REG_BaseADD + 0x11] #define REG_TxBuffer2 XBYTE[SJA_REG_BaseADD + 0x12] #define REG_TxBuffer3 XBYTE[SJA_REG_BaseADD + 0x13] #define REG_TxBuffer4 XBYTE[SJA_REG_BaseADD + 0x14] #define REG_DataBuffer1 XBYTE[SJA_REG_BaseADD + 0x15] #define REG_DataBuffer2 XBYTE[SJA_REG_BaseADD + 0x16] #define REG_DataBuffer3 XBYTE[SJA_REG_BaseADD + 0x17] #define REG_DataBuffer4 XBYTE[SJA_REG_BaseADD + 0x18] #define REG_DataBuffer5 XBYTE[SJA_REG_BaseADD + 0x19] #define REG_DataBuffer6 XBYTE[SJA_REG_BaseADD + 0x1a] #define REG_DataBuffer7 XBYTE[SJA_REG_BaseADD + 0x1b] #define REG_DataBuffer8 XBYTE[SJA_REG_BaseADD + 0x1c] #define REG_RBSA XBYTE[SJA_REG_BaseADD + 0x1e] #define REG_CDR XBYTE[SJA_REG_BaseADD + 0x1f] #define REG_Receive_Counter XBYTE[SJA_REG_BaseADD + 0x1d] #define OK 1 #define Fail 0 #define ON 1 #define OFF 0 #define True 1 #define False 0 sbit SJARst = P2 ^ 6; //复位控制 sbit LED0 = P1 ^ 0; sbit LED1 = P1 ^ 1; sbit Key0 = P1 ^ 2; sbit Key1 = P1 ^ 3; sbit Key2 = P1 ^ 4; sbit Key3 = P1 ^ 5; bit step_flg; bit Tx_flg; bit Rx_flg; unsigned char step_counter; unsigned char Tx_counter; unsigned char PC_RX_Buffer; unsigned char temp_data1; unsigned char Rx_Buffer[6]; void MCU_Init(void); void SJA_Init(void); void send(unsigned char S_Data); void Serial(void); void Delay(unsigned char Delay_time); void step(void); ******************************************************* 以下为c的主程序 copyright by alloy ******************************************************* #include <stdio.h> #include <string.h> #include <REG51.h> #include <TxMCU.h> #include <absacc.h> main() { unsigned char i; MCU_Init(); SJA_Init(); REG_MODE = 0x01; //进入复位模式 temp_data1 = REG_MODE; temp_data1 = temp_data1 &0x01; if(temp_data1 == 0x01) //在复位模式中 { REG_BTR0 = 0x85; REG_BTR1 = 0xb4; //100k REG_OCR = 0x1a; REG_CDR = 0xc0; REG_RBSA = 0x00; REG_ACR0 = 0xff; REG_ACR1 = 0xff; REG_ACR2 = 0xff; REG_ACR3 = 0xff; REG_AMR0 = 0xff; REG_AMR1 = 0xff; REG_AMR2 = 0xff; REG_AMR3 = 0xff; REG_IR_ABLE = 0xff; } REG_MODE = 0x0c; //进入自接收模式 REG_MODE = 0x0c; for(i = 0;i<100;i++); temp_data1 = REG_Receive_Counter; send(temp_data1); for(;;) { while(Tx_flg == False); Tx_flg = False; Tx_counter++; send(Tx_counter); temp_data1 = REG_SR; while((temp_data1 &0x10) == 0x10); temp_data1 = REG_SR; if((temp_data1 &0x04) == 0x04) { REG_RxBuffer0 = 0x08; //标准帧,长度为8 REG_RxBuffer1 = 0xff; REG_RxBuffer2 = 0xff; REG_RxBuffer3 = 0x01; REG_RxBuffer4 = 0x02; REG_DataBuffer1 = 0x03; REG_DataBuffer2 = 0x04; REG_DataBuffer3 = 0x05; REG_DataBuffer4 = 0x06; REG_DataBuffer5 = 0x07; REG_DataBuffer6 = 0x08; REG_DataBuffer7 = 0x09; REG_DataBuffer8 = 0x0a; } REG_CMD = 0x10; temp_data1 = REG_SR; temp_data1 = temp_data1 &0x20; while(temp_data1 == 0x20) //检查是否发送完成 { //send(0xaa); temp_data1 = REG_ECC; send(temp_data1); temp_data1 = REG_SR; temp_data1 = temp_data1 &0x20; //send(temp_data1); } send(0x66); temp_data1 = REG_ALC; send(temp_data1); temp_data1 = REG_ECC; send(temp_data1); temp_data1 = REG_SR; send(temp_data1); temp_data1 = REG_Receive_Counter; send(temp_data1); PC_RX_Buffer = 0x77; LED0 = ~LED0; // Tx_counter = 0x00; } } void MCU_Init(void) { SJARst = 1; LED0 = OFF; LED1 = OFF; PC_RX_Buffer = 0x77; step_counter = 0x00; step_flg = False; Tx_flg = False; temp_data1 = 0x00; TMOD = 0x20; TH1 = 0xff; TL1 = 0xff; TR1 = 1; SCON = 0x50; PCON = 0x80; EA = 1; ES = 1; Tx_counter = 0x00; } void SJA_Init(void) { unsigned char i; for(i = 0;i <125;i++); SJARst = 0; for(i = 0;i <125;i++); SJARst = 1; for(i = 0;i <125;i++); } void send(unsigned char S_Data) { SBUF = S_Data; while(TI == 0); TI =0; } void Serial() interrupt 4 using 2 { if(RI == 1) { PC_RX_Buffer = SBUF; RI = 0; if(PC_RX_Buffer == 0xaa) { send(0x13); Tx_flg = True; PC_RX_Buffer = 0x77; } else if(PC_RX_Buffer == 0x55) { send(0x14); Rx_flg = True; PC_RX_Buffer = 0x77; } else { send(0x15); PC_RX_Buffer = 0x77; } } }另外,我给大家推荐一本书,还不错的 北航出版的《现场总线CAN原理与应用技 术》(饶运涛等)
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服