can协议分析-程序员角度

来源:互联网 发布:定做app软件 编辑:程序博客网 时间:2024/06/06 06:58

最近学习can协议,站在程序员的角度写了一篇文章,分享给大家

值0   高电平  显性 dominant
值1  低电平   隐性 recessive
显性遇到隐性时显性胜出,后面冲突仲裁时有用。

有2种帧
标准帧(IDE为0,也叫基础帧) 和 扩展帧(IDE为1)


SOF     开始位,它一定是0 (显性,高电平)
帧ID     长度为11位或者29位
IDE       0 标准帧,帧id长度11位, 1扩展帧,帧id长度29位   IDENTIFIER EXTENSION FLAG
RTR     Remote Transmission Request Bit  
             0  数据帧    1 远程帧   所谓远程帧,就是数据长度为0,不含有数据域的帧
R0        预留,值恒为0
DLC     Data Length Code  数据长度
             4位,有效值 0 ~ 8,表示有多少字节的数据
Data     存放数据,其长度 DLC*8.   例如 DLC=7, 数据位长度为 56  (7*8)
CRC    15位长度的CRC校验码
CRC Delimiter   CRC分隔符,1位长度,值固定为1


ACK       发生方给1,接受方接收无误后该位填0,有误填1
ACK De  ACK分隔符,1位长度,值固定为1


EOF        7位连续的1,表明帧结束啦



      


远程帧 RTR 为1  没有数据域
数据帧 RTR 为0    有数据域


R0        预留,值恒为0 (显性,高电平)
SRR  Subsitute Remote Request 替代远程请求位。固定为1(隐性,低电平)         
 为什么把原先标准帧 RTR 搞成这个,且必须是隐性的? 方便冲突仲裁,让标准帧优先,详见下面 冲突仲裁







冲突仲裁
当有多个帧一起出现在线路上时,采取显性优先的规则。仲裁失败的设备停止发送,等线路空闲的时重发。


例如                                        sof     帧id
设备a,发送数据帧 帧id 0x11   0     000 0001 0001
设备b,发送数据帧 帧id 0x10   0     000 0001 0000
它们同时发送
前11位都是相同的 00000001000,第12位,设备a发送1,设备b发送0
0显性优先,设备b胜出,可以继续发送。设备a中断发送,等线路空闲后重发。


例2                        sof     帧id         RTR
设备a,发送数据帧  帧id 0x11      0     000 0001 0001  0
设备b,发送远程帧  帧id 0x11      0     000 0001 0001  1
它们同时发送
直到第13位时 有了冲突,a是数据帧嘛,所以 RTR位 发送0   b发送1
0显性优先,设备a胜出,可以继续发送。设备b中断发送,等线路空闲后重发。


例3
设备a,发送数据帧  帧id 0x444 
设备b,发送数据帧  帧id 0x11121181
设备a 发送的帧
sof    帧id          RTR
0     100 0100 0100   0
     0x4     4        4


设备b 发送的帧 
sof    帧id(11位)       SRR    IDE     帧ID扩展(18位)
0     1 0001 0001 00     1      1      10 0001 0001 1000 0001
    0x1      1         1                             2        1        1        8        1




                          a的RTR  b的SRR
于是                                   
a发送 010001000100 0
b发送 010001000100 1 1100001000110000001
                                        
                                这一位冲突
a胜出
前11位id相同的标准帧 和 扩展帧,标准帧总能胜出。SRR 固定为1就是被设计出来给 标准让路的 :)


因此
标准帧id越小,优先级越高
id相同的数据帧优先于远程帧
id前11位相同的标准帧优先于扩展帧。扩展帧 SRR IDE都是隐性的,而标准帧相同位置对应的是 RTR R0,就算是远程标准帧RTR为1了,R0固定为1。还是可以和扩展帧仲裁时胜出


0 0
原创粉丝点击