0.先明确CAN 只有两层且只有两根线物理层电压、线、收发器TJA1050数据链路层协议层CAN 采用差分信号传输两根线分别叫CAN_H高电平线和CAN_L低电平线通过两根线的电压差来表示逻辑 0 和 1总线状态CAN_H 对地电压CAN_L 对地电压两根线压差对应逻辑隐性空闲约 2.5V约 2.5V≈ 0V逻辑 1显性发数据约 3.5V约 1.5V≈ 2V逻辑 0CAN 总线是线与逻辑显性电平逻辑 0只要有任意一个节点拉低总线就是 0隐性电平逻辑 1所有节点都不拉总线才是 11.通信开始帧起始 SOF空闲时总线一直是隐性1此时任何节点想发送数据首先要发送一位显性0所有节点一看到总线从 1 → 0就知道有设备要发一帧数据了准备接收。2.最核心仲裁段IDE标准帧(11位ID) / 扩展帧(29位ID)仲裁段的作用为了区分当多个设备节点同时开始发送数据时到底听谁的每个节点都有属于自己的优先级ID“ID 越小优先级越高”多个节点同时开始发进入逐位仲裁每个节点一边发一边监听总线上的实际电平节点想发1但总线是0→ 说明别人发了优先级更高的帧 → 自己立即停止发送转为接收想发 0总线也是 0 → 继续发这个比较过程是由每个 节点CAN 控制器硬件自己完成的总结发 1 却读到 0 → 自己输了退出发 0 永远不会输→ 所以ID 里 0 越多优先级越高→ID 数值越小优先级越高3. 控制段告诉大家这一帧有多少数据DLC数据长度码0~8告诉所有节点接下来我要发 N 个字节的数据。4. 数据段真正的信息就是接下来要发的N个字节的数据08 字节5. CRC 段校验是否传错发送节点计算 CRC发到总线上。所有接收节点自己也算一遍 CRC。如果不一样 → 判定错误后面会触发错误帧。6. ACK 段有没有人收到发送节点先发送隐性 1任何一个节点正确收到就拉成显性 0发送节点检测到总线是 0 → 知道“至少有一个节点收到了”注意CAN 不指定发给谁只要有人收到就算成功。它是广播不是点对点。7. 帧结束 EOF发送 7 个连续隐性位 1表示一帧结束。总线回到空闲状态。完整流程大致如下节点A想发帧检测总线空闲 → 发 SOF0进入仲裁可能和节点B同时发逐位比较 ID → A获胜B退出A发控制段DLC3A发 3 字节数据A发 CRCA在 ACK 槽发 1节点C收到正确 → 拉成 0A看到 0 → 知道发送成功A发 EOF → 一帧完成