【CAN】2.帧格式
2.帧格式
- 2.1 数据帧
- 2.2 遥控帧
- 2.3 错误帧(了解)
- 2.4 过载帧(了解)
- 2.5 帧间隔
- 位填充:
- 波形示例
2.1 数据帧
数据帧概述:
数据帧是CAN总线上设备主动发送数据的通信单元,采用广播方式传输。例如,在课程初始示例中,按下某设备的按键,该设备便会向总线广播一条消息(也称为报文,即Message)。该消息以数据帧格式存在。下图展示了数据帧的具体格式:
数据帧分为标准格式和扩展格式。在CAN总线标准制定初期,仅存在标准格式;扩展格式是为满足更多标识符需求而后续增加的。扩展格式通过增加ID位数,支持更多种类的标识符。
标准格式详解:
首先解析标准格式数据帧结构,结合图例说明:
- 图例说明:
- 灰色区域 (D): 表示“显性电平”(Dominant),逻辑值0。该区域必须发送显性电平0。
- 紫色区域 (D/R): 表示该位可以是显性电平0(D)或隐性电平1(R),具体值取决于发送的数据。
- 白色区域 (R): 表示“隐性电平”(Recessive),逻辑值1。该区域必须发送隐性电平1。
- 应答位 (ACK Slot): 该特殊位由灰色(发送方)和白色(接收方)各占一半。发送方在此位必须发送隐性电平1,而接收方必须发送显性电平0。这意味着发送方释放总线(输出隐性1),接收方则主动拉低总线(输出显性0),以此向发送方发送应答信号。
- 数字标注: 图中数字(如11位、18位、1位、4位等)表示相应字段所占的比特位数。
数据帧时序分析:
- 总线空闲状态 (Idle): 数据帧传输前,总线必须处于空闲状态。空闲时总线为隐性电平(逻辑1,图中白色)。
- 帧起始 (SOF - Start of Frame): 数据帧第一位为显性电平0(图中灰色低电平)。其作用类似于串口通信的起始位:
- 打破空闲: 总线空闲时为隐性1,所有设备均不驱动总线。发送数据帧必须以显性0开头,主动拉低总线。
- 标识帧开始: 若第一位发送隐性1,则与空闲状态无法区分,接收方无法识别新帧开始。因此,显性0起始位明确标识一帧数据的开始,并告知接收方:后续时间内,若总线为隐性1,表示发送的就是逻辑值“1”,而非总线空闲。
- 仲裁段 (Arbitration Field):
- 报文标识符 (Identifier - ID): 紧接SOF后,标准格式ID为11位。ID值(如1010101)决定了该段波形(显/隐序列)。ID的作用至关重要:
- 区分功能: 标识数据帧的功能含义。
- 优先级仲裁: 当多个设备同时发送时,依据仲裁规则(ID值小的优先级高)决定发送顺序。ID值大的帧需等待总线空闲后重试。不同功能的数据帧必须分配不同ID,否则仲裁机制无法区分相同ID帧的发送顺序(仲裁规则详见第四章)。
- 远程传输请求位 (RTR - Remote Transmission Request): 占据1位。在数据帧中,此位必须为显性0,用于区分遥控帧(Remote Frame, RTR必须为隐性1)。
- 仲裁段组成: ID + RTR 共同构成仲裁段。仲裁主要依赖ID值,RTR参与仲裁的目的在于:若相同ID的数据帧和遥控帧发生冲突,数据帧(RTR=0)优先级高于遥控帧(RTR=1)。数据帧与遥控帧可使用相同ID。
- 类比I²C: 此段设计理念与I²C总线相似。I²C起始后发送7位从机地址+1位读写位(R/W)。CAN的11位ID(指定报文功能)+ RTR位(区分数据写入/远程请求读取)与之异曲同工。I²C的多主机仲裁也基于从机地址+读写位。关键区别在于:CAN摒弃了“从机地址”概念,改为分配“报文ID”。优势在于同一报文可被多个设备同时接收。若规定设备仅接收固定ID的报文,则CAN的报文ID功能即等同于I²C的从机地址。
- 报文标识符 (Identifier - ID): 紧接SOF后,标准格式ID为11位。ID值(如1010101)决定了该段波形(显/隐序列)。ID的作用至关重要:
- 控制段 (Control Field):
- 标识符扩展位 (IDE - Identifier Extension): 1位。在标准帧中,原CAN 1.2的保留位 r1 被重新定义为标识符扩展位 (IDE)。用于区分标准格式(IDE=显性0)与扩展格式(IDE=隐性1)。此位必不可少,否则接收方无法判断后续按何种格式解析。
- 保留位 r0: 1位,必须为显性0。目前未使用,为未来协议升级预留空间。
- 数据长度码 (DLC - Data Length Code): 4位,指示数据段包含的有效数据字节数(1-8字节)。例如:
- 发送1字节:DLC=0001 (显显显隐)
- 发送8字节:DLC=1000 (隐显显显)
- DLC=0 表示数据段无有效字节(虽可行,但实际传输数据时长度通常大于0)。
- 数据段 (Data Field): 长度由DLC指定(0-64位,即0-8字节)。发送方需确保DLC值与实际发送的数据字节数严格对应。数据段长度必须是8位(1字节)的整数倍。
- CRC段 (CRC Field):
- 循环冗余校验码 (CRC - Cyclic Redundancy Check): 15位。对SOF起始至数据段结束(含)的所有位进行CRC计算,生成校验码。
- CRC界定符 (CRC Delimiter): 1位,必须为隐性1。作为CRC段结束标志,并为后续ACK段做准备。
- 校验原理: 接收方对相同数据范围计算CRC,并与接收到的CRC值比对。若不一致,则判定传输错误。CRC校验漏检率极低,可靠性远高于串口通信中的奇偶校验。
- ACK段 (ACK Field):
- ACK槽 (ACK Slot): 1位。
- 发送方行为: 释放总线,输出隐性1。
- 接收方行为: 若正确接收到帧(通过CRC校验),则在此位主动驱动总线为显性0。
- ACK界定符 (ACK Delimiter): 1位,必须为隐性1。接收方必须在此位释放总线(输出隐性1),将总线控制权交还发送方。
- 应答机制:
- 发送方在ACK槽位读取总线状态:若为显性0,表明至少有一个接收方正确接收;若为隐性1,则表明无接收方应答,发送失败(可配置重发)。
- 关键点1: 允许多个接收设备同时拉低ACK槽(输出显性0)。
- 关键点2: ACK应答发生在帧传输结束前(EOF之前)。接收方在收到CRC段后即完成帧接收,并在ACK槽位短暂获得总线控制权进行应答,之后发送方才完成整个帧的发送(EOF)。
- 界定符作用: CRC界定符确保发送方在ACK槽前释放总线;ACK界定符确保接收方在应答后及时释放总线,实现控制权平稳交接。
- ACK槽 (ACK Slot): 1位。
- 帧结束 (EOF - End of Frame): 7位隐性1。作用类似于串口停止位,标志数据帧传输结束。
标准格式设计思路总结:
核心目标是设计承载数据的波形:
- 数据载体: 包含数据段。
- 长度可变: 引入DLC指定数据段长度。
- 功能标识与仲裁: 添加ID标识功能,结合RTR区分数据写入/远程读取请求。
- 数据完整性: 添加CRC校验。
- 传输确认: 添加ACK应答机制确认接收方存在。
- 未来兼容: 预留保留位(r0, r1)。[现在r1->IDE]
- 版本区分: r1被赋予IDE功能,区分标准/扩展格式。
- 帧界定: SOF标识开始,EOF标识结束。
扩展格式详解:
扩展格式旨在解决标准格式11位ID不足的问题,同时需兼容原有标准。
- 结构特点:
- 保留标准格式的11位基本ID(Base ID)。
- 新增18位扩展ID(Extended ID)。
- 替代远程请求位 (SRR - Substitute Remote Request): 1位,位于基本ID后、IDE前。在扩展帧中必须为隐性1。其存在主要是为兼容仲裁规则(仲裁先比较ID,后比较RTR),确保标准帧在与同Base ID的扩展帧仲裁时胜出(标准帧的RTR位位置在扩展帧中是SRR位,标准帧RTR=0显性 优于 扩展帧SRR=1隐性)。标准帧中此位是RTR。
- 标识符扩展位 (IDE): 1位,在扩展帧中必须为隐性1(标准帧中为显性0)。
- 远程传输请求位 (RTR): 1位,位置移至IDE之后。在数据帧中仍必须为显性0。
- 兼容性设计: 接收方在收到IDE位之前(即基本ID和SRR位),无法区分帧格式,但此部分两种格式结构相同,无需区分。收到IDE位后:
- IDE=显性0:按标准格式解析后续内容。
- IDE=隐性1:按扩展格式解析后续内容(存在18位扩展ID和移动后的RTR)。
- 控制段及后续: IDE位之后的r0、DLC、数据段、CRC段、ACK段、EOF与标准格式完全相同。其中扩展格式中的r1位(原IDE位置)恢复为保留位(与r0一起),为未来进一步升级预留空间。
- 仲裁段组成: 扩展帧的仲裁段为:11位Base ID + SRR位 + IDE位 + 18位Extended ID + RTR位。
数据帧各字段功能总结:
字段 | 缩写 | 全称 | 功能描述 | 备注 |
---|---|---|---|---|
帧起始 | SOF | Start of Frame | 标识数据帧开始,显性电平(0)打破总线空闲。 | |
仲裁段 | ||||
标识符 (标准) | ID | Identifier | 11位,标识报文功能,决定仲裁优先级。 | |
标识符 (扩展) | ID | Identifier | 11位基本ID + 18位扩展ID,提供更多标识符空间。 | |
远程传输请求位 | RTR | Remote Transmission Req. | 1位。数据帧=显性0;遥控帧=隐性1。区分帧类型,参与仲裁。 | 在扩展帧中位置后移。 |
标识符扩展位 | IDE | ID Extension | 1位。标准帧=显性0;扩展帧=隐性1。区分帧格式。 | 标准帧中原为保留位r1。 |
替代远程请求位 | SRR | Substitute Remote Request | 1位(仅扩展帧存在)。必须为隐性1。保证同基本ID的标准帧仲裁优先级更高。 | 位于扩展帧基本ID后、IDE前。在标准帧中此位置是RTR位。 |
控制段 | ||||
保留位 | r1, r0 | Reserved | 各1位。标准帧r1=IDE位;扩展帧r1保留。r0必须显性0。为未来升级预留。 | 体现协议设计的远瞻性。 |
数据长度码 | DLC | Data Length Code | 4位。指定数据段包含的有效数据字节数 (0-8)。 | |
数据段 | Data | Data Field | 0-8字节 (0-64位) 有效载荷数据。长度由DLC指定。 | 长度必须是字节(8位)的整数倍。 |
CRC段 | ||||
循环冗余校验码 | CRC | Cyclic Redundancy Check | 15位。校验SOF至数据段结束的所有位。 | 高可靠性校验。 |
CRC界定符 | - | CRC Delimiter | 1位。必须隐性1。标志CRC段结束。 | 发送方释放总线,为ACK槽做准备。 |
ACK段 | ||||
ACK槽 | - | ACK Slot | 1位。发送方释放总线(隐性1);接收方正确接收后拉低总线(显性0)应答。 | 允许多个接收方同时应答。 |
ACK界定符 | - | ACK Delimiter | 1位。必须隐性1。接收方释放总线,标志ACK段结束。 | 接收方交出总线控制权。 |
帧结束 | EOF | End of Frame | 7位隐性1。标志数据帧传输结束。 |
数据帧发展历史:
- CAN 1.2: 仅存在单一数据帧格式(即后来的标准格式)。IDE位当时为保留位r1(固定显性0)。11位ID在当时足够使用。帧结构规整:仲裁段(ID + RTR) -> 控制段(r1 + r0 + DLC) -> 数据段 -> CRC段 -> ACK段 -> EOF。
- CAN 2.0: 因ID需求增长,引入扩展格式。为区分新旧格式,协议将标准格式中的保留位r1重新定义为IDE位。扩展帧通过增加18位扩展ID和SRR位(保证仲裁兼容性)来扩展地址空间,同时复用IDE位后的r1作为保留位。
- 兼容性代价: 扩展帧的结构不如标准帧规整优雅(ID被拆分,存在无实质功能的SRR位)。这类似于软件升级时遗留的“死代码”(Dead Code)现象——为保持向后兼容性,协议逐渐变得复杂。虽然硬件协议的更新周期远长于软件,但最终也可能被全新设计所替代。
2.2 遥控帧
遥控帧概述:
遥控帧(Remote Frame)用于实现请求式数据传输。其用途是:当接收设备需要获取特定数据时,主动向总线发送遥控帧以请求该数据。
工作原理与使用场景:
- 数据广播的局限性: CAN总线上的数据主要依靠发送设备主动广播(通常以固定周期发送)。这种方式存在潜在问题:
- 若发送方未能及时广播数据,接收方无法获取。
- 若数据使用频率低,周期性广播会造成总线资源浪费。
- 若广播间隔过长,偶尔需要该数据的设备无法及时获取。
- 遥控帧的解决方案: 对于使用频率较低或按需使用的数据,可采用遥控帧机制:
- 接收方发起请求: 需要数据的设备(接收方)广播一个遥控帧,该帧包含所需数据的报文ID。
- 发送方响应数据: 总线上拥有该ID数据的设备(发送方)收到遥控帧后,会立即(或根据配置)通过一个携带有效数据的数据帧(使用相同ID)广播响应。
- 接收方获取数据: 请求方接收此数据帧,从而获得所需数据。
- 请求-响应流程: 一次完整的按需数据传输需要两个步骤:接收方发送遥控帧(请求) -> 发送方响应数据帧(应答)。
- 适用场景: 遥控帧机制适合使用频率低但偶尔需要集中使用的数据。它避免了周期性广播的浪费。
- 不适用场景: 对于使用频率高的数据,采用遥控帧请求反而不合适,因为每次请求(遥控帧)和响应(数据帧)都会占用总线资源。此时,由发送方进行周期性广播(数据帧)通常是更高效的选择。
遥控帧格式定义:
遥控帧的时序结构与数据帧高度相似,关键区别在于:
- RTR位 (Remote Transmission Request): 遥控帧的RTR位必须为隐性电平1(数据帧的RTR位为显性电平0)。这是区分两种帧类型的核心标志。
- 数据段缺失: 遥控帧不包含数据段(Data Field)。因为它本身是请求,不携带有效载荷。
- 其他字段: 帧起始(SOF)、仲裁段(ID)、控制段(IDE, r0, DLC)、CRC段、ACK段、帧结束(EOF)等部分的结构和规则与数据帧完全相同。
请求-响应流程详解:
- 请求发起: 请求设备广播一个遥控帧。该帧的:
- ID字段: 设置为它需要请求的数据对应的报文ID。
- RTR位: 设置为隐性1(标识此为遥控帧)。
- DLC字段: DLC字段:设置为期望响应的数据帧应包含的数据长度(0-8字节)。发送方在响应时,其数据帧的DLC值应与此值匹配,以确保接收方能正确解析预期长度的数据。
- 响应触发: 拥有该ID数据的设备(发送方)接收到此遥控帧。
- 数据响应: 发送方随后(通常在总线空闲后)广播一个数据帧。该帧的:
- ID字段: 与接收到的遥控帧ID相同。
- RTR位: 设置为显性0(标识此为数据帧)。
- 数据段: 包含请求方所需的有效数据(长度通常匹配遥控帧的DLC)。
- 仲裁优先级: 当请求(遥控帧)和响应(数据帧)恰好同时尝试发送时,由于数据帧的RTR位为显性0,而遥控帧的RTR位为隐性1,根据CAN总线仲裁规则(先比较ID,ID相同再比较RTR),相同ID的数据帧优先级高于遥控帧。因此,数据帧将赢得仲裁并优先发送,遥控帧退避等待重试。这确保了响应数据能优先送达。
总结:
遥控帧是CAN协议实现按需数据传输的关键机制。它通过设置RTR=1且省略数据段来区别于数据帧。接收设备通过广播遥控帧(指定ID)来请求数据,拥有该数据的设备则通过广播数据帧(相同ID)进行响应。这种机制优化了低频率数据的传输效率,避免了不必要的周期性广播开销。
2.3 错误帧(了解)
错误帧概述:
错误帧(Error Frame)是CAN总线协议中用于错误检测与通知的机制。其核心用途是:当总线上的任一设备检测到传输错误时,立即向所有其他设备广播错误帧,通知错误发生,并强制终止当前正在传输的数据帧或遥控帧。
错误帧的核心作用:
- 错误通知: 向总线所有参与者宣告检测到错误。
- 强制终止: 通过发送特定的错误标志(Error Flag)序列主动破坏当前帧的波形,确保该帧被所有设备识别为无效并丢弃。
- 促进重发: 终止错误帧后,发送方(在满足错误计数规则下)通常会尝试自动重发该数据帧或遥控帧。
错误检测机制:
总线上所有设备在接收数据的同时,都会实时监督总线波形。一旦检测到以下任一错误类型:
- 位错误 (Bit Error): 发送方在发送显性位(0)时监听到总线为隐性(1),或发送隐性位(1)时监听到总线为显性(0)(仲裁期间和ACK槽位除外)。
- 填充错误 (Stuff Error): 违反位填充规则(连续6个相同电平位)。
- CRC错误 (CRC Error): 接收方计算的CRC校验值与接收到的CRC值不匹配。
- 格式错误 (Form Error): 检测到固定格式位(如帧结束EOF、界定符Delimiter)出现非法电平。
- 应答错误 (ACK Error): 发送方在ACK槽位未检测到显性电平(0)(即无任何接收方应答)。
检测到错误的设备将立即发起错误帧的发送。
错误帧结构:
错误帧由两部分组成:
- 错误标志 (Error Flag):
- 主动错误标志 (Active Error Flag): 由处于主动错误状态 (Active Error State) 的设备发出。该标志为连续6位显性电平 (0)。
- 被动错误标志 (Passive Error Flag): 由处于被动错误状态 (Passive Error State) 的设备发出。该标志为连续6位隐性电平 (1)。
- 错误界定符 (Error Delimiter): 紧接在错误标志之后,由8位隐性电平 (1) 组成。
错误标志的工作原理与影响:
- 主动错误标志 (6位显性0):
- 发出显性电平(0)即表示驱动总线为低电平。
- 基于CAN总线的“线与”(Wired-AND)物理特性:只要有一个设备驱动总线为显性(0),总线即呈现显性状态(0)。显性位(0)总是覆盖隐性位(1)。
- 因此,主动错误标志(6个连续的0)会强制覆盖总线上的任何正常传输波形,导致当前帧的数据被破坏,所有设备都能识别到错误。
- 被动错误标志 (6位隐性1):
- 发出隐性电平(1)即表示释放总线(不主动驱动,呈现高阻态)。
- 处于被动错误状态的设备检测到错误时发送此标志。
- 由于它仅释放总线(输出隐性1),不会主动驱动总线为低电平(0),因此不会破坏其他正常设备发送的数据帧波形。
- 它的主要作用是:当该设备自身是发送方且检测到错误时,通过发送被动错误标志来中断自身的数据发送,并通知错误。它不影响其他设备发送的正确帧。
错误标志的重叠 (Superposition):
- 当一个设备发出错误标志(尤其是主动错误标志)时,可能触发其他检测到相同或不同错误的设备也同时发出错误标志。
- 多个设备的错误标志会在总线上叠加。对于主动错误标志(显性0),叠加会延长总线被拉低的时间(0位到最多12位,甚至更长)。对于被动错误标志(隐性1),叠加没有额外效果。
- 图中标注的“0到6位延长”即表示这种由多个设备错误标志叠加导致的错误标志持续时间延长的可能性。
错误界定符的作用:
- 在错误标志(无论实际长度)之后发送8位隐性电平(1)。
- 提供一段稳定且可预测的隐性电平时间段。
- 标志错误帧的结束。
- 为总线从错误状态恢复到空闲状态或准备下一帧传输提供必要的间隔时间。
错误状态与节点行为:
- 初始状态: 设备上电后默认处于主动错误状态。
- 状态转换: 设备根据其发送/接收错误计数器的值(由协议定义的规则管理)在主动错误状态、被动错误状态和总线关闭状态之间转换。详细规则将在第五章介绍。
- 核心区别:
- 主动错误状态: 设备检测到错误时发送主动错误标志 (6位显性0),会破坏当前总线传输。
- 被动错误状态: 设备检测到错误时发送被动错误标志 (6位隐性1),不会通过驱动总线来破坏当前波形。但当它被其他设备检测到时(表现为连续6个隐性位,违反位填充规则),会被识别为一个错误帧(被动错误标志),宣告有错误发生,并可能导致当前帧被发送方或检测到该错误标志的其他设备终止。
节点错误状态 | 检测到错误时的行为 | 错误标志类型 | 对总线传输的影响 |
---|---|---|---|
主动错误状态 | 发送连续6位显性电平(0) | 主动错误标志 | 强制终止当前总线传输,破坏当前帧 |
被动错误状态 | 发送连续6位隐性电平(1) | 被动错误标志 | 不破坏其他正确帧;若自身是发送方则中断发送 |
总线关闭状态 | 脱离总线,无法发送或接收任何帧 | 不发送错误标志 | 无 |
总结:
错误帧是CAN总线高可靠性的关键机制之一。它通过设备主动监督总线、检测错误并立即发送错误标志(主动或被动)来通知所有节点,强制终止无效传输,并促进错误恢复(通常是重发)。理解错误帧的结构(标志+界定符)及其在不同节点错误状态下的行为差异(主动标志破坏总线,被动标志不破坏总线但中断自身发送),是掌握CAN总线错误处理机制的基础。
2.4 过载帧(了解)
过载帧 (Overload Frame) 概述:
过载帧(Overload Frame)是CAN总线协议中一种由接收设备(Receiver)主动发起的流量控制机制。其主要用途是:当接收方因内部处理能力不足(例如缓冲区满、CPU负载过高等)而无法及时处理持续涌入的总线数据时,通过发送过载帧来强制延缓发送方(Transmitter)的数据传输速率,从而避免数据丢失并平衡总线负载。
过载帧的工作原理与目的:
- 问题背景: 在广播式通信(如数据帧)中,发送方主动控制发送节奏,接收方无法直接请求发送方减速。
- 过载帧的解决方案: 当接收方不堪重负时:
- 发起中断: 接收方广播一个过载帧。
- 强制延缓: 过载帧的波形结构与错误帧类似,同样包含能破坏当前总线传输的标志序列。这会强制中断发送方正在发送的帧。
- 触发重发与延迟: 被中断的发送方会(根据协议规则)稍后自动重试发送被破坏的帧。
- 间接调速: 通过周期性插入过载帧来反复中断和延迟发送方的传输,接收方有效地降低了实际到达其自身的数据流速率,为其内部处理争取了时间。
- 负载平衡: 该机制有助于防止接收方因数据过载而崩溃或丢失数据,从而维持总线通信的整体稳定性。
- 设计意图: 过载帧提供了一种接收方间接调控发送方速率的非直接反馈机制。
过载帧格式定义:
过载帧的时序结构高度相似于错误帧,核心区别在于其产生条件和目的:
- 过载标志 (Overload Flag):
- 由发起过载帧的接收方发出。
- 格式为连续6位显性电平 (0)(与主动错误标志相同)。
- 作用: 驱动总线为显性状态(0),强制覆盖并破坏当前正在传输的帧(无论数据帧、遥控帧还是其他),通知所有节点接收方过载。
- 过载界定符 (Overload Delimiter): 紧接在过载标志之后,由8位隐性电平 (1) 组成(与错误界定符相同)。
- 作用: 标志过载帧结束,提供总线恢复隐性状态的时间。
关键点:波形相似性
- 过载标志 (6位显性0) 在物理层上与主动错误标志完全相同。
- 过载界定符 (8位隐性1) 在物理层上与错误界定符完全相同。
- 核心差异: 错误帧由错误检测(位错、填充错、CRC错等)触发;而过载帧由接收方内部资源不足触发。接收方主动选择发送过载帧作为一种流量控制手段,而非错误响应。
过载帧的影响与发送方响应:
- 当前帧中断: 被过载帧破坏的当前传输帧会被所有节点(包括原发送方)视为无效并丢弃。
- 发送方行为: 被中断的发送方将:
- 检测到传输被破坏(类似检测到错误)。
- 其错误计数器可能会受到影响(具体规则较复杂,通常影响小于严重错误)。
- 在满足协议规则(如帧间隔后)自动重发被中断的帧。
- 速率调节效果: 如果接收方持续过载,它会重复发送过载帧。每次过载帧都会导致发送方重发被中断的帧并经历额外的延迟(帧间隔、可能的仲裁等待)。这种反复的中断和重试显著降低了发送方数据实际成功送达接收方的有效速率,从而缓解了接收方的处理压力。
特性 | 过载帧 (Overload Frame) | 错误帧 (Error Frame) |
---|---|---|
触发条件 | 接收方内部处理能力不足 (非错误状态) | 设备检测到总线传输错误 (5种错误类型之一) |
发起方 | 接收方 (感到过载的设备) | 任何检测到错误的设备 (发送方或接收方) |
核心目的 | 流量控制:间接降低发送方有效数据速率 | 错误处理:通知错误、终止无效传输、促重发 |
波形结构 | 6位显性0 (过载标志) + 8位隐性1 (过载界定符) | 6位显/隐标志 (取决于状态) + 8位隐性1 (错误界定符) |
主动标志作用 | 强制中断当前传输,实现流量控制 | 强制终止当前传输,宣告错误发生 |
对错误计数器影响 | 通常较小 (视具体实现和频率) | 显著增加 (是节点错误状态转换的主要依据) |
总结与定位:
- 过载帧是CAN总线协议中用于接收方主导的流量控制机制。
- 它通过主动破坏当前总线传输(发送6位显性过载标志)来强制中断发送方,并利用发送方的自动重发机制和重发延迟,间接达到降低数据流速率、缓解接收方处理压力的目的。
- 其波形虽与错误帧(主动错误标志部分)相似,但触发原因(接收方过载 vs. 检测到总线错误)和设计目标(流量控制 vs. 错误恢复)有本质区别。
- 理解其作为间接流量控制手段的本质及其与错误帧的区别即可。其内部计数器规则等细节可在深入协议实现时再研究。
2.5 帧间隔
帧间隔 (Interframe Space - IFS) 概述:
帧间隔(Interframe Space, IFS)是CAN总线协议中用于分隔连续传输的数据帧或遥控帧的固定时间段。其核心作用是在前一帧(数据帧、遥控帧或错误帧)结束(EOF)之后、下一帧开始(SOF)之前,提供一个必需的间隔期。
帧间隔的作用:
- 帧分隔: 明确标识前一帧的结束和下一帧的开始,确保接收设备能够正确解析连续的帧。
- 总线状态恢复: 为总线提供一个短暂的稳定期(隐性电平),确保所有节点有足够时间准备接收或发送下一帧。
- 错误状态处理: 其具体长度会根据发送节点的错误状态进行调整,以限制不可靠节点对总线的影响。
帧间隔的结构:
帧间隔由两个主要部分组成:
- 间隔段 (Intermission): 固定为 3位隐性电平 (1)。所有节点(无论错误状态)在发送或接收完一帧后,都必须等待并监听到至少3位的隐性电平(总线空闲),才能开始发送下一帧。
- 总线空闲 (Bus Idle): 在间隔段之后,总线保持隐性电平(1)的时间段。此段的长度是可变的,取决于是否有节点要发送新帧。关键点在于:节点被允许开始发送新帧的时间点(即SOF的起始点)取决于其自身的错误状态。
帧间隔长度与节点错误状态的关系:
节点被允许在间隔段结束后开始发送新帧的具体时间,由其当前的错误状态决定:
节点错误状态 | 允许开始发送新帧的时间点 | 帧间隔中附加要求 | 目的 |
---|---|---|---|
主动错误状态 (Active Error State) | 在检测到 3位隐性电平(间隔段结束)后,立即可以开始发送SOF。 | 无附加段。 | 正常节点享有平等的总线访问权限。 |
被动错误状态 (Passive Error State) | 在检测到 3位隐性电平(间隔段结束)后,必须额外等待8位隐性电平的时间(称为“延迟传输”段),之后才能开始发送SOF。 | 附加 8位隐性电平的“延迟传输”(Suspend Transmission) 段。 | 限制不可靠节点的总线访问优先级: • 确保被动错误状态节点在总线空闲后,需等待更长时间(额外8位)才能尝试发送。 • 在此期间,处于主动错误状态(更可靠)的节点可以抢先获得总线访问权并开始发送。 • 有效降低频繁出错的节点干扰总线正常通信的概率。 |
总结与学习建议:
- 帧间隔核心功能: 提供必要的分隔(3位间隔段),并依据节点可靠性(错误状态)管理其访问总线的优先级。
- 主动错误状态节点: 享有标准访问权限(间隔段结束即可发送)。
- 被动错误状态节点: 访问权限受限(间隔段结束后需额外等待8位“延迟传输”时间才能发送),以减少其对总线的潜在干扰。
- 其他帧类型: CAN协议还定义了错误帧(Error Frame)和过载帧(Overload Frame)用于处理错误和总线过载情况。这些机制,连同帧间隔在不同错误状态下的细节以及各种意外状态的处理,共同构成了CAN总线复杂而强大的错误管理和恢复系统。
- 学习路径建议: 对于初学者,应掌握基本的数据传输,可以在理解基础通信流程后,根据实际需要再进行深入研究。
位填充:
位填充 (Bit Stuffing) 概述:
位填充是CAN总线协议中,在数据帧或遥控帧发送到物理总线之前,由发送方执行;以及在从总线接收数据之后,由接收方执行的一项强制性编码规则。其核心目的是确保总线波形具有足够的电平跳变(边沿),以解决长时间电平恒定带来的潜在问题。
位填充规则:
- 发送方规则:
- 在发送有效数据位(从SOF到CRC,但不包括CRC界定符、ACK段、EOF和帧间隔)时:
- 每当连续发送了5个相同电平位(5个显性0或5个隐性1)后:
- 必须自动插入(填充)一个相反电平的位(称为填充位,Stuff Bit)。
- 插入填充位后,重新开始对连续相同电平位的计数(从0开始)。
- 接收方规则:
- 在接收数据位(从SOF到CRC)时:
- 每当连续接收到5个相同电平位后:
- 预期下一个位必须是填充位(即与前5位相反的电平)。
- 接收方会自动移除这个填充位。
- 移除填充位后,重新开始对连续相同电平位的计数(从0开始)。
- 关键点:
- 填充位不包含在原始有效数据中,仅用于物理层传输编码。
- 发送方插入填充位,接收方移除填充位,确保原始有效数据在通信两端完全一致。
- 填充规则: 位填充规则适用于:帧起始 (SOF) 到 CRC值 (15位) 结束,包含仲裁段、控制段、数据段和CRC值本身。不适用于CRC界定符、ACK段、帧结束 (EOF) 和帧间隔 (IFS)。
位填充的核心作用:
- 提供定时信息与再同步(核心作用):
- 问题: 长时间连续相同电平(如64位隐性1)会导致波形无跳变。接收方依赖电平跳变(边沿)来:
- 精确定位位边界(确定何时采样)。
- 执行时钟再同步(调整内部时钟相位以补偿发送/接收时钟偏差,确保在位的中间采样)。
- 解决方案: 位填充强制引入电平跳变(每5个相同位后插入相反位)。
- 效果: 保证在有效数据部分,连续相同电平位数不超过5位。接收方能频繁检测到边沿,持续校正采样点位置,显著提高长帧传输的可靠性,防止累积的时钟偏差导致位采样错误。
- 问题: 长时间连续相同电平(如64位隐性1)会导致波形无跳变。接收方依赖电平跳变(边沿)来:
- 标志错误帧与过载帧的特异性:
- 问题: 如何区分正常数据和错误/过载帧?错误帧和过载帧的标志位是连续6个显性电平 (0)。
- 解决方案: 经过位填充的正常数据流中,不可能出现连续6个相同电平位(因为第5个相同位后必插入相反位)。
- 效果: 一旦检测到连续6个或更多个相同电平位,接收方立即识别出这是错误帧或过载帧的标志,而非正常数据。这为错误/过载检测提供了清晰、可靠的物理层特征。
- 防止误判总线空闲:
- 问题: CAN协议规定,检测到连续11个隐性电平 (1) 即认为总线空闲。原始数据段可能包含长串隐性1(如全0xFF数据),易被误判为空闲。
- 解决方案: 位填充确保在有效数据部分,连续隐性1位数不超过5位。
- 效果: 正在传输的数据帧/遥控帧期间,不可能出现连续11个隐性1,从而避免其他节点误判总线空闲并发起新传输导致冲突。
总结:
位填充是CAN总线物理层可靠性的基石:
- 发送方插入填充位,接收方移除填充位,确保原始数据无损传输。
- 通过强制引入电平跳变(每5个相同位后插入相反位):
- 提供丰富的定时边沿,使接收方能精确定位位边界并执行时钟再同步。
- 确保正常数据流中连续相同电平不超过5位,为错误帧/过载帧(连续6个相同电平)提供特异性标识。
- 防止有效数据传输期间出现连续11个隐性1,避免被误判为空闲状态。
虽然增加了传输开销(插入填充位),但其带来的可靠性收益远大于代价,是CAN协议高鲁棒性的关键设计之一。
波形示例
波形实例分析方法:
使用示波器双通道分别测量CAN_H和CAN_L对地电压,通过差分运算获得总线电平波形。捕获步骤如下:
- 探头连接: 示波器通道1接CAN_H,通道2接CAN_L,探头接地端均连接STM32开发板共地点。
- 触发设置: 配置为下降沿触发(对应SOF起始位)。
- 数据生成: 按下按键触发STM32发送预设帧结构。
- 波形解析:
- 在波形图中标注位边界判定线,提取二进制数据流。
- 根据CAN协议帧格式和位填充规则进行解码,还原原始数据。
实例1:标准数据帧(ID=0x555, DLC=1, Data=0xAA)
- 波形特征:
- 总线空闲: 起始前为连续隐性电平(逻辑1)。
- 帧起始 (SOF): 显性电平(0),打破空闲状态。
- 仲裁段:
- ID (11位):
101 0101 0101
→ 十六进制0x555
(最高位MSB先发)。波形呈现对应的334结构,344含义:0x为十六进制前缀,一个十六进制=4位,ID最多11位,所以第一个5就只能分解成101) - RTR位: 显性0(标识数据帧)。
- ID (11位):
- 控制段:
- IDE位: 显性0(标准格式)。
- r0位: 显性0(保留位)。
- DLC (4位):
00(1)01
→ 长度1字节(注意:此处因前5位连续0触发位填充,插入填充位1
,实际波形为0 0 1 0 1
,解析时移除填充位得0 0 0 1
)。
- 数据段 (1字节):
1010 1010
→ 十六进制0xAA
(MSB先发)。 - CRC段 (15位): 包含自动计算的校验码(发送端生成)。注:CRC计算基于原始数据(不含填充位)。段内存在位填充(因连续5个0插入填充位
1
)。 - CRC界定符: 隐性1(发送方释放总线)。
- ACK段:
- ACK槽: 显性0(由接收方驱动,表示应答有效)。
- ACK界定符: 隐性1(接收方释放总线)。
- 帧结束 (EOF): 7位隐性1。
- 验证: 波形完全符合标准数据帧格式,位填充机制正常运作。
实例2:标准数据帧(ID=0x666, DLC=2, Data=0x12 0x34)
- 关键差异:
- ID (11位):
110 0110 0110
→ 十六进制0x666
(有效范围0x000 - 0x7FF
)。 - DLC (4位):
0(1)010
→ 长度2字节(解析时移除连续5个0触发的填充位1
)。 - 数据段 (2字节):
- 字节1:
0001 0010
→0x12
- 字节2:
0011 0100
→0x34
- 字节1:
- ID (11位):
- 核心演示点: 数据段长度可变性(DLC=2时数据段为16位)。
实例3:扩展数据帧(ID=0x0789ABCD, DLC=1, Data=0x56)
- 波形特征:
- 仲裁段:
- Base ID (11位): 标准部分ID。
- SRR位: 隐性1(替代RTR位)。
- IDE位: 隐性1(标识扩展格式)。
- Extended ID (18位): 扩展部分ID,与Base ID组合成完整29位ID
0x0789ABCD
(因为ID是29位的,并不是4的整数倍,所以扩展ID号的范围0x0000 0000 - 0x1FFF FFFF
)。 - RTR位: 显性0(数据帧)。
- 控制段:
- r0位: 显性0(保留位)。
- DLC (4位):
00(1)01
→ 长度1字节。
- 数据段 (1字节):
0101 0110
→0x56
。 - 后续字段: CRC段、CRC界定符、ACK段、EOF格式与标准数据帧一致。
- 仲裁段:
- 注意: 29位ID范围上限为
0x1FFFFFFF
,无法表示0x6789ABCD
(需确保ID值有效)。本实例ID0x0789ABCD
在有效范围内。
实例4:标准遥控帧(ID=0x088, DLC=1)
- 波形特征:
- 仲裁段:
- ID (11位):
000 1000 1000
→ 十六进制0x088
(有效范围0x000 - 0x7FF
)。 - RTR位: 隐性1(标识遥控帧)。
- ID (11位):
- 控制段:
- IDE位: 显性0(标准格式)。
- r0位: 显性0(保留位)。
- DLC (4位):
000(1)1
→ 表示请求数据的预期长度为1字节(遥控帧无有效载荷),(1)标识位填充。
- 数据段: 不存在。
- CRC段: 包含位填充特例
- 仲裁段:
- 核心演示点:
- 遥控帧通过RTR=1标识。
- DLC在遥控帧中指示期望响应的数据长度(本例为1字节)。
- 位填充的二次插入机制在实际波形中的体现。