CAN通信
CAN是一种多主异步串行通信协议,核心设计目标是让网络上的多个节点在严苛环境下也能可靠通信。它的精妙之处在于,用“显性/隐性”电平配合独特的无损仲裁机制,解决了多节点同时发送时的冲突问题。
核心机制:显性与仲裁
要理解CAN,先要理解它的物理层逻辑:
- 显性:逻辑0,被主动驱动到电压。显性位”覆盖“隐性位。
- 隐性:逻辑1,通过电阻拉回。总线空闲时就是隐性状态。
无损仲裁正是基于这个特性:但当多个节点同时发送时,它们逐位比较标识符(ID)。只要某个节点发送隐性位却从总线上读到显性位,它就明白自己ID的优先级较低,立即退出仲裁,转为接收模式。意味着ID数值越小,优先级越高,仲裁过程不会破环任何数据。
数据帧结构
一个标准的CAN数据帧(以jydmCAN为例)由以下部分组成:
- 帧起始:1位显性位,通知总线传输开始。
- 仲裁场:包含11位标识符(标准格式)或29位(扩展格式),决定优先级,也用于接收方过滤报文。
- 控制场:包含DLC(数据长度码),指明数据场有几个字节(经典CAN为0-8字节)。
- 数据场:实际负载,经典CAN最多8字节。
- CRC场:15位校验序列,用于检错。
- ACK场:发送方隐性位,任何正确接收的节点会拉低为显性位,以此告知发送成功。
- 帧结束(EOF):7位隐性序列。
此外,CAN还定义了远程帧(请求数据)和错误帧等帧类型。
进化:CAN FD与CAN XL
经典CNA受限于1Mbps速率和8字节负载,于是演进版本应运而生:
- CAN FD(灵活数据速率):允许仲裁段保持低速兼容,但数据段速率提升至最高5Mbps(理论可达8-10Mbps),负载扩充到64字节。它还改进了CRC算法,提升了错误检测能力。
- CAN XL:进一步将速率提升至10Mbps以上,负载上限高达2048字节,旨在填补CAN与车载以太网之间的空白。
硬件与物理层
一个 CAN 节点通常由 CAN 控制器(负责协议)和 CAN 收发器(负责差分驱动)组成。
- 差分信号:使用 CAN_H 和 CAN_L 两根线传输,抗干扰能力强。
- 终端电阻:总线两端需各接一个 120 Ω 电阻,以消除信号反射。
- 电平标准:ISO 11898(高速 CAN)是主流标准,显性状态时 CAN_H 和 CAN_L 电压差约 2V,隐性时电压差接近 0V。
CAN vs UART
与你之前了解的 UART 相比,CAN 的差异非常明显:
- 拓扑:UART 是点对点;CAN 是总线型,可挂载多个节点。
- 寻址:UART 靠物理连线区分;CAN 靠报文 ID,ID 还兼具优先级和过滤功能。
- 冲突处理:UART 无法处理同时发送;CAN 通过仲裁无损解决冲突。
- 可靠性:CAN 有 CRC、ACK、位填充等多重机制,可靠性远超 UART,专为噪声环境设计。
安全性考量
值得注意的是,CAN 设计之初侧重于可靠性而非安全性。由于报文是广播的,且缺乏加密和认证,容易受到注入、重放、模仿等攻击。在现代汽车或工控系统中,通常需要在应用层添加安全协议来弥补这一短板。
CAN 的核心魅力在于用简单的电平逻辑,通过硬件层面实现了实时、可靠的优先级调度,非常适合汽车电子、工业自动化等对实时性和抗干扰要求极高的场景。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 CCの日记!
评论