CAN 与 CAN FD 协议介绍
CAN总线就像是一群朋友之间的聊天群,每个朋友都可以在群里说话,而且这个群在嘈杂的环境下也能听得清谁在说话。这个聊天群最初是为了让汽车里的各种电子设备能够互相交流而设计的,但现在它也被用在了很多其他的地方,比如工厂和飞机上。
CAN 采用差分信号来提供高水平的电噪声抗扰度。它在不使用主机的情况下相互通信,并以低成本和最少的布线在电噪声环境中提供快速可靠的数据传输。
CAN总线有两个主要的聊天规则版本,就像两个不同的聊天表情集:
- CAN 2.0A:这个版本的表情集比较小,每个表情(标识符)只有 11 个表情符号(具有 11 位标识符的标准格式)。
- CAN 2.0B:这个版本的表情集更大,每个表情可以有 29 个表情符号(具有 29 位标识符的扩展格式)。
国际标准化组织(ISO)后来也制定了一套全球通用的聊天规则,也就是 ISO 11898,这套规则分为三个部分:
- ISO 11898-1:规定了大家如何在群里聊天(数据链路层)。
- ISO 11898-2:规定了大家聊天的速度可以有多快,最高可以达到 1 Mbit/s(高速 CAN 的物理层)。
- ISO 11898-3:规定了在嘈杂环境下大家如何聊天,速度最高可以达到 125 kbit/s(低速、容错 CAN 的物理层)。
后来,博世公司又推出了一个新版本的聊天规则,叫做 CAN FD,这个规则允许大家在群里发更长的信息,而且在决定谁先说话后(仲裁),还可以选择用更快的速度聊天。这个新规则(CAN FD )和旧规则(CAN 2.0 )是兼容的,所以新旧设备可以在同一个群里聊天。
1. 接线
在CAN总线上,很多设备都可以连接进来,从复杂的电脑(电子控制单元)到简单的开关(输入输出设备)。每个设备都像群里的一个成员(节点)。
每个成员都用两条差分线来聊天:CAN High 和 CAN Low
2. 信号
CAN 是差分信号,CAN Low 是 CAN High 的反信号。查看两者之间的差异可以消除信号在传输过程中遇到的任何共模干扰。
在聊天时,有两种状态:
- 显性(Dominant)——相当于聊天中的“嘿!”(逻辑0)
- 隐性(Recessive)——相当于聊天中的“嗯哼?”(逻辑1)
当大家在聊“嗯哼?”时,聊天群不会主动去推动聊天,电压会保持在大约2.5V。
当大家在聊“嘿!”时,CAN HIGH 会被驱动到5V(或Vcc),CAN LOW会被驱动到0V。
3. 仲裁
在群里聊天时,每个人都会被分配一个独特的聊天表情(标识符),这个表情决定了谁先说。如果两个人同时想说话,那么拥有最小表情(标识符)的人会先说。
CAN 数据以帧的形式发送,帧以显性 0 开头,后跟标识符,这构成了两个或多个节点尝试同时传输的仲裁(优先级)的基础。
每个节点都分配有一个长度为 11 位 (CAN 2.0A) 或 29 位 (CAN 2.0B) 的标识符。
该表显示了三个尝试同时传输的节点,每个节点都以显性 0 开头。当节点发送隐性 1 但发现总线保持显性 0 时,它意识到存在争用并停止发送并等待下一次发送机会。
通过这种方式,具有最低 ID 值的节点赢得仲裁并被优先传输帧的其余部分。
4. 帧
CAN 有四种帧类型:
- 数据帧:就是大家实际聊天的内容 ( 包含用于传输的节点数据的帧。)。
- 远程帧:就是有人请求别人发某个特定表情( 请求传输特定标识符的帧)。
- 错误帧:就是有人发现聊天中出现了错误 ( 由任何检测到错误的节点发送的帧 )。
- 超载帧:就是告诉大家,先别聊了,等会儿再继续 ( 在数据和/或远程帧之间注入延迟的帧 )。
RTR位(远程传输请求)就像是决定是发一个实际的表情(确定数据帧 0)还是请求别人发一个表情(远程帧 1)。
CAN网络可以配置为使用两种不同的帧格式:基础帧格式(CAN 2.0A和CAN 2.0B),支持11位标识符,以及扩展帧格式(仅CAN 2.0B),通过允许添加18位标识符扩展来支持29位标识符。
标识符扩展位(IDE)决定了是否使用18 位 ID 扩展。
数据长度码表示数据的字节长度;在这个例子中是 1 字节。
CRC 代表循环冗余校验,用于错误检测。
Ack 位——所有接收到帧且没有发现错误的节点都会传输显性 0 ,覆盖发送器发送的隐性 1。如果发送器检测到隐性 1,它就知道帧没有被正确接收。
帧的结束通过传输 7 个隐性 1 来确认。
5. 比特填充
为了保证聊天时有足够的变化,让大家都能跟上,如果连续出现了五个一样的聊天表情,就会插入一个不同的表情。但在某些特定的聊天部分,比如检查错误(CRC)的时候,不会插入新的表情。
为了确保有足够的转换以保持同步,在五个连续同极性的比特后插入一个相反极性的比特。在CRC分隔符、ACK字段和帧尾期间不进行比特填充。
在使用比特填充的字段中,六个连续的同类型比特(000000或111111)被认为是一个错误,当检测到错误时,节点可以传输一个由六个连续显性比特组成的活动错误标志。
6. CAN FD
CAN FD 是 CAN 的一个升级版,它允许大家发更长的信息,而且在决定谁先说话后,还可以选择用更快的速度聊天。这个新规则和旧规则是兼容的,所以新旧设备可以在同一个群里聊天。
CAN FD 满足了大家在复杂系统中更快传输更多信息的需求。
关于 CAN FD 的具体信息,你可以在 CSS Electronics 的文章CAN FD explained – a simple intro (2020)中找到。
7. CAN 和 CAN FD之间的协议差异
CAN FD 帧的结构
仲裁以及基本和扩展帧格式的使用在经典 CAN 和 CAN FD 中是相同的。
CAN FD的结构和CAN差不多,但是有一些小变化:
- CAN FD 不使用远程帧,所以 RTR 位被 RRS 位取代,总是显示为“嘿!”(该位始终为显性传输 (0))。
- IDE位的使用方式和以前一样。
- 原来的 保留位 现在变成了 FDF位,如果这个位是“嘿!”(显性 0),那么聊天用的是经典 CAN 的格式;如果是“嗯哼?”(隐性 1),那么聊天用的是 CAN FD 的格式。
- BRS 位(比特率切换)决定聊天的速度是否改变。如果 BRS 位是“嘿!”(显性 0),那么聊天速度不变;如果是“嗯哼?”(隐性 0),那么聊天速度会变快,直到并包括 CRC 定界符。
- ESI 位(错误状态指示)在发现错误时显示为“嘿!”(显性 0),如果没有错误则显示为“嗯哼?”(隐性 1)。
8. 数据长度码
数据字段中的字节数由数据长度码(DLC)指示。在 CAN 和 CAN FD中 编码不同。前九个代码相同,但随后的代码,在 CAN 中都指定数据字段为 8 个字节 DATA FIELD, 在CAN FD 中指定更长的 DATA FIELD。
8.1. CAN FD CRC字段
因由于 CAN FD 的数据长度更长,因此需要更多的 bit 进行CRC校验。如果帧包含 16 字节或更少,使用 17 位 CRC;如果 CAN 帧包含超过 16 字节,则使用 21 位 CRC。
在 CRC 字段之后,Ack 和帧尾结构与经典 CAN 相同。
9. debug
想象一下,你的车里有很多电子设备,它们都通过一个叫做CAN总线的“聊天群”来互相交流。如果这个群里太忙了,比如大家都在同一时间说话,就可能会产生混乱,就像在嘈杂的市场中听不清别人说什么一样。错误可能因电感器、线圈和电源设备而发生,这些设备可能引起大的电压尖峰、噪声和振铃。
随着越来越多的设备加入这个聊天群,总线的“聊天时间”变得越来越少。如果这个聊天群的忙碌程度超过了40%,那么就会出现错误,就像一个拥挤的派对,大家都在说话,结果谁也听不清谁。
为了监视和找出 CAN 总线上的错误,我们需要很好的示波器,它能够捕捉到一个大的时间窗口,记录下多个数据帧。然后,这个工具可以处理整个捕获的波形,并且可以放大来分析数据包。
我们建议使用带宽是CAN波特率十倍的示波器,这样可以分析电压变化的速度(上升时间)和任何故障情况。这就像用一个高速相机拍摄快速移动的物体,然后慢慢回放,以便看清每一个细节。
示波器采集 CAN Low 和 CAN High 之间的信号差,可以获得最佳结果。
10. 引用
https://www.picotech.com/library/knowledge-bases/oscilloscopes/can-bus-serial-protocol-decoding