说下我的学习过程。刚到公司的时候我根本不知道什么是CAN,甚至连以太网和串口通讯都不懂。领导把USBCAN分析仪拿给我,把铜线短接上,用软件在CAN1窗口点下发送,CAN2窗口马上接收到了发送出来的数据,ok,成功了。这就是CAN通讯。所以第一点,你想学汽车CAN总线,你首先要有个USBCAN分析仪。否则你无法看到CAN总线的原始数据。示波器?需要购买有CAN总线数据分析功能的示波器。
分析仪这东西我看知乎上还是土豪居多。USBCAN分析仪属于舶来品,原产于欧洲,我们国内用的较多的有VN1630A(Vector出品,用CANoe软件),PCAN-USB(PEAK公司出品,国内用量大),Kvaser的USBCAN(瑞典知名公司),USB2CAN(IXXAT公司,德国),NI自己的USBCAN。其特点是昂贵但功能强大,Peak最便宜的无隔离版本也要2000多块,Vector的硬件价格更是极高。作为学生党买不起,何谈学习?接下来说下国产货,ZLG作为知名的嵌入式龙头企业有很多CAN设备卖,但同样的,价格上也是1200-2200人民币不等,小贵。最后是平民价位的CAN分析仪,淘宝和京东都有,200-600元不等,这个价位大家还是可以接受的。在这里不推荐大家购买250元以下的分析仪。很便宜的分析仪大多是USB转串口,再转CAN,这样的分析仪接收高负载数据时会出现丢帧的现象,之后我们也会说下如何自制一台这样的USB转串口转CAN分析仪。别图便宜,看下淘宝销量排行,不要省那100元钱,用不好还要退货,麻烦。总结下,初学CAN,如果有足量科研经费,应该优先采购欧洲设备,毕竟软件功能多,性能好;如囊中羞涩,先买平价国产分析仪接收数据完全可以满足需要。附:USBCAN的百度词条
你说我不喜欢看书,直接上资料?有的。清华PPT和大众PPT是典范,链接在下面。
你说我是搞ARM的,最近公司让我用STM32开发CAN接口设备,下面是初级入门用的材料。
这个是野火和正点原子两家的开发手册,翻到CAN总线那部分,推荐直接使用ST的库函数,先实现功能,有余力再看寄存器,免得走弯路。这手册里面的CAN总线更侧重于开发和使用,基础的东西讲得少。
第三点是实际操作,在实际测试中巩固理论知识。
CAN总线不是空中楼阁。不管你测什么东西的CAN信号都行,重要的是,你要接收到那些宝贵的CAN总线数据。举个例子,你的汽车,你们项目组租的车,你导师的车都行。反正我能想到的最方便的资源就是你身边的车,只要是09年之后的车都带CAN总线。我当时是测我自己的速腾车,但OBD接口的CAN被阉割了,没有数据。后来从汽车之家论坛中发现空调CAN线能引出来,这样才引出了两条宝贵的100K波特率舒适CAN总线,测出了很多数据。
汽车的CAN分为动力CAN和舒适CAN,具体可以看PPT。我测的速腾舒适CAN内容很丰富,车门、尾箱打开还是关闭,安全带,档位,油量,手刹,方向盘转角等等一应俱全,但都是CAN总线源码,你不知道哪个信号是车门信号。这个就叫做逆向破解了。你需要频繁的开关车门来确定车门信号所对应的帧ID和帧数据。你动,它跟着动,你不动,它也不动,那就是它了。
帧信息:四类,标准数据帧(汽油车、电机)、标准远程帧(少见)、扩展数据帧(广大柴油车、部分汽油车)、扩展远程帧(少见)
有童鞋经常会问到CAN2.0A和CAN2.0B是啥,2.0A是标准的意思,帧ID11位,也即0x000-0x7FF。2.0B是扩展的意思,帧ID最高29位,也即0x00000000-0x1FFFFFFF,要注意2.0B已经包含了2.0A,他们俩是包含与被包含的关系。
帧ID是什么?通俗讲是CAN的一种“地址”。CAN有个特点是竞争机制,帧ID越小越有占用总线资源的权利,越会优先发送。举个例子,灯光信号帧ID0x555,发动机温度传感器帧ID0x111,那么当两个信号同时发出时,发动机的信号会优先发送,灯光在后面排队。通常在一个CAN系统中,不同的设备,发出CAN信号的帧ID都是不一样的,或者说,CAN信号的每个帧ID都有一个固定的用途。如果CAN信号的帧ID的用途被确定下来,并在一个文档中得到了解释,那么我们管这个叫CAN总线的应用层协议,或者高层协议。常见的有ISO15765-4,SAEJ1939,CANopen(电机和挖沟机控制器用)。而这个文档在车辆行业中叫DBC文件,它对车辆CAN总线上的每个帧ID及每个帧数据都做了注释。
11位和29位是什么意思呢?现在说下,11位指的是标准帧的帧ID范围是0x000-0x7FF(0x是十六进制的意思),7FF翻译成二进制是11111111111,对吧,十一个“1”。同理,29位指扩展帧的帧ID范围是0x00000000-0x1FFFFFFF,1FFFFFFF翻译成二进制是29个1。大致明白了吧。29位的分配ID能力比11位的强,11位总有些地方不够之感。
帧数据很简单了,说下特色吧。与串口相比,CAN的帧数据只有8个字节,即64个位,不会再多了。当然,CANFD作为新型总线解决了仅有8字节这个问题。有兴趣大家可以了解下CANFD。
波特率忘了,CAN的波特率都是整数,要注意。常见的车辆波特率有500K,250K,125K,100K。波特率这东西和收音机频率一样,如果两个CAN设备的通信波特率不一致的话,是不能进行通讯的。
终端电阻,CAN和RS485一样,要在终端减少差分信号的反射。我记得最经典的一张图是这么画的,水流在试管(平躺)的尾部受阻,水也就涌了回来。差分信号也是如此,你不在两个终端加电阻,信号会反弹回来影响通讯。详细的看书吧,不细讲了。这东西总线上要有两个,两个120欧姆的电阻,并联,最远的两端一边一个。多了不行少了也不行。你不确定的话,用万用表量一下,CANH和CANL之间60欧姆左右最好。
第四点,你需要找一个高层协议来进行CAN数据与实际含义对号入座。比如ISO15765-4协议和SAEJ1939协议,看文档,明白CAN总线是如何在某个帧ID中传递转速等模拟量,传递灯光信号等数字量。
举个例子,J1939柴油车协议中,0x18F00402这个帧ID表示EEC1,它的第四个和第五个帧数据,假如是0x02,0x03,那么发动机转速如何表示呢,转速=2x0.125+3x32=96.25,这个就是真实的发动机转速值。它是有公式在里面的,这个事情是在协议中规定好的。用第四个帧的十进制数据乘以0.125,再加上第五个帧的十进制数据乘以32,你就得到了实际的发动机转速。对CAN总线协议的理解就说到这里。知道帧ID和帧数据的意思,你就可以对复杂的CAN总线16进制数据了如指掌。
我们再看一个例子,上图是大众某畅销车的数据解析结果,帧ID为0x390的标准数据帧,第三个帧数据如果为0x40说明左前车门关闭,如果为0x41说明左前车门打开。这个有什么意义呢?如果我们做一款中控车机,我们知道有一个功能叫车辆状态读取,如果车门未关但车辆已开始行驶,车机需要知道左前门目前的状态,通过什么呢?就是CAN总线。车机会读取CAN总线的信息,得知车体的门信息、安全带信息、手刹信息等,通过语音模块给予驾驶员必要的提醒。话说我有时真的会忘记放手刹,真的很感谢德赛西威的车机及时提醒我。
很多上了年纪的工程师,经常甩给我一个某某车厂零部件的通信协议,说:”我发什么数据给它,它才能动作啊?车厂的人只给了我这个通信协议,我也看不懂。”其实通信协议上面写明了帧ID和帧数据意思,按图索骥,你就可以发一条CAN数据,启动汽车的某个部件,很神奇。
学CAN总线还是需要用项目来背书的,如果你软件方面牛,可以用第三方的CAN分析仪当硬件,自己开发上位机软件,开发一些有特殊功能的软件,我国目前缺少诊断、数据分析、协议分析等方面的软件,尤其是汽车方面,绝大多数为英文的,需要从国外购买。我能想到的有电动车充电管理系统,车辆信息读取软件,CANBootloader软件等。我日常接触的比较常见的软件有BMS电池管理系统、消防信号管理系统、伺服电机管理系统什么的。CAN不算是新鲜货,主要的应用领域集中在汽车、BMS、电机控制等几个方向内。
想要学习汽车CAN总线,首先要了解汽车CAN总线概述、汽车误撞诊断协议的发展、基于UDS的ISO15765协议等这些关于CAN总线的前世今生。
汽车诊断协议的发展
其他的控制单元工作原理同发动机系统类似,车身上的这些控制单元并不是独立工作,而是作为汽车这样一个整体,它需要信息的共享,因此存在一个信息传递的过程。CAN总线就是把以前一线一用的专线制改成一线多用制,这样可以大大减少汽车上电线的数量,也可以简化整个汽车的布线。在形成OBD-II标准之前,各厂商的汽车诊断座均不相同。比如奔驰为38帧,美洲车12帧,欧宝为10帧,丰田为17帧,宝马为20帧,本田为3帧,澳大利亚西亚款6脚等。
由于各厂商汽车诊断座与诊断协议差别巨大,导致汽车发生故障时其类型难以判定。因此,SAE(美国机动车工程师学会)制定了OBD-II标准,实行标准检测程序,并且具有严格的排放针对性,用于实时监测汽车尾气排放情况。
在CAN总线形成标准协议前,欧洲和大部分亚洲汽车采用ISO9141协议,美国通用汽车(GM)使用SAEJ1850VPW通讯协议电路,福特(FORD)汽车则采用SAEJ1850PWM通讯协议电路。可以看出此前以KWP2000协议居多,KWP2000协议最初是基于K线的诊断协议,但由于K线的物理层和数据链路层在网络管理和通讯数据上的局限性,K线逐渐无法满足日益复杂的车载诊断网络的需求。而CAN总线由于其非破坏性的网络仲裁机制、较高的通讯数据和灵活可靠的通讯方式,在车载网络广受青睐,绝大多数车场目前都是采用CAN总线的方式。所以基于K线的KWP2000物理层和数据链路层的协议逐步被基于CAN线的KWP2000协议,也就是ISO15765协议所取代。
K线与CAN总线的比较
K线通信速率较慢,最大达10.4Kbit/s。此前有一款老款的宝马车是115200bit/s的波特率,但是这种非常罕见。CAN线通信速率可达到1Mbit/s,其中以500Kbit/s和250Kbit/s为主。在传输方面,K线采用单线传输的方式,以字节为单位进行传输,CAN线则以差分信号传输的方式,以CAN帧为单位进行传输。在出错处理中,K线必须要由开发者,如tester,ECU等来完成相应的仲裁处理。而CAN线在物理层面具有完善的通信错误处理机制和总线仲裁机制。报文长度方面,K线最大255个字节,CAN线则是4096字节(指数据域)。
物理层基于K线
KWP2000协议的数据结构由帧头、数据字节和校验和三部分组成。帧头包括起始字节、原码、目的地址和帧长。数据字节包括SourceID与有效字节,共255个字节,最后是累加校验和。这三部分就组成了一帧的数据进行通讯。
物理层基于CAN线
基于CAN线的OSI分层结构,其增强型的诊断是基于ISO14229-1协议与ISO15765-3协议。而它的排放标准与K线相同,都是基于ISO15031-5协议。
ISO15765协议
简介
CAN总线最初并不是用于功能开发,而是一种串行的通讯方式,它有着很高的安全等级。特性:
汽车CAN总线网络拓扑结构
报文传输
报文的传输中帧格式分为11位识别符的标准帧与29位识别符的扩展帧。帧类型则分为数据帧、远程帧、错误帧和过载帧,这里主要讨论数据帧。
报文滤波的作用是通过设置硬件的滤波器从而过滤不需要被接受的CAN报文。汽车上的节点非常多,但对于每个节点来讲并不是需要所有的数据。比如在ABS系统并不需要掌握发动机的参数信息,此时就可以通过设置滤波器而过滤掉这些数据,起到滤波器的作用。
数据帧由七个不同的位场组成:帧起始(StartofFrame)、仲裁场(ArbitrationFrame)、控制场(ControlFrame)、数据场(DataFrame)、CRC场(CRCFrame)、应答场(ACKFrame)、帧结尾(EndofFrame)。仲裁帧可以用来区分该帧是11位的标准帧还是29位的扩展帧,以及是数据帧还是远程帧。
基于UDS的CAN总线ISO15765协议
Networklayerprotocoldataunits
网络层的ISO15765协议最多可以发送或接收4096个字节。
从上图中可以看到PDU有四组数据类型,分别是单帧的SFN_PDU,首帧的FFN_PDU,连续帧的CFN_PDU和流体控制帧的FCN_PDU。
单帧第一个字节的高四位是0,低四位表示帧长,即这一帧有几个字节的有效数据。
首帧第一个字节的高四位是1,第一个字节低四位与第二个字节一同组成帧长,所以最大的是4095个字节。
连续帧第一个字节的高四位是2,SN表示计数器。
CAN的UDS
基于CAN的UDS,就是基于ISO14229-1协议。从下图中可以看到ISO14229-1协议有不同的ServiceId,可以支持不同的服务需求。
比如10表示可进行DiagnoisticSessionControl操作,11表示可以对ECU进行Reset操作,27表示可进行SecurityAccess操作等等。
此外还有一些sub-function,不同的sub-function支持不同的功能。比如说SecurityAccess由两帧组成,假设01表示是访问seed,获取种子,在获取到种子之后发送,获取到解析的种子协议再返还回去才能够安全访问。
22表示读取数据信息,23表示可进行MemoryByAddress操作,19是读取故障码信息,14是清除故障码信息,还可以对ECU进行上传、下传数据等各种操作。
ISO15031-5协议
基于排放标准的OBD协议,排放标准是ISO15031协议共有七个章节,每个章节定义不同的内容,主要是以第五章为主。
排放标准的ISO15031-5协议共有九个服务,不同的服务有不同的功能,在下图均都描述。
我们以Service$01:RequestCurrentPowertrainDiagnosticdata(请求动力系当前数据)来解析ISO15031-5协议。
每一个PID表示一个传感器,也可以说表示一个数据流,数据流既有状态值,也有数据值。但并不是所有的车都支持所有的PID。首先访问00,如果ECU得到的数据用bit的形式来表示,如果是1表示支持当前的PID,0则表示不支持当前的PID。
在获取支持有效PID后,就可以访问实际的PID值,每一次可以访问六个PID。
上图表示00组可以支持01—20组的PID,20可以支持21—40组的PID,以此类推。
上图表示发送0100后ECU的回复。回复41+40,01+40或41表示当前请求动力系当前数据,00表示访问PID获取有效的PID。可以看到第一个字节BF是1011111,即当前ECU支持PID的数据为01及03—08,这7个PID数据,以下类似。
在获取到有效的PID后,我们需要进一步读取当前PID的实际内容,每次最多可以读取六个PID值。15表示Bank1–Sensor2,01表示当前的故障灯状态及故障码数量;05表示冷却液温度等等,如上图所示。
回复值的顺序与初始发送的数据并不一定相同,但是会先发送PID的组号,再补充PID当前组号的实际内容。通过上图可以知道,41表示请求动力帧回复;05表示冷却液温度;61表示冷却液温度的实际值,其他类似。
上图为Mode01中PID的一部分。第一列表示PID的序号,后面有不同数据流内容的描述。比如第一个是前文提到的故障码状态与故障码数量,PID2表示冻结的故障码,第三个是Fuelsystemstatus。12表示发动机转速,对于转速的最小值、最大值、单位、公式都有具体的规定。
汽车诊断协议的获取通常有三种方式获取骑车诊断协议:
原厂诊断仪:日产Consult诊断仪、丰田GTS诊断仪、本田HDS诊断仪、大众5053/5054诊断仪等。
综合诊断仪厂家:元征、金奔腾、朗仁、道通AUTEL、BOSCH等。
汽车诊断仪破解过程:
Step1:
利用第3方工具采集实车诊断数据;
Step2:
编写汽车模拟程序,即模拟汽车ECU和汽车诊断工序进行通讯;