-
CAN总线的启源
CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议。此后,CAN 通过ISO11898 及ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。最高1Mbps(距离小于40M),最远可达10KM(速率低于5Kbps)。 -
CAN总线的构成
CAN总线由CAN_H和CAN_L两根数据双绞线组成,同时,两个数据线之间接120Ω的电阻(电缆的特性阻抗120Ω,为了模拟无限远的传输线路),每个个设备分别和CAN_H和CAN_L相连,挂载到CAN总线上进行通信。
CAN总线使用差分电平的方式进行数据交互,当没有数据发送时,两条线的电平一样都为2.5V,称为静电平,也就是隐性电平。当有信号发送时,CAN_H的电平升高1V,即3.5V,CAN_L的电平降低1V,即1.5V。
按照定义的:CAN_H-CAN_L < 0.5V 时候为隐性的,逻辑信号表现为"逻辑1"- 高电平。
CAN_H-CAN_L > 0.9V 时候为显性的,逻辑信号表现为"逻辑0"- 低电平。
CAN总线空闲定义,连续11位的隐形电平,节点发送数前需要先判断总线是否空闲,其他情况都认定为总线忙,有其他节点在发送数据,CAN的帧间隙是连续三个以上的隐形电平。 -
CAN总线的数据交互流程
当总线处于空闲状态时,CAN总线上挂载的节点开始发送自身的数据,每发送一位则会读取一次总线的电平和自身发送的电平比较是否一致,若一致则继续发送,不一致则结束发送转换为接收模式,这个过程就是总线仲裁,总线仲裁用于总线空闲时,多个节点统同一时间开始发送数据。高优先级的节点优先低优先级节点发送数据,高优先级发送完成后低优先级在总线空闲情况下方可占用总线发送数据,若低优先级已经在发送数据,高优先级不能打断低优先级,只能在总线空闲时,才能使用总线。
总线上不同的节点具有不同的优先级标识符,要保证标识符唯一性,优先级标识符在数据的仲裁段中展示,具体实现原理看数据格式。
发送数据过程:
接收数据过程:
-
CAN总线的数据格式
在总线中传送的报文,每帧由7部分组成。CAN协议支持两种报文格式,其唯一的不同是标识符(ID)长度不同,标准格式为11位,扩展格式为29位。
在标准格式中,报文的起始位称为帧起始(SOF),然后是由11位标识符和远程发送请求位(RTR)组成的仲裁场。RTR位标明是数据帧还是请求帧,在请求帧中没有数据字节。
控制场包括标识符扩展位(IDE),指出是标准格式还是扩展格式。它还包括一个保留位 (ro),为将来扩展使用。它的最后四个位用来指明数据场中数据的长度(DLC)。数据场范围为0~8个字节,其后有一个检测数据错误的循环冗余检查(CRC)。
应答场(ACK)包括应答位和应答分隔符。发送站发送的这两位均为隐性电平(逻辑1),这时正确接收报文的接收站发送主控电平(逻辑0)覆盖它。用这种方法,发送站可以保证网络中至少有一个站能正确接收到报文。
报文的尾部由帧结束标出。在相邻的两条报文间有一很短的间隔位,如果这时没有站进行总线存取,总线将处于空闲状态
完整数据结构帧
CAN总线传输的是CAN帧,CAN的通信帧分成五种,分别为数据帧、远程帧、错误帧、过载帧和帧间隔。
数据帧是由:帧起始,仲裁断,控制端,数据段,CRC段,ACK段和帧结束构成,其中根据仲裁段ID码长度的不同,分为标准帧(CAN2.0A)和扩展帧(CAN2.0B)。
帧起始:
帧起始由一个显性位(低电平)组成,其他接收节点同步于该帧起始位。
帧结束:
帧结束由七个连续隐形位组成。
仲裁段:
仲裁段由标准帧由11位构成,扩展帧由29位组成,设置ID时禁止设置高七位连续为隐形电平(禁止设置ID=1111111xxxx)。
当仲裁帧阶段检测到总线电平和自身发送电平不一致,则直接退出总线竞争,显性电平优先级高于隐形电平优先级,帧ID值越小,优先级越高。若在其他段触线电平不一致,则产生错误事件(帧ACK时间段或被动错误标志传输器件除外)。对于同为扩展格式数据帧、标准格式远程帧和扩展格式远程帧的情况同理。
RTR 位用于标识是否是遥控帧(0,数据帧; 1,遥控帧), IDE 位为标识符选择位(0,使用标准标识符; 1,使用扩展标识符), SRR 位为代替远程请求位,为隐性位,它代替了标准帧中的 RTR 位。
控制段:
控制段由6个位构成,代表数据段的字节数。
数据段:
一个数据帧的数据量为0-8个字节,数据量少,使得实时性较高,被干扰的概率小,抗干扰能力强。
CRC段:
使用CRC校验进行数据检错,CRC校验值存放于CRC段
ACK段:
当一个接收节点接收的帧起始到CRC段之间的内容没发生错误时,它将在ACK段发送一个显性电平
其他四种帧详细格式参考文末博客。
远程帧:用于向其他节点请求数据。
错误帧:任何单元检测到总线错误发出错误帧。
过载帧:用于先行和后续的数据帧或者远程帧之间提供附加延时,保证接收端能够来得及处理前面收到的数据,包括过载标志和过载界定符。
帧间隔:用于将数据帧或远程帧和他们之前的帧分开,但过载帧错误帧前面不会插入帧间隔。 -
CAN总线的常规问题
待补充。
参考博客:
1.https://blog.csdn.net/liuligui5200/article/details/79030676
2.https://blog.csdn.net/qq_31710263/article/details/97015748
3.https://www.dzsc.com/data/2009-1-12/75711.html
CAN总线的学习总结
于 2022-02-22 17:29:29 首次发布