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 高电平 显性 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
- can协议分析-程序员角度
- 从程序员的角度分析微信小程序
- 从程序员的角度分析微信小程序
- 从程序员的角度分析微信小程序
- CAN协议
- 从程序员角度分析2004年数学建模b题
- [原创]从程序员角度分析安徽电信HTTP劫持的无耻行径 – 之深度分析
- CAN总线协议
- CAN协议简介
- CAN通讯协议简介
- can总线通讯协议
- CAN总线协议
- CAN协议测试
- CAN总线协议
- can总线通讯协议
- 熟悉CAN协议
- CAN总线协议详解
- CAN FD协议介绍
- MySQL 命令行工具之 mysqldump 深入研究
- Android Studio操作锦集
- python 注释
- 提供收集到的所有版本gradle文件,最新3.4
- maven 编译报错 java: -source 1.6 中不支持switch 中存在字符串
- can协议分析-程序员角度
- 我所理解的闭包
- caffe训练图片遇到的奇葩问题= =
- Azure Active Directory Application Permission VS Delegate Permission
- 【大数据技巧】Flume采集网站日志到MaxCompute常见问题汇总
- Merge Sorted Array问题及解法
- paramiko SSHClient调用sudo权限和执行多条指令的方法
- maven学习
- 页面控制定时任务