CAN芯片选型.docx
- 文档编号:15014963
- 上传时间:2023-06-29
- 格式:DOCX
- 页数:17
- 大小:57.84KB
CAN芯片选型.docx
《CAN芯片选型.docx》由会员分享,可在线阅读,更多相关《CAN芯片选型.docx(17页珍藏版)》请在冰点文库上搜索。
CAN芯片选型
CAN芯片选型
现在市场上的两款主流独立CAN协议控制芯片对比
MCP2510
SJA1000
完全支持CAN总线V2.0A和V2.0B技术规范,通信
速率为1Mb/s:
-0-8字节报文长度
-标准和扩展数据帧
-可编程位传输速率可达1Mb/s
-支持远程帧
-两个接收缓冲器,可优先储存报文
-六个完全验收滤波器
-两个完全验收屏蔽滤波器
-三个发送缓冲器,具有优先级设定以及发送中
止功能
-用于自检的环回模式
•硬件特性:
-高速SPI接口
(4.5V工业级温度范围时可达5MHz)
-支持0,0和1,1SPI模式
-带有可编程预分频器的时钟输出引脚
-带有可选择使能设定的中断输出引脚
-‘缓冲器满’输出引脚可配置为各接收缓冲器的
中断引脚或通用数字输出引脚
-‘请求发送‘输入引脚可配置为发送缓冲器的控
制引脚,用以请求立即发送报文,或配置为通
用数字输出引脚
-低功耗休眠工作模式
•低功耗的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
说明
MicrochipTechnologyInc.(美国微芯科技有限公司)生产的MCP2510是一款控制器局域网络(CAN)协议控制器,完全支持CAN总线V2.0A/B技术规范。
该器件支持CAN1.2、CAN2.0A、主动和被动CAN2.0B等版
本的协议,能够发送和接收标准和扩展报文。
它还同时具备验收过滤以及报文管理功能。
该器件包含三个发送缓冲器和两个接收缓冲器,减少了单片机(MCU)的管理负担。
MCU的通讯是通过行业标准串行外设接口(SPI)来实现的,其数据传输速率高达5Mb/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
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-0221:
43|作者:
liu513201|来源:
本站|查看:
191次|字号:
小中大
can--saj1000设计总结(转)
发表于:
2008-11-0706:
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,通过串口进行监控
******************************************************
以下为头文件定义
copyrightbyalloy
******************************************************
#defineSJA_REG_BaseADD0x7800
#defineREG_MODEXBYTE[SJA_REG_BaseADD+0x00]
#defineREG_CMDXBYTE[SJA_REG_BaseADD+0x01]
#defineREG_SRXBYTE[SJA_REG_BaseADD+0x02]
#defineREG_IRXBYTE[SJA_REG_BaseADD+0x03]
#defineREG_IR_ABLEXBYTE[SJA_REG_BaseADD+0x04]
#defineREG_BTR0XBYTE[SJA_REG_BaseADD+0x06]//05保留
#defineREG_BTR1XBYTE[SJA_REG_BaseADD+0x07]
#defineREG_OCRXBYTE[SJA_REG_BaseADD+0x08]
#defineREG_TESTXBYTE[SJA_REG_BaseADD+0x09]
#defineREG_ALCXBYTE[SJA_REG_BaseADD+0x0b]//0a保留
#defineREG_ECCXBYTE[SJA_REG_BaseADD+0x0c]
#defineREG_EMLRXBYTE[SJA_REG_BaseADD+0x0d]
#defineREG_RXERRXBYTE[SJA_REG_BaseADD+0x0e]
#defineREG_TXERRXBYTE[SJA_REG_BaseADD+0x0f]
#defineREG_ACR0XBYTE[SJA_REG_BaseADD+0x10]
#defineREG_ACR1XBYTE[SJA_REG_BaseADD+0x11]
#defineREG_ACR2XBYTE[SJA_REG_BaseADD+0x12]
#defineREG_ACR3XBYTE[SJA_REG_BaseADD+0x13]
#defineREG_AMR0XBYTE[SJA_REG_BaseADD+0x14]
#defineREG_AMR1XBYTE[SJA_REG_BaseADD+0x15]
#defineREG_AMR2XBYTE[SJA_REG_BaseADD+0x16]
#defineREG_AMR3XBYTE[SJA_REG_BaseADD+0x17]
#defineREG_RxBuffer0XBYTE[SJA_REG_BaseADD+0x10]
#defineREG_RxBuffer1XBYTE[SJA_REG_BaseADD+0x11]
#defineREG_RxBuffer2XBYTE[SJA_REG_BaseADD+0x12]
#defineREG_RxBuffer3XBYTE[SJA_REG_BaseADD+0x13]
#defineREG_RxBuffer4XBYTE[SJA_REG_BaseADD+0x14]
#defineREG_TxBuffer0XBYTE[SJA_REG_BaseADD+0x10]
#defineREG_TxBuffer1XBYTE[SJA_REG_BaseADD+0x11]
#defineREG_TxBuffer2XBYTE[SJA_REG_BaseADD+0x12]
#defineREG_TxBuffer3XBYTE[SJA_REG_BaseADD+0x13]
#defineREG_TxBuffer4XBYTE[SJA_REG_BaseADD+0x14]
#defineREG_DataBuffer1XBYTE[SJA_REG_BaseADD+0x15]
#defineREG_DataBuffer2XBYTE[SJA_REG_BaseADD+0x16]
#defineREG_DataBuffer3XBYTE[SJA_REG_BaseADD+0x17]
#defineREG_DataBuffer4XBYTE[SJA_REG_BaseADD+0x18]
#defineREG_DataBuffer5XBYTE[SJA_REG_BaseADD+0x19]
#defineREG_DataBuffer6XBYTE[SJA_REG_BaseADD+0x1a]
#defineREG_DataBuffer7XBYTE[SJA_REG_BaseADD+0x1b]
#defineREG_DataBuffer8XBYTE[SJA_REG_BaseADD+0x1c]
#defineREG_RBSAXBYTE[SJA_REG_BaseADD+0x1e]
#defineREG_CDRXBYTE[SJA_REG_BaseADD+0x1f]
#defineREG_Receive_CounterXBYTE[SJA_REG_BaseADD+0x1d]
#defineOK1
#defineFail0
#defineON1
#defineOFF0
#defineTrue1
#defineFalse0
sbitSJARst=P2^6;//复位控制
sbitLED0=P1^0;
sbitLED1=P1^1;
sbitKey0=P1^2;
sbitKey1=P1^3;
sbitKey2=P1^4;
sbitKey3=P1^5;
bitstep_flg;
bitTx_flg;
bitRx_flg;
unsignedcharstep_counter;
unsignedcharTx_counter;
unsignedcharPC_RX_Buffer;
unsignedchartemp_data1;
unsignedcharRx_Buffer[6];
voidMCU_Init(void);
voidSJA_Init(void);
voidsend(unsignedcharS_Data);
voidSerial(void);
voidDelay(unsignedcharDelay_time);
voidstep(void);
*******************************************************
以下为c的主程序
copyrightbyalloy
*******************************************************
#include
#include
#include
#include
#include
main()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CAN 芯片 选型