can帧结构:深入解析控制器局域网数据帧的构成
控制器局域网(CAN)是一种被广泛应用于汽车、工业自动化、医疗设备等领域的高效串行通信总线。其核心在于其独特的can帧结构,正是这种精巧的设计,赋予了CAN总线卓越的可靠性、抗干扰能力以及非破坏性位仲裁特性。本文将作为一份详尽的指南,带您深入剖析CAN数据帧的每一个组成部分,理解其工作原理及重要性。
理解CAN协议的基础:CAN帧结构的重要性
CAN协议之所以能够成为行业标准,很大程度上归功于其定义明确且功能强大的帧结构。一个设计良好的can帧结构不仅确保了数据传输的完整性,还实现了总线访问的有效仲裁,即使在多个节点同时发送数据时也能避免冲突,保证最高优先级的数据能够优先传输。此外,强大的错误检测和恢复机制也内置于帧结构中,确保了通信的可靠性。
CAN帧的四大基本类型
在CAN协议中,主要定义了四种不同类型的帧,它们各有其特定的用途,共同构成了CAN通信的完整生态系统:
数据帧(Data Frame)
这是最常见的CAN帧类型,用于传输实际的数据。它包含发起通信的节点的标识符(用于仲裁)、控制信息、实际数据、错误校验码和应答位。
遥控帧(Remote Frame)
遥控帧用于请求其他CAN节点发送具有特定标识符的数据帧。它与数据帧结构相似,但不包含数据场。
错误帧(Error Frame)
当任一节点检测到总线上的错误时,它会发送一个错误帧来通知所有其他节点,使得当前正在进行的传输被终止,并重新开始。
过载帧(Overload Frame)
过载帧用于通知总线上的其他节点,发送当前帧的节点处于过载状态,无法接收更多数据。这通常发生在节点缓冲区溢出等情况下。
在上述四种帧类型中,数据帧无疑是核心,也是我们深入理解can帧结构的重点。
深入解析数据帧(Data Frame)的构成
CAN数据帧可以分为两种格式:标准格式(CAN 2.0A)和扩展格式(CAN 2.0B)。它们的主要区别在于标识符的长度。下面我们将逐一剖析数据帧的各个组成部分:
1. 帧起始(SOF - Start of Frame)
长度:1位显性位(Dominant)
帧起始位标志着数据帧的开始,所有节点都必须同步到这个位。它是一个显性位(逻辑0),用于在空闲总线上通知所有节点新的数据传输即将开始,并帮助实现节点的同步。
2. 仲裁场(Arbitration Field)
仲裁场是CAN协议中实现非破坏性位仲裁的关键。它包含帧的标识符(Identifier)和远程传输请求(RTR)位,决定了帧在总线上的优先级。
标准格式(Standard Format - CAN 2.0A/B)
- 11位标识符(Identifier)
这是帧的核心识别码,值越小,优先级越高。在仲裁过程中,当多个节点同时发送数据时,标识符位值低的帧将获得总线的控制权。
- RTR位(Remote Transmission Request)
长度:1位。数据帧中,RTR位必须为显性位(Dominant,逻辑0)。如果RTR位为隐性位(Recessive,逻辑1),则表示这是一个遥控帧。
扩展格式(Extended Format - CAN 2.0B)
扩展格式的can帧结构提供了更长的标识符,以满足更复杂的应用需求。
- 29位标识符(Identifier)
由11位基本标识符、SRR位、IDE位和18位扩展标识符组成。同样,标识符值越小,优先级越高。
- SRR位(Substitute Remote Request)
长度:1位。在扩展格式的数据帧中,SRR位必须为隐性位(Recessive,逻辑1)。它用于区分标准格式和扩展格式,确保在总线上同时存在两种格式帧时能正确仲裁。
- IDE位(Identifier Extension)
长度:1位。在扩展格式的数据帧中,IDE位必须为隐性位(Recessive,逻辑1)。它明确指示当前帧是扩展格式。
- RTR位(Remote Transmission Request)
长度:1位。与标准格式类似,数据帧中为显性位(Dominant,逻辑0)。
3. 控制场(Control Field)
控制场包含用于定义数据场长度的信息。
- r0位(Reserved Bit)
长度:1位。为保留位,通常发送为显性位(Dominant,逻辑0),接收时可忽略。
- DLC位(Data Length Code)
长度:4位。表示数据场中字节的实际数量,范围从0到8。例如,DLC为0000b表示没有数据(0字节),而1000b表示有8字节数据。
4. 数据场(Data Field)
长度:0到8字节
这是can帧结构中承载实际数据负载的部分。根据DLC位的指示,数据场可以包含0到8个字节的数据。CAN协议并未定义数据本身的含义,这由应用层协议决定。
5. CRC场(CRC Field)
循环冗余校验(CRC)是CAN协议中强大的错误检测机制。
- 15位CRC序列(CRC Sequence)
由发送节点根据帧起始到数据场的全部内容计算得出的校验码。接收节点会执行相同的计算,并与收到的CRC序列进行比较,以检测传输错误。
- CRC界定符(CRC Delimiter)
长度:1位隐性位(Recessive)。紧随CRC序列之后,用于分隔CRC场和ACK场。
6. ACK场(ACK Field)
应答场用于确认数据是否被至少一个正确接收的节点收到。
- ACK槽(ACK Slot)
长度:1位。发送节点在ACK槽发送一个隐性位。如果一个或多个接收节点成功接收了帧且未检测到错误,它们会在ACK槽发送一个显性位,从而覆盖发送节点的隐性位。发送节点检测到这个显性位就知道数据已被应答。
- ACK界定符(ACK Delimiter)
长度:1位隐性位(Recessive)。紧随ACK槽之后,用于分隔ACK场和帧结束场。
7. 帧结束(EOF - End of Frame)
长度:7位隐性位(Recessive)
EOF标志着CAN数据帧的逻辑结束。在这些位中不能有位填充,如果检测到显性位,则表示发生错误。
8. 帧间隔(IFS - Interframe Space)
长度:3位隐性位(Recessive)或更多
帧间隔是数据帧(或遥控帧)与后续帧之间的最小空闲时间。它允许CAN控制器有时间执行内部操作,例如将接收到的帧传输到其应用层。在总线空闲状态下,其他节点才能开始新的传输。过载帧和错误帧不会遵守这个帧间隔。
位填充(Bit Stuffing):确保CAN通信的完整性
位填充是can帧结构中一个至关重要的机制,它主要为了两个目的:
- 位同步: 在总线通信中,接收器需要通过监测位跳变来与发送器保持同步。如果连续出现长时间的相同逻辑电平,接收器可能会失去同步。
- 错误检测: 位填充规则的违规可以被检测为错误。
CAN协议规定,在帧起始到CRC序列(包括SOF、仲裁场、控制场、数据场和CRC序列本身)中,如果发送器检测到连续的5个相同极性(显性或隐性)的位,它会自动插入一个与这5位相反极性的“填充位”。接收器在接收到帧时,会识别并移除这些填充位,从而恢复原始数据流。如果接收器在连续5个相同极性的位后没有检测到填充位,或者检测到6个连续的相同极性位,则会判定为位填充错误,并发送错误帧。
CAN帧结构的应用场景与优势
得益于其精巧的can帧结构,CAN总线在众多领域展现出无与伦比的优势:
- 汽车工业: 车辆内部ECU(电子控制单元)之间的通信,如发动机管理、制动系统(ABS)、安全气囊、车身电子等。
- 工业自动化: 生产线上的传感器、执行器和PLC(可编程逻辑控制器)之间的实时数据交换。
- 医疗设备: 各种医疗仪器和传感器的数据采集与控制。
- 楼宇自动化: 智能家居和楼宇管理系统中的设备互联。
其主要优势包括:
- 高可靠性: 内置的错误检测(CRC)、错误通知(错误帧)和自动重传机制。
- 非破坏性位仲裁: 在多主控环境下,通过标识符仲裁确保高优先级消息优先传输,且不会丢失低优先级消息的数据。
- 多主站能力: 任何连接到总线的设备都可以作为发送器或接收器。
- 成本效益: 相对于其他一些工业总线,CAN的实现成本较低。
常见问题解答(FAQ)
Q1:如何理解CAN帧仲裁机制?
A1: CAN帧仲裁是基于标识符(ID)的非破坏性位仲裁。当多个节点同时开始发送数据帧时,它们会同时监测总线并发送自己的标识符位。如果一个节点发送了隐性位(逻辑1)而监测到总线上是显性位(逻辑0),它会立即停止发送,因为它知道有另一个优先级更高的节点正在发送。优先级最高的帧(标识符数值最小)将最终赢得总线控制权并完成传输,而其他节点则会等待总线空闲后再次尝试发送。
Q2:为何CAN帧需要位填充?
A2: 位填充(Bit Stuffing)是为了确保CAN总线上的位同步以及提供额外的错误检测能力。CAN接收器通过监测总线上的电平跳变来保持与发送器同步。如果没有位填充,当出现连续长串的相同逻辑电平时(例如连续多个显性位或隐性位),接收器可能会失去同步。位填充通过在每5个连续的相同极性位后强制插入一个相反极性的位,确保总线上有足够的位跳变,从而维持同步。同时,如果接收器检测到位填充规则的违规,则可判断为传输错误。
Q3:CAN帧中的DLC位有何作用?
A3: DLC(Data Length Code)位是控制场的一部分,由4位组成。它的作用是明确指示当前数据帧的数据场中包含的实际数据字节数量,范围从0到8。例如,DLC为0000b表示数据场为空(0字节),而1000b则表示数据场包含8字节数据。这使得接收节点能够准确地知道要读取多少字节的数据,从而正确解析帧。
Q4:标准CAN帧和扩展CAN帧的主要区别是什么?
A4: 标准CAN帧(CAN 2.0A)使用11位标识符,提供2048个不同的消息ID。扩展CAN帧(CAN 2.0B)则使用29位标识符,提供高达约5.3亿个不同的消息ID。扩展帧在仲裁场中还额外引入了SRR(Substitute Remote Request)位和IDE(Identifier Extension)位来明确其格式和优先级。两种格式可以在同一CAN总线上共存,并通过仲裁规则协同工作。
Q5:CAN帧中的ACK场是如何实现应答的?
A5: ACK场由ACK槽和ACK界定符组成。发送节点在ACK槽中发送一个隐性位。总线上所有成功接收到该帧且未检测到错误的节点,都会在同一时间将ACK槽的位驱动为显性位(逻辑0),从而覆盖发送节点的隐性位。发送节点如果检测到ACK槽变为显性位,就表示至少有一个节点成功接收并应答了该帧。如果没有节点应答(即ACK槽仍为隐性位),发送节点将认为传输失败,并可能尝试重传。

