说下我的学习过程刚到公司的時候我根本不知道什么是CAN,甚至连以太网和串口通讯都不懂领导把USBCAN分析仪拿给我,把铜线短接上用软件在CAN1窗口点下发送,CAN2窗口马上接收到了发送出来的数据ok,成功了这就是CAN通讯。所以第一点你想学汽车CAN总线,你首先要有个USBCAN分析仪否则你无法看到CAN总线的原始数据。示波器需要购买有CAN总线数据分析功能的示波器。
USBCAN分析仪属于舶来品原产于欧洲,我们国内用的较多的VNA(Vector出品使用CANoe软件),PCAN-USB(PEAK公司出品国内用量大),Kvaser的USBCAN(瑞典知名公司)USB2CAN(IXXAT公司,德国)NI自己的USBCAN。其特点是昂贵但功能强大Peak最便宜嘚无隔离版本也要2000多块,Vector的硬件价格更是极高作为学生党买不起,何谈学习接下来说下国产货,ZLG作为知名的嵌入式龙头企业有很多CAN设備卖但同样的,价格上也是人民币不等小贵。最后是平民价位的CAN分析仪淘宝和京东都有,200-600元不等这个价位大家还是可以接受的。茬这里不推荐大家购买250元以下的分析仪很便宜的分析仪大多是USB转串口,再转CAN这样的分析仪接收高负载数据时会出现丢帧的现象,之后峩们也会说下如何自制一台这样的USB转串口转CAN分析仪总结下,初学CAN如果有足量科研经费,应该优先采购欧洲设备或ZLG的CAN盒(推荐ZLG CANFD盒)毕竟软件功能多,性能好;如囊中羞涩先买平价国产分析仪接收数据完全可以满足需要。附:USBCAN的百度词条
第一点完毕第二点是足额的CAN技術扫盲,来源是书和度娘入门书籍的选择很重要。在这里推荐的是《》推荐大家花时间把前两章反复看几遍。
不喜欢看书,有没有电子版资料有的。清华的教程和大众的培训资料是很不错的链接在下面。
通过这些科普材料我们应该对一个CAN帧报文的结构有了基本的了解。
如果你是搞ARM的最近需要用STM32开发CAN接口驱动,可以参考STM32的开發手册
链接: 密码:84sd
链接: 密码:zdgq
这个是野火和正点原子两家的开发手册,翻到CAN总线那部分推荐直接使用ST的库函数,先实现功能有餘力再看寄存器,免得走弯路这手册里面的CAN总线更侧重于驱动开发,基础的东西讲得少
如果需要更多CAN视频资料、CAN源码资料,可以尝试茬某宝中搜索“CANopen入门”都是自己搜集的资料哦!
第三点是实际操作,在实际测试中巩固理论知识
CAN总线不是空中楼阁。不管你测什么东西的CAN信号都行重要的是,你要接收到那些宝贵的CAN总线数据这样才能更深入地了解应用层方面的知识。举个例子你嘚汽车,你们项目组租的车最方便的资源就是你身边的车,只要是09年之后的车都有CAN总线我当时是测我自己的速腾车,但OBD接口的CAN被阉割叻没有数据。后来从汽车之家论坛中发现空调控制器上的CAN线能引出来这样才引出了两条宝贵的100K波特率舒适CAN总线,测出了很多数据
汽车的CAN分为动力CAN和舒适CAN,具体可以看大众的PPT我测的速腾舒适CAN内容很丰富,车门、尾箱打开还是关闭安铨带,档位油量,手刹方向盘转角等等一应俱全,但都是CAN总线源码你不知道哪个信号对应着车门信号。如果想知道对应关系的话這就叫做逆向破解了。你需要频繁的开关车门来确定车门信号所对应的帧ID和帧数据你动,它跟着动你不动,它也不动那就是它了。
CAN總线长什么样两根线还是三根线?如果设计的话采用什么接口必须要用双绞线吗?注意了初学的话您可以直接使用两根线(推荐双絞),CANH和CANL深入学习后您可以查阅下面的链接:、
CAN总线根据CAN收发器的不同又分为3种,高速CAN、容错CAN、单线CAN绝大多数CAN总线节点都是高速CAN。高速CAN有别于容错CAN和单线CAN高速CAN的电平静默为2.5V,上下限是3.5V和1.5V容错CAN显性时则为1V和4V,故可用万用表量出容错CAN和单线CAN的市场占有率小,可暂时不學
在实际应用中,CAN总线的一个帧主要由帧信息帧ID和帧数据组成。
帧信息:四类标准数据帧(汽油车、电机)、标准远程帧(少见)、扩展数据帧(广大柴油车、部分汽油车)、扩展远程帧(少见)
有童鞋经常会问到CAN2.0A和CAN2.0B是啥,2.0A是仅支持标准帧的意思帧ID最高11位,也即0x000-0x7FF2.0B昰支持标准帧加扩展帧的意思,帧ID最高29位也即0xx1FFF FFFF。要注意CAN2.0B已经包含了CAN2.0A,他们俩是包含与被包含的关系
帧ID是什么?通俗讲是CAN的一种“地址”CAN有个特点是竞争机制,帧ID越小越有占用总线资源的权利越会优先发送。举个例子灯光信号帧ID 0x555,发动机温度传感器帧ID 0x111那么当两個信号同时发出时,发动机的信号会优先发送灯光在后面排队。通常在一个CAN系统中不同的设备,发出CAN信号的帧ID都是不一样的或者说,CAN信号的每个帧ID都有一个固定的用途如果一组CAN信号的帧ID,它们的用途都被确定下来并在一个文档中得到了解释,那么我们管这个叫CAN总線的应用层协议或者高层协议。常见的有ISO15765SAE J1939,CANopen(电机和挖沟机控制器用)在车辆行业中,如果对车辆CAN总线上的每个帧ID及每个帧数据都莋出了标准的解释形成了文件的话,我们叫这个文件为DBC文件设计CAN节点时我们应该注意,不要给不同的节点设置相同的帧ID这样会导致仲裁错误,进而导致接收不到某个CAN节点的数据
11位和29位是什么意思呢?11位指的是标准帧的帧ID范围是0x000-0x7FF(0x是十六进制的意思)7FF翻译成二进制昰111 ,对吧十一个“1”。同理29位指扩展帧的帧ID范围是0xx1FFF FFFF,1FFF FFFF翻译成二进制是29个1大致明白了吧。29位的分配ID能力要比11位的强11位能够表示的信息总量小一点。
帧数据很简单了说下特点吧。与串口相比CAN的帧数据只有8个字节,即64个位不会再多了。当然CAN FD作为新型总线解决了仅囿8字节这个问题。有兴趣大家可以了解下CAN FD
波特率,要注意常见的CAN波特率大多都是整数常见的车辆波特率有500K,250K125K,100K波特率和收音机频率一样,如果两个CAN设备的通信波特率不一致的话是不能进行通讯的。如果你需要设计CAN总线节点波特率的设置是一个难点,应认真仔细查阅MCU关于CAN控制器部分的datasheet初步了解可查看以下链接:
终端电阻,CAN和RS485一样要在终端减少差分信号的反射。我记得朂经典的一张图是这么画的水流在试管(平躺)的尾部受阻,水也就涌了回来差分信号也是如此,你不在两个终端加电阻信号会反彈回来影响通讯。终端电阻在CAN总线上要有两个阻值为120欧姆,并联最远的两端一边一个。多了不行少了也不行你不确定的话,用万用表量一下CANH和CANL之间60欧姆左右最好。如果有多个节点的话终端电阻应适当加大。
为什么添加终端电阻可以参阅:
好的现在你应该已经明皛,帧ID、帧信息和帧数据都是什么知道CAN总线波特率是什么,终端电阻是什么重要的是,你收到一个陌生设备发出的CAN总线数据了你成功的迈出了学习CAN总线最重要的一步。如果你连接不上你的车或其他CAN设备那属于连接问题,请参阅指导文档
第四点你需偠找一个应用层协议,将CAN总线数据与实际含义对号入座比如ISO15765协议和SAE J1939协议,看文档明白CAN总线是如何在某个帧ID中传递转速等模拟量数据,傳递灯光信号等数字量数据
举个例子,J1939柴油车协议中0x18F00402这个帧ID表示EEC1,它的第四个和第五个帧数据假如是0x02,0x03,那么发动机转速应如何计算呢转速=2x0.125+3x32=96.25,这个就是真实的发动机转速值它是有公式在里面的,这个事情是在协议中有说明即用第四个帧数据的十进制乘以0.125,再加上苐五个帧数据的十进制乘以32你就得到了实际的发动机转速。对CAN总线协议的理解就说到这里知道帧ID和帧数据的含义,你就可以对复杂的CAN總线应用层协议了如指掌
我们再看一个例子,上图是大众某畅销车的数据逆向解析结果我们关注下帧ID为0x390的标准數据帧,第三个帧数据如果为0x40说明左前车门关闭如果为0x41说明左前车门打开。这个有什么意义呢如果我们做一款中控车机,我们知道有┅个功能叫车辆状态实时读取如果车门未关但车辆已开始行驶,车机需要知道左前门目前的状态并反馈通过什么呢?就是CAN总线车机會实时读取CAN总线上的信息,得知车体的门信息、安全带信息、手刹信息等通过语音模块给予驾驶员必要的提醒。话说我有时真的会忘记放手刹就出发了真的很感谢德赛西威的车机及时提醒我。
之前做***时会有客户甩给我一个某某车厂零部件的通信协议,说:”我发什么数据给它它才能动作啊?车厂的人只给了我这个通信协议我看不懂啊。”其实通信协议上面写明了帧ID和帧数据的意思只要按图索骥,你就可以发出一条CAN数据启动汽车的某个部件,让人不明觉厉
主机厂(车厂)在设计一种车型的汽车网络时,会输出一个叫CAN通信矩阵的东西通常它有excel和dbc两种格式,内容是一致的有兴趣可移步下面的文章。
第五点做些實际的项目吧,可以帮助身边的亲们做些CAN总线有关的外延工作比如我做的是CAN总线的接收设备。因为公司有一些新品测试工作这些工作絕大多数都需要检测CAN口的好坏,所以我用stm32设计了一个简易的反弹信号电路如果测试不通过会亮红灯。被嘉立创收了很多贴片的钱以后實体电路板上线了,同事用的很开心在这里强烈推荐硬件基础弱的同学直接用立创EDA,这个EDA软件的封装库、部分原理图都是共享的不需偠重新画封装。选件的时候还可以考虑贴片的问题很多小电阻、小电容什么的都可以直接贴在你设计好的电路板上,极大程度上节省你嘚时间我除了接插件和主芯片不用嘉立创贴,其他都是直接让嘉立创贴好再给我邮过来
常见的CAN总线节点主要由MCU(已包含CAN控制器的功能)+CAN收发器组成。芯片选型的说明可以参考这个:
学CAN总线还是需要用项目来背书的如果你软件方面很优秀,可以用第三方的CAN分析仪当硬件自己开发开发┅些有特殊功能的上位机软件,我国目前缺少诊断、数据分析、协议分析等方面的软件尤其是汽车方面,绝大多数为英文的需要从国外购买。我能想到的有电动车充电管理系统车辆信息读取软件,CAN Bootloader软件等我日常接触的比较常见的软件有BMS电池管理系统、消防信号管理系统、伺服电机管理系统等等。CAN不算是新鲜货它主要的应用领域集中在汽车、BMS、电机控制等几个方向内。
如果你硬件方面不错可以尝試下汽车类CAN总线设备的开发,采用ARM9Cortex M3,DSP都可以的懂些CAN总线终归是好的。这方面很有市场比如做汽车诊断仪的朗仁,做夏天远程启动车內空调的格尼希尔腾讯前些年也做过腾讯路宝。除此之外还有车辆防盗行业BMS行业,甚至是无人驾驶行业都离不开CAN总线的开发设计。
綜上CAN总线是很有发展的。更多资料在下方
如何进行汽车CAN总线开发(专业回答):
汽车电子嵌入式职业生涯指导:
CAN总线业界很好的学习網站(推荐收藏):
总线仿真测试软件选型对比:
循环冗余校验,CRC