真实面经题目 · 原创解析
CAN 总线仲裁机制如何通过物理层显性/隐性状态实现?
这题考 CAN 仲裁与物理层的关系,回答要说明显性位覆盖隐性位,节点边发边读,发送隐性却读到显性即仲裁失败。
真实面经题目 · 原创解析
这题考 CAN 仲裁与物理层的关系,回答要说明显性位覆盖隐性位,节点边发边读,发送隐性却读到显性即仲裁失败。
CAN 仲裁是靠物理层的显性和隐性状态实现的。逻辑 0 通常是 dominant,逻辑 1 是 recessive;总线上只要有任意节点发送 dominant,最终总线就是 dominant,只有所有节点都释放成 recessive 时总线才是 recessive。多个节点同时开始发送时,会在标识符字段逐位发送并同时读取总线。如果某个节点发送 recessive 但读到 dominant,说明另一个节点发送了更高优先级的 0,它就立即停止发送并转为接收;而发送 dominant 的节点不会被破坏,所以获胜帧继续完整发送。因为 ID 越小,越早出现 0,所以优先级越高。电路上收发器把控制器的逻辑状态转换成差分线上的 dominant/recessive 电平,配合终端电阻和总线空闲偏置实现共享线与。
显性位能覆盖隐性位,隐性更像释放总线。这个电气规则让多个节点同时驱动时不会产生随机结果,而是确定地表现为 dominant 优先。
节点发帧开头时同步发送 ID,并持续比较自己发出的位和读回的总线位。只要发送 recessive 却读到 dominant,就说明自己优先级低,退出仲裁。
失败节点退出后不再驱动后续位,获胜节点从头到尾发送的位没有被改变,因此总线无需重发仲裁失败造成的半截帧。
收发器、双绞差分线、终端电阻和电平阈值共同保证 dominant/recessive 可被所有节点一致识别。线缆、终端或收发器异常会直接破坏仲裁可靠性。
不算协议错误。失败节点只是丢失本次总线使用权,会等待总线空闲后重新发送。
仲裁只在标识符等仲裁字段进行,获胜后只有一个节点发送数据字段;如果数据阶段出现冲突就是错误条件而不是正常仲裁。
先用示波器或逻辑分析仪确认电平、时序、速率和帧格式,再对照驱动日志、错误码、重试次数和协议状态机,区分硬件连接、配置参数、总线仲裁和软件缓冲问题。