CAN总线基础
尝试一下文字投稿,给大家讲述一下CAN总线吧,如有错误还请大家予以原谅哈。
1.CAN通信的起源
CAN—Controller Area Network—是20世纪80年代初德国Bosch公司为解决现代汽车中众多控制单元、测试仪器之间的实时数据交换而开发的一种串行通信协议。
2.报文类型目前常用的CAN协议是CAN2.0协议,在CAN2.0B的版本协议中有两种不同的帧格式,不同之处为标识符域的长度不同,含有11位标识符的帧称之为标准帧,而含有29位标识符的帧称为扩展帧。如CAN1.2版本协议所描述,两个版本的标准数据帧格式和远程帧格式分别是等效的,而扩展格式是CAN2.0B协议新增加的特性。为使控制器设计相对简单,并不要求执行完全的扩展格式,对于新型控制器而言,必须不加任何限制地支持标准格式。3.报文的通信机制 CAN报文通过电平差分信号发送,由CAN_H(高)与CAN_L(低)组成。其传输线为双绞线,一般总线长度不超过40m,绞线间距不超过20cm。CAN通信通过一种类似于“会议”或者“广播”的机制实现,可见下图:


在实际车载CAN通信过程中,一条CAN网络上将每个控制器作为一个节点,通过双绞线连接在总线上。而在通信的过程中每个节点既可以接受所需报文也可发送报文,其交互过程可以看作是一场“会议”或者“广播”,在会议开始后,每个参会部门可看作为一个节点或者控制器,而参会人员的姓名可看作为报文ID,这个人员发言所说的话也就是报文的信息,而发言顺序就是CAN通信的仲裁,其先后顺序由报文ID的大小决定,越小发言顺序越靠前。比如人事部参会人员0x1、0x2、0x3、0x4四人,其发言顺序也就是0x1、0x2、0x3、0x4。当人员0x1发言的议题设计到财务部时,财务部可看作接受节点来接收0x1所发言的信息,实际上人员0x1所说的话在该会议中的每个部门都能接收到,但是所发言议题不涉及其余部门,所以可以装作“没听见”。
看到这里我想大家应该也有所了解CAN通信的通信机制了吧,就是每个节点都可把所有报文信息发出来,但是谁来接受由其余节点来决定,实质上是一种半双工的通信方式。

接下来就是CAN报文差分信号了,所有的机器其语言根本的都是二进制,所以CAN总线所发的信息也都是由'0'与'1'组成。如下图:

总线上的电平有显性电平和隐性电平两种。总线上执行逻辑上的线“与”时,显性电平的逻辑值“0”,隐性电平为“1”。“显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平。并且,“隐性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。(显性电平比隐性电平更强。)
3.数据帧组成
数据据帧由七种不同的位域(Bit Field)组成:帧起始(Start of )、仲裁域(Arbitration Field)、控制域(Control Field)、数据域(DataField)、CRC域(CRC Field)、应答域(ACK Field)和帧结尾(End of )。数据域的长度可以为0~8个字节,CANFD的数据域的长度可以为0~64个字节。其CAN协议和标准规格如下图:

一般在车载测试中,我们只需要关注仲裁域也就是报文ID与数据域即可。
如下图为J1939协议的帧数据结构:

在写DBC的时候,也只需要写明报文ID与数据域中包含的信息即可,如下图:


在报文解析的时候,一般的关注ID与数据域的信息,如下图:

创作不易,希望各位同行大佬大家多多关注给予鼓励支持。
