CAN数据传输
数据传输
CAN总线传输的是CAN帧。CAN的通信帧分为五种:数据帧,远程帧,错误帧,过载帧和帧间隔
线与机制
在学习CAN数据传输前,先了解一下CAN总线的线与机制。
只要总线空闲,总线上的任何节点都可以发送报文,如果有两个以及两个以上的节点开始传送报文,那么会存在总线访问冲突的可能,CAN使用标识符的逐位仲裁(线与机制)解决了这个问题
需要知道:隐性电平对应逻辑1,显性电平逻辑0。MSB先传输。
当单节点(收发器)传输数据为 logic 1 时,节点的开关打开,即节点信号为高电平;当单节点传输数据为 logic 0 时,节点的开关闭合,即节点信号被拉低
收发器连接总线,当节点A发送 logic 0,节点B发送 logic 1,总线 = (logic 0) & logic 1
,即总线电平为0,隐性电平会被显性电平覆盖,这就是线与机制。
假设节点A传送的id为0x10123456
,节点B传送的id为0x14123456
,节点C传送的id为0x18123456
三个节点都向总线发送数据,收发器在发送数据的同时监听总线的电平,对报文进行仲裁
-
判断ID31-28,三个节点都相同
-
判断ID27,节点C为隐性电平,则节点C停止发送报文,变为监听模式
-
判断ID26,节点B为隐性电平,则节点B停止发送报文,变为监听模式
-
节点A获得总线的优先发送权
总线的电平 = 节点A & 节点B & 节点C
,即总线上的id最后是0x10123456
,即通过线与机制,解决了总线冲突的可能。
所以,在CAN总线中,标识符(id)越小,优先级越高。
节点A发送完毕,各个节点发现总线的电平是连续11位的隐性电平,则判断总线空闲,如果还是多个节点同时进行数据传送,再进行仲裁。
数据帧
数据帧是使用最多的帧,帧组成如下
数据帧构成:
-
帧起始:表示数据帧开始的段,由1位显性电平表示帧起始
-
仲裁段:表示帧优先级段
-
控制段:DLC表示传输数据的字节数,有效值为0-8
-
数据段:数据的内容,一帧发送0~8个字节的数据
-
CRC段:检查帧的传输错误的段
-
ACK段:表示确认正常接收的段,接收器确认之前,总线上的ACK是2bit的隐性位(发送单元发送的),接收器正确地接收到报文,在ACK槽发送显性位
-
帧结束:表示数据帧结束,7个隐性位组成帧结束的标志,如果出现显性位则会出现填充错误
名词:
-
PTR:标识是否是远程帧(0:数据帧,1:远程帧)
-
IDE:标识符选择位(0:标准标识符,1:扩展标识符)
-
SRR:代替标准帧的远程请求位,为隐性位
-
r0,r1:保留位,必须为显性位
仲裁段
当两个节点同时向网络上传送信息时,标识符优先级高的优先传送,具体的参考上面的线与机制
-
数据帧根据仲裁段长度不同分为标准帧(11位)和扩展帧(29位),即标识符。
-
帧ID(标识符)越小,优先级越高,标准帧优先级高于扩展帧。
一般外发数据涉及到标识符的仲裁,接收数据涉到收发器对标识符的过滤
数据段
数据段传送的内容是报文解析中的帧数据,一个数据帧传送的数据量为8个字节,MSB先传输
CRC段
-
CRC的值计算范围包括:帧起始、仲裁段、控制端、数据段
-
CRC界定符为隐性位
详见CRC校验