记录 BOSCH CAN Specification 2.0 PART B CAN 协议标准学习过程,以备需要时查看;
BOSCH CAN Specification 2.0 文档获取:
http://esd.cs.ucr.edu/webres/can20.pdf
CAN message 定义
1. DATA FRAME 数据帧
DATA FRAME 由 Start of Frame, Arbitration Field, Control Field, Data Field, CRC Field, ACK Field, End of Frame 这几个位域组成;
START OF FRAME(SOF) 帧起始
由一个显性位组成(可以理解为MCU CAN TX pin上的低电平);一个CAN网络上的所有节点根据SOF边沿来实现同步;
ARBITRATION FIELD 仲裁场
总线仲裁的概念
相当于总线上有多个节点在同一时刻控制总线,经过仲裁后,优先级高的节点会实际控制总线;
总线仲裁实现机制
总线上显性电平(可以理解为MCU CAN TX pin上的低电平)比隐性电平具有更高的优先级(可以理解为MCU CAN TX pin上的高电平);
Node 1 输出 | Node 2 输出 | 实际总线状态 |
d(显性)(逻辑0) | d(显性)(逻辑0) | d(显性)(逻辑0) |
d(显性)(逻辑0) | r(隐性)(逻辑1) | d(显性)(逻辑0) |
r(隐性)(逻辑1) | d(显性)(逻辑0) | d(显性)(逻辑0) |
r(隐性)(逻辑1) | r(隐性)(逻辑1) | r(隐性)(逻辑1) |
总线上的每个节点在同一时刻都按照自己的想法拉高或拉低总线,但实际总线的电平状态,类似于线与的效果;CAN总线上的电信号状态,在经过CAN transceiver 后,由一对查分信号CANH/CANL 来表示,CANH/CANL 间存在压差表示为显性,CANH/CANL间无压差表示为隐性;
仲裁场的格式
对于标准帧(Standard Frame)和扩展帧(Extended Frame), 仲裁场的格式不同
标准帧(Standard Frame)的数据帧格式
扩展帧(Extended Frame)的数据帧格式
对于标准帧,仲裁场由11 bit 的ID 域和 1 bit RTR 控制位组成;
对于扩展帧,其仲裁场相比于标准帧,ID 在标准帧11 bit 的基础上增加了18 bit,扩展到 29 bit;另外多了两个控制位SRR 和IDE;
IDENTIFIER Field
ID 域可以理解为每个数据帧的独有的名字;
在标准帧中,ID域为11 bit;
在扩展帧中,ID由11 bit 的base ID 和 18 bit 的扩展ID组成;11 bit 的base ID 和标准帧中的ID一样,按照 ID28 - ID18 的顺序在总线上传输,最低位为ID18, 且高7位 ID28 - ID22 不能全是隐性电平;18 bit 的扩展ID 在总线上按照 ID17 - ID0 的顺序传输;
按照显性电平优先级高于隐性电平的规则,ID越小的数据帧,具有越高的优先级
RTR(Remote Transmission Request)
远程传输请求控制位,在数据帧中RTR为显性,在远程帧中RTR为隐性;所以ID相同时,数据帧的优先级高于远程帧;
SRR(Substitute Remote Request)
扩展帧中,用SRR位来代替标准帧中的RTR位;CAN协议规定,在扩展帧中,SRR位为隐性;
IDE(Identifier Extension Bit)
在标准帧中,IDE属于控制场(Control Field),在扩展帧中,IDE属于仲裁场;并且,CAN协议规定,在标准帧中,IDE为显性,在扩展帧中,IDE为隐性;
结合SRR,IDE位的特性,可以知道相同base ID 的标准帧和扩展帧同时在总线上传输数据时,标准帧具有更高的有限级;
小结
ID越小优先级越高;
数据帧优先级高于远程中;
base ID相同的数据帧,标准帧优先级高于扩展帧;
CONTROL FIELD 控制场
对于标准帧,控制场由 1 bit IDE控制位,1 bit r0 保留位,和 4 bit DLC(数据长度)位组成;
对于扩展帧,控制场由 2 bit r1/r0 保留位,和 4 bit DLC(数据长度)位组成;
DLC(Data Length Code) 决定后面数据场中传输数据的字节数;其中d表示显性电平(逻辑0),r表示隐性电平(逻辑1)
DATA FIELD 数据场
数据场为要在总线上传输的数据,字节数由DLC决定,每个字节8 bit,MSB先传输;
CRC FIELD 校验场
CRC 场由 CRC序列 和CRC 界定符两部分组成
CRC 序列由15 个 bit 组成,CRC计算的输入为从 SOF 到 DATA FIELD数据场的所有bit(除了位填充的bit外);
使用的生成多项式为:
CRC界定符由 1 个bit 的隐性位组成;
ACK FIELD 应答场
应答场由ACK Slot 和ACK 界定符组成;
对于应答场,发送节点会发送2 个 bit 的隐性电平;接收节点在成功接收到一帧数据后,会在应答场将ACK Slot 设置为显性电平;总线上的所有节点都会在成功接收数据后,将ACK Slot 拉为显性电平;总线上有多个节点时,相当于只要有一个节点成功接收了这一帧数据,发送节点都会认为发送已成功;
ACK 界定符为1 bit 的隐性电平;
2. ERROR FRAME 错误帧
在数据传输发生错误时,CAN网络上的节点会向总线发送错误帧;错误帧由Error Flag 和 Error 界定符两部分组成;
根据发生错误时节点自身状态的不同,节点发送的Error Flag 不一样;
可以先简单的理解节点的错误状态有3 种:
- Error Active:一个节点健康时所处的状态
- Error Passive:节点已经有所不适
- Bus Off:节点出了严重问题,不能再参与总线活动
处于Error Active 状态的节点出现错误时,发送的Error Flag 为 6 个 bit 连续的显性位;处于Error Passive 状态的节点出现错误时,发送的Error Flag 为 6 个 bit 连续的隐性位(除非被其他节点发送的显性位拉至显性)
Active Error Flag 不符合从SOF 到CRC 界定符定义的位填充规则,或者会破坏ACK 场或END OF FRAME 的格式,导致其他节点也检测到错误,从而也发出Active Error Flag,因此,Active Error Flag 的长度为6 个bit 到 12 个bit;
Error 界定符包含 8 个bit 隐性位;
3. INTERFRAME SPACING 帧间空间
总线进行信号传输时,数据帧和远程帧需要和上一帧间保留帧间空间;错误帧及过载帧无需和上一帧保留帧间空间;
帧间空间由两个场组成, Intermission 和Bus Idle;
Intermission 由3个 bit 的隐性位组成;在Intermission 的第3 个bit 检测到显性位会认为是START OF FRAME;
Bus Idle 为总线的空闲时间,其长度是任意的,总线保持隐性电平状态;检测到显性电平即表示START OF FRAME;
对于之前发送过数据且处于Error Passive 状态的节点,其帧间空间加入Suspend Transmission 域;Suspend Transmission 为8 个bit 的隐性位;如果期间其他节点有发送数据,则这个Error Passive 的节点要变为接收节点,等其他节点发送完数据再尝试发送;
4. OVERLOAD FRAME 过载帧
触发过载帧发送的条件有3个:
接收节点自身处理上一帧数据需要时间,节点控制往总线上发送过载帧
检测到帧间隔Intermission域的第一个bit 和第二个bit 均为显性电平
在错误帧界定符 Error Delimiter 或过载帧界定符 Overload Delimiter的第八个bit 检测到显性位,此时会触发过载帧的发送,同时错误计数器不会增加
过载帧由 Overload Flag 和 Overload Delimiter 两个域组成;
Overload Flag 由6 个bit 显性位组成;Overload Flag 的格式破坏了帧间隔Intermission 的传输,然后其他节点也会检测到总线过载而发送Overload Flag; Overload Delimiter 由8 个bit 隐性位组成
5. REMOTE FRAME 远程帧(忽略)
6. CAN总线上一帧数据的传输时间
由1到5节一帧数据各个位域的说明可以知道,
传输一帧数据场为8byte数据的标准数据帧,需要111个位时间;假设总线波特率为500kbit/s,则这一帧数据的传输时间为222us;
传输一帧数据场为8byte数据的扩展数据帧,需要131个位时间;假设总线波特率为500kbit/s,则这一帧数据的传输时间为262us;
可以得到如下一帧数据的传输时间
一帧数据传输时间 | 500kbit/s | 1Mbit/s |
数据场为8byte数据的标准数据帧 | 222us | 111us |
数据场为8byte数据的扩展数据帧 | 262us | 131us |
数据场为n byte数据的标准数据帧 | (47 + 8n)* 2us | (47 + 8n)us |
数据场为n byte数据的扩展数据帧 | (67 + 8n)* 2us | (67 + 8n)us |
或一段时间内总线可以传输的数据帧的个数
2ms内总线传输帧数 | 500kbit/s | 1Mbit/s |
数据场为8byte数据的标准数据帧 | 9 | 18 |
数据场为8byte数据的扩展数据帧 | 7 | 15 |
数据场为n byte数据的标准数据帧 | Floor(1000 /(47 + 8n)) | Floor(2000 /(47 + 8n)) |
数据场为n byte数据的扩展数据帧 | Floor(1000 /(67 + 8n)) | Floor(2000 /(67 + 8n)) |