60 秒回答模板

CAN 仲裁是靠物理层的显性和隐性状态实现的。逻辑 0 通常是 dominant,逻辑 1 是 recessive;总线上只要有任意节点发送 dominant,最终总线就是 dominant,只有所有节点都释放成 recessive 时总线才是 recessive。多个节点同时开始发送时,会在标识符字段逐位发送并同时读取总线。如果某个节点发送 recessive 但读到 dominant,说明另一个节点发送了更高优先级的 0,它就立即停止发送并转为接收;而发送 dominant 的节点不会被破坏,所以获胜帧继续完整发送。因为 ID 越小,越早出现 0,所以优先级越高。电路上收发器把控制器的逻辑状态转换成差分线上的 dominant/recessive 电平,配合终端电阻和总线空闲偏置实现共享线与。

考点 位级仲裁
难度 真实面经题
回答目标 说明自己能把 CAN 的位仲裁算法和差分物理层电气状态联系起来。

深入解析

01

显性/隐性是线与模型

显性位能覆盖隐性位,隐性更像释放总线。这个电气规则让多个节点同时驱动时不会产生随机结果,而是确定地表现为 dominant 优先。

02

仲裁发生在标识符字段

节点发帧开头时同步发送 ID,并持续比较自己发出的位和读回的总线位。只要发送 recessive 却读到 dominant,就说明自己优先级低,退出仲裁。

03

无破坏来自失败者退出

失败节点退出后不再驱动后续位,获胜节点从头到尾发送的位没有被改变,因此总线无需重发仲裁失败造成的半截帧。

04

物理层要支持共享驱动

收发器、双绞差分线、终端电阻和电平阈值共同保证 dominant/recessive 可被所有节点一致识别。线缆、终端或收发器异常会直接破坏仲裁可靠性。

易错点

  • 把仲裁说成软件比较优先级,不讲节点边发边读。
  • 说高 ID 优先,忽略 dominant 0 覆盖 recessive 1 的规则。
  • 认为两个节点同时发会碰撞并破坏双方帧。
  • 不提物理收发器和差分总线如何表达显性/隐性。

面试官追问

仲裁失败算错误吗?

不算协议错误。失败节点只是丢失本次总线使用权,会等待总线空闲后重新发送。

为什么数据字段不能继续仲裁?

仲裁只在标识符等仲裁字段进行,获胜后只有一个节点发送数据字段;如果数据阶段出现冲突就是错误条件而不是正常仲裁。

如果板子上通信不稳定,你会怎么定位?

先用示波器或逻辑分析仪确认电平、时序、速率和帧格式,再对照驱动日志、错误码、重试次数和协议状态机,区分硬件连接、配置参数、总线仲裁和软件缓冲问题。