CAN总线技术学习(二)

sunsc2010 2014-12-27 10:35:54
CAN总线信息以帧的形式传输,每个帧包括多个段:起始位SOF、仲裁段、控制段、数据段、CRC校验、确认位、结束位等,各个段依次串行被传输到总线上。起始位、CRC校验、确认位和结束位由控制器硬件自动生成,软件可以配置仲裁段、控制段和数据段的内容。每个CAN帧最多发送数据段长度为8个字节即64位。
CAN总线协议有两种:CAN2.0A和CAN2.0B协议,CAN2.0A支持帧ID为11位的标准帧,CAN2.0B协议支持帧ID为11位的标准帧和帧ID为29位的扩展帧,如图1和图2所示。

图1 CAN标准帧

图2 CAN扩展帧
下面解释几个CAN总线问题:
位填充:上述图中都提到位填充的问题,即当发送的一帧CAN信息中出现连续5个相同位时,控制器会自动填充一个相反的位进去,控制器接收一帧CAN信息时发现5个相同的位,也会自动把其后的一个翻转位去掉。那么可能我们会问为什么要做这种看似无用的操作呢?因为CAN总线通讯属于异步通讯,虽然通讯双方约定设定相同的波特率通讯,但是每一位(bit)的宽度也不可能绝对相同,多个相同的位累积起来可能出现较大的误差,造成接收信息出错,那么如何解决这个问题呢?CAN协议中规定在位跳转时要做同步补偿,那么这样可以消除多个位累积造成的错误,但是如果CAN帧信息连续出现多个0或1,接收方没办法监测到翻转位,不能做出正确的补偿,可能导致发送方发了10位0,接收方监测出11个0出来的情况出现,所以当发送方连续发送5个0时,要位填充一个1进去,然后再发送下面的位,而接收方接收到5个0后接收到下面的1可以做出相应的同步补偿,同时要丢弃这个填充位。按照CAN协议规定如果在CAN信息中接收到连续6个以上的相同位被认为是错误信息,CAN控制器错误计数加1。
CAN协议:如上图所示,标准帧标识符(帧ID)有11位,扩展帧标识符(帧ID)有29位,CAN2.0B协议也兼容CAN2.0A协议,可以同时识别标准帧和扩展帧。标准帧和扩展帧的区别在于IDE位,IDE为0时表示标准帧,IDE为1时表示扩展帧。
CAN信号:CAN总线使用一对差分信号通讯,即CAN_H和CAN_L,通过识别它们的压差获取0或1的信息,上电后两个信号对地都会有一定的电压,即V_CANH和V_CANL,通过判断V_CANH-V_CANL识别信息,总线信号分为显性(压差为1V以上,也即数字0)和隐性(压差小于0.5V,也即数字1)。一般在没有数据通讯时V_CANH和V_CANL都为2.5V,所以CAN总线默认为没有压差(隐性,数字1),当有起始位SOF(数字0,显性)时每个网络上的节点都能监测到,准备接收信息,如图3所示。

图3 CAN总线电压示意图
逐位仲裁机制:CAN节点发送的信息都会被自己接收并判断。当CAN总线上两个节点同时发送CAN信息时,CAN节点也会比较自己发送的数据和接收的数据是否一致,由于CAN信号有显性(数字0,压差大于1V)和隐性(数据1,压差小于0.5V)两种,当一个节点发送0而另一个节点发送1时,总线表现为显性0,那么发送1的节点监测到后知道发送总线冲突,自动退出发送,所以可以看出,CAN总线信息小的优先级高。通过这种方式可以实现非破坏性逐位仲裁,优先级高的节点正常发送,不受任何影响。
...全文
415 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_20848757 2016-04-08
  • 打赏
  • 举报
回复
讲的太好了,尤其是最后一段! 终于明白了发送 ACK是隐性,接受成功ACK是显性
sunsc2010 2014-12-27
  • 打赏
  • 举报
回复
最近在学习J1939协议,感觉好多都不懂

27,372

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧