上图展示了一个典型的CAN总线网络拓扑结构。CAN通信设备之间通过差分信号(CANH,CANL)进行数据传输。
- 每个节点均具备主动发送报文的能力。
- 每个节点也都能接收到总线上其他节点发送的报文。
- CAN总线具备仲裁机制,能够决定哪个报文优先传输。其依据是报文ID的大小。若同一时刻有多个节点试图发送报文,ID值较小的报文拥有更高的优先级,将优先获得总线使用权并完成发送。
- 终端处通常接入120欧姆的电阻,其主要目的是实现阻抗匹配,以减少信号反射,这属于物理层电路设计知识。
- CAN通信的传统标准最大速率为1Mbps。目前,CAN-FD(灵活数据速率)协议已能实现最高10Mbps的传输速率。
- CAN协议主要有CAN 1.0、CAN 2.0A和CAN 2.0B三个版本。它们都支持标准帧ID(11位),而CAN 2.0B版本额外支持扩展帧ID(29位)。理解这些底层网络拓扑和报文收发机制,是深入学习工业通信协议的基础,相关内容也可以在 网络/系统 板块找到更多拓展知识。
上图阐述了CAN节点进行报文收发的典型硬件架构。微控制器(MCU)内部集成了CAN控制器外设,该外设的TX(发送)和RX(接收)引脚与独立的CAN收发器(驱动芯片)相连。收发器的核心作用是实现控制器单端信号与总线差分信号之间的转换。
CAN控制器内部包含一系列功能寄存器。通过对这些寄存器进行配置,并读写相应的数据寄存器,即可实现报文的发送与接收。
发送流程:用户将待发送报文的数据写入CAN控制器的发送缓冲区寄存器,随后控制器通过TX引脚将报文序列发送至CAN收发器,最终由收发器将信号以差分形式驱动到CAN总线上。
接收流程:CAN收发器从总线上接收到差分信号,将其转换为单端信号后,通过RX引脚传送给CAN控制器。控制器将接收到的数据存入接收缓冲区寄存器,用户通过读取这些寄存器即可获取报文内容。
注:部分高集成度的MCU已内部集成了CAN收发器,因此无需外接独立的驱动芯片。
在一个允许所有节点主动发送报文的CAN网络中,当报文被发送到总线后,网络上的所有节点都能接收到。那么,如何确保报文能被正确的目标节点识别和处理呢?
- 每个CAN节点可以配置一个或多个CAN-ID(标识符)。
- 节点可以通过CAN控制器硬件自带的过滤寄存器对ID进行筛选(如只接收特定ID的报文),也可以设置为接收所有ID,然后在软件层面进行过滤。
举例说明:假设节点1的ID为10、12;节点2的ID为21、23、26;节点3的ID为36。
- 若节点1发送一个ID为21的报文,节点2和节点3的控制器都会从物理上接收到这个报文。但在进行ID匹配时,只有节点2配置的ID列表中包含21,因此节点2的硬件会将该报文接收并存入缓冲区,供其软件解析。节点3则因ID不匹配而忽略此报文。
- 为什么一个节点需要多个ID?这是为了区分不同报文的功能或数据源。即便每个节点只使用一个ID,通信也能实现,但需要在应用层对报文内容做更复杂的解析。
- 例如,节点2可以约定:ID 21 代表来自节点1的温度数据,ID 23 代表来自节点3的温度数据。
- 这样,当节点1要向节点2发送温度时,就使用ID 21。节点2收到ID 21的报文时,无需分析报文内容即可知数据来源为节点1。
- 同理,节点3向节点2发送温度则使用ID 23。这种通过配置寄存器实现ID过滤的模式,在嵌入式系统开发中十分常见,是 运维/DevOps 与硬件结合的重要实践。
核心概念:CAN-ID是一个逻辑标识符。报文在总线上传输时,所有节点在物理层面都能“听到”,但只有那些“关心”这个ID(即在其接收过滤列表内)的节点才会真正接收并解析它。在实际的CAN网络(如基于CanOpen的应用)设计中,会预先规划好每个节点使用的ID及其对应的具体功能,使得每个CAN-ID都明确代表一项特定的信息或命令。
|