CAN 异步通信的技术基石:帧结构与位同步机制
扫描二维码
随时随地手机看文章
CAN 异步通信的实现,依赖于精密设计的 “帧结构” 与 “位同步机制”—— 帧结构界定了数据的组织形式与边界,位同步则解决了分布式时钟偏差导致的采样误差,两者共同构成了 CAN 异步通信的技术核心,确保即使节点时钟存在 ±10% 偏差,仍能准确传输数据。
(一)帧结构:异步通信的 “数据容器”
CAN 总线定义了四种核心帧类型(数据帧、远程帧、错误帧、过载帧),其中数据帧是异步数据传输的核心载体,其结构通过 “固定字段 + 可变字段” 的组合,实现了 “自界定、可校验、易同步” 的设计目标。一个标准 CAN 数据帧(CAN 2.0A)由 7 个字段组成,从帧起始到帧结束,每个字段都承担着异步通信的关键功能:
帧起始(Start of Frame, SOF):1 位显性位(逻辑 0),是异步通信的 “同步触发信号”。由于 CAN 节点无全局时钟,接收方平时处于监听总线的隐性位(逻辑 1)状态,当检测到显性位时,立即启动位同步过程,调整本地采样时钟,确保后续位的采样时机准确。帧起始的显性位是整个帧的 “启动标志”,所有节点通过它实现帧级别的同步。
仲裁场(Arbitration Field):包含 11 位标准 ID(CAN 2.0A)或 29 位扩展 ID(CAN 2.0B),用于 “节点身份标识” 与 “优先级仲裁”。在异步通信中,多节点可能同时发送数据,仲裁场通过 “显性位优先” 规则解决冲突:发送节点逐位比较自身 ID 与总线位 —— 若发送显性位而总线为隐性位,说明存在更高优先级节点(ID 数值越小优先级越高),则立即停止发送,转为接收;若所有位比较一致,则获得总线控制权,继续发送后续字段。这种非破坏性仲裁确保了高优先级数据(如汽车刹车帧 ID=0x001)不会被低优先级数据(如车窗控制帧 ID=0x100)打断,且无需重发已发送的仲裁位,提升了异步通信的实时性。
控制场(Control Field):6 位,包含 2 位 IDE 位(ID 类型标志,0 = 标准 ID,1 = 扩展 ID)与 4 位 DLC 位(数据长度码,0~8 字节)。IDE 位用于区分 ID 类型,确保接收方正确解析后续字段;DLC 位明确数据场的字节数,避免接收方因数据长度未知导致的解析错误 —— 在异步通信中,数据长度不固定,DLC 位为接收方提供了关键的 “数据边界信息”,例如 DLC=2 表示数据场包含 2 字节数据,接收方只需读取 2 字节即可,无需等待停止位。
数据场(Data Field):0~8 字节(CAN 2.0)或 0~64 字节(CAN FD),是异步通信的 “数据载体”。数据场的长度由 DLC 位定义,支持灵活传输不同大小的数据(如传感器的 1 字节状态数据、发动机的 4 字节转速数据)。在异步传输中,数据场无需固定长度,按需分配字节数,既节省总线带宽,又适应不同设备的通信需求。
CRC 场(Cyclic Redundancy Check Field):15 位 CRC 校验码 + 1 位 CRC 界定符(隐性位),用于 “数据完整性校验”。由于异步通信易受电磁干扰(如汽车射频、工业电机噪声)导致数据位翻转,CRC 场通过多项式运算(CAN 协议规定的 CRC-15 多项式)对帧起始至数据场的所有位进行校验,接收方计算的 CRC 值与发送方不一致时,判定为 CRC 错误,立即发送错误帧,触发重发机制,确保数据可靠。
ACK 场(Acknowledgment Field):2 位,包含 1 位 ACK 槽(隐性位)与 1 位 ACK 界定符(隐性位)。在异步通信中,发送方无法直接确认接收方是否收到数据,ACK 场通过 “分布式确认” 解决这一问题:发送方在 ACK 槽发送隐性位,所有正确接收帧的节点(包括非目标节点)在 ACK 槽发送显性位,若发送方检测到 ACK 槽为显性位,说明至少有一个节点正确接收;若为隐性位,则判定为 ACK 错误,触发重发。这种分布式确认无需接收方单独发送确认帧,简化了异步通信的交互流程,提升了效率。
帧结束(End of Frame, EOF):7 位隐性位,是异步通信的 “结束标志”。接收方检测到 7 个连续隐性位时,确认帧传输完成,释放总线资源,准备接收下一帧。帧结束的隐性位序列既避免了与下一帧的帧起始(显性位)混淆,又为节点提供了 “帧间隔” 时间,用于处理已接收数据或准备发送新数据。
除数据帧外,远程帧(用于请求数据)、错误帧(用于报告错误)、过载帧(用于通知节点延迟接收)的结构均围绕 “异步通信” 设计 —— 远程帧无数据场,通过 ID 请求目标节点发送数据;错误帧包含 6 位错误标志(显性位或隐性位)与 8 位错误界定符(隐性位),用于向所有节点广播错误;过载帧与错误帧结构类似,用于在接收方缓冲区满时,通知发送方延迟发送。这些帧类型共同构成了 CAN 异步通信的 “完整协议栈”,覆盖了数据传输、请求、错误处理、流量控制的全流程。
(二)位同步机制:解决分布式时钟偏差的核心
CAN 节点的本地时钟由独立晶振提供,不同节点的时钟频率可能存在偏差(如 ±5%~±10%),若不进行同步,接收方会因采样时机偏移导致数据误判(如将显性位采样为隐性位)。CAN 的 “位同步机制” 通过 “硬同步” 与 “软同步” 结合,动态调整接收方的采样时钟,确保即使在时钟偏差较大的情况下,仍能准确采样每一位数据。
CAN 总线的每一位时间由 “同步段(SYNC_SEG)”、“传播段(PROP_SEG)”、“相位缓冲段 1(PHASE_SEG1)”、“相位缓冲段 2(PHASE_SEG2)” 四个部分组成,总时长为 8~25 个时间量子(TQ,Time Quantum,由节点时钟分频得到,如 8MHz 时钟分频为 8,TQ=1μs):
同步段(SYNC_SEG):1 个 TQ,用于 “硬同步”。接收方检测到总线从隐性位变为显性位(帧起始或仲裁位的电平跳变)时,立即将本地位时钟的同步段与总线跳变对齐,强制调整本地时钟相位,这一过程称为硬同步。硬同步仅在检测到电平跳变时执行,确保帧起始的第一位采样准确。
传播段(PROP_SEG):1~8 个 TQ,用于补偿 “总线传输延迟”。在分布式系统中,总线长度可能达数十米(如汽车总线),信号从发送方传输到接收方存在延迟(如 50 米双绞线的传输延迟约 0.25μs),传播段的时长需覆盖这一延迟,确保接收方在信号稳定后再采样。
相位缓冲段 1(PHASE_SEG1):1~8 个 TQ,用于 “软同步”。接收方在相位缓冲段 1 的末尾(采样点)采样总线电平,若采样时发现总线电平与本地时钟预期电平不一致(如本地时钟认为当前位应为显性位,总线实际为隐性位),则通过 “相位缓冲段调整” 增加 PHASE_SEG1 的时长(最多增加 8 个 TQ),延迟采样点,直到采样到正确电平,这一过程称为软同步。软同步可动态补偿时钟频率偏差,确保后续位的采样准确。
相位缓冲段 2(PHASE_SEG2):1~8 个 TQ,作为 PHASE_SEG1 的补充,确保位时间总时长稳定。若 PHASE_SEG1 因软同步被延长,PHASE_SEG2 会相应缩短,维持位时间不变,避免位频率偏移。
例如,某 CAN 节点的位时间配置为 10TQ(SYNC_SEG=1TQ,PROP_SEG=2TQ,PHASE_SEG1=4TQ,PHASE_SEG2=3TQ),本地时钟为 8MHz(TQ=1μs),位速率为 100kbps(1 位 = 10μs)。当接收方检测到帧起始的显性位跳变时,执行硬同步,将同步段与跳变对齐;在 PHASE_SEG1 末尾(第 7TQ,7μs 时)采样第一位数据,若发现总线电平与预期一致,则正常采样;若不一致(如时钟偏差导致本地时钟快于总线),则延长 PHASE_SEG1 至 6TQ,在第 9TQ(9μs 时)重新采样,确保数据准确。
这种位同步机制使 CAN 总线能在节点时钟偏差 ±10% 的情况下,实现 1Mbps 的最高位速率(CAN 2.0),即使在长距离总线(如 1000 米双绞线,位速率 50kbps)中,仍能保持稳定通信,完全适配分布式异步通信的需求。





