A2C
支持的芯片[ RTL8721F ]
概述
A2C (Automotive 2-wire Connection) 是一款专为汽车及工业高可靠性应用场景设计的实时串行通信控制器。该模块实现了 ISO11898-1 标准(不包含 ISO11898-1 FD)的数据链路层协议,支持多主控通信、非破坏性仲裁及强大的错误检测机制。 A2C 支持硬件级的自动处理能力(如自动重传、自动回复、FIFO、DMA),旨在最大程度降低 CPU 负载。
功能特性
A2C 支持以下功能特性:
核心协议
兼容 ISO11898-1 标准,支持 11bit 标准帧和 29bit 扩展帧
支持 3 点采样(低速率下使用)
发送和接收
支持发送失败后自动重传
支持硬件自动回复远程帧
支持记录接收时间戳
支持基于时间触发的报文发送
缓冲和存储管理
硬件支持 16 个消息缓冲区,用于消息暂存
消息缓冲区可灵活配置为发送或接收
支持将编号 12 ~ 编号 15 的消息缓冲区用作 FIFO
接收时支持 DMA 搬运
低功耗
支持低功耗唤醒
调试和错误管理
支持内部和外部回环模式,外部回环模式可抓取协议帧进行分析
支持静默模式,用于总线监听
支持多种错误中断,如位错误/填充错误/格式错误等
A2C 物理层
拓扑结构
A2C 模块作为协议控制器,需配合外部收发器(Transceiver)完成逻辑电平与差分信号的转换。物理层设计直接决定了通信的距离与抗干扰能力。根据应用场景不同,A2C 支持两种典型的网络拓扑:
高速闭环网络(ISO11898-2)
适用于高速(标准 A2C 最高 1Mbps)、短距离(<40m)通信。总线两端须连接 120Ω 终端电阻以抑制信号反射。
低速开环网络(ISO11898-3)
适用于低速(最高 125Kbps)、远距离(<1km)通信。
物理信号
A2C 控制器到收发器之间的 TX/RX 是正常逻辑电平,即 0 用低电平表示,1 用高电平表示。而收发器到总线 H/L 上的信号则使用差分信号传输。
当 A2C 节点需要发送数据时,控制器将要发送的二进制编码通过 TX 发送到收发器,收发器将这个普通的逻辑电平转换为差分信号,通过差分线 H 和 L 传输到总线网络。
当 A2C 节点需要接收数据时,收发器将 H 和 L 上收到的差分信号转换为普通逻辑电平,然后通过 RX 输出到 A2C 控制器。
差分信号传输时需要两根信号线,两根信号线上电压幅度相同,相位相反,其差值用来表示逻辑电平 0 和 1,如下图展示了一组标准的差分信号及其差值。
相较于单根信号线传输,差分信号传输时具有以下特点:
抗干扰能力强 :收到噪声干扰时,噪声同时耦合到两根信号线上,最终的信号差值会相互抵消,外界的共模噪声会被抑制
低电磁辐射 :由于信号线采用双绞线形式连接,磁场极性相反,对外辐射会因此抵消,对周围电路的干扰更小,更容易通过 EMC(电磁兼容性)测试
时序定位精准:单端信号判断逻辑翻转依赖于一个固定的参考电压(如 Vcc/2),受电源波动影响大。差分信号的逻辑翻转点是两根信号线的交叉点,交叉点的检测不受参考电压漂移的影响,这极大地减小了时序抖动(Jitter)。
无需公共地:单端信号必须以 GND 作为参考,两端参考电压不一致易导致信号误判;差分信号则只关注电压差,无需公共地。
备注
线路上实际传输的差分信号受到真实电磁环境、传输距离等影响,信号形状、振幅和相位等都会发生变形。
差分信号
ISO11898 标准中对于差分信号做出如下规定:
信号 |
隐性 (逻辑 1) |
显性 (逻辑 0) |
||||
|---|---|---|---|---|---|---|
最小值 |
典型值 |
最大值 |
最小值 |
典型值 |
最大值 |
|
A2C_High (V) |
2.0 |
2.5 |
3.0 |
2.75 |
3.5 |
4.5 |
A2C_Low (V) |
2.0 |
2.5 |
3.0 |
0.5 |
1.5 |
2.25 |
High-Low 电位差 (V) |
-0.5 |
0 |
0.05 |
1.5 |
2.0 |
3.0 |
信号 |
隐性 (逻辑 1) |
显性 (逻辑 0) |
||||
|---|---|---|---|---|---|---|
最小值 |
典型值 |
最大值 |
最小值 |
典型值 |
最大值 |
|
A2C_High (V) |
1.6 |
1.75 |
1.9 |
3.85 |
4.0 |
5.0 |
A2C_Low (V) |
3.10 |
3.25 |
3.4 |
0 |
1.0 |
1.15 |
High-Low 电位差 (V) |
-0.3 |
-1.5 |
/ |
0.3 |
3.0 |
/ |
以高速物理层电压规范 ISO11898-2 为例:
当表示逻辑 1( 隐性电平 ),H 和 L 线上的电压均为 2.5V,压差为 0V
当表示逻辑 0( 显性电平 ),H 线上电压为 3.5V,L 线上电压为 1.5V,压差 2V
例如,当收发器想要发送控制器传来的逻辑电平 0,它会使 H 信号线输出 3.5V,同时 L 信号线输出 1.5v,从而输出显性电平逻辑 0。
小技巧
ISO11898 中规定的显性和隐性电平,具有类似 I2C 总线的”线与“特性(任意节点发出低电平都会拉低总线电平)。假如有两个 A2C 通信节点,在同一时间,一个输出隐性电平, 另一个输出显性电平, 则总线上呈现显性电平(逻辑 0)。这也是节点通信时仲裁的根本机制。
因为物理层只有 1 对差分线,在一个时刻只能表示一个信号,所以对节点而言通信是半双工的,收发数据不能同时进行。 在整个通信网络中,因为共用总线,同一时刻只能有一个通信节点发送信号(仲裁阶段支持多个节点同时发送),其余的节点在该时刻都只能接收。
A2C 协议层
协议帧格式概览
协议层定义了数据在总线上的封装格式。A2C 协议主要包含以下几种帧格式:
帧类型 |
主要用途 |
发送时机/约束 |
关键特点 |
|---|---|---|---|
数据帧 (Data Frame) |
传输实际数据 |
|
|
远程帧 (Remote Frame) |
请求特定 ID 的数据 |
|
|
错误帧 (Error Frame) |
通知全局总线错误 |
|
|
过载帧 (Overload Frame) |
延迟下一帧接收 (给接收方喘息时间) |
|
|
帧间隔 (Intermission) |
物理分隔连续的帧 |
|
|
数据帧
数据帧(Data Frame)是 A2C 总线进行数据传输的常用类型,用于节点间的数据传输。
标准数据帧采用 11-bit 标识,格式如下:
标准数据帧
扩展数据帧采用 29-bit 标识符 (11-bit Base ID + 18-bit Extension ID),用于大型网络,格式如下:
扩展数据帧
关键字段解析
帧结构由显性位(逻辑 0)起始,以连续的隐性位(逻辑 1)结束。完整的数据帧由七个功能段组成,依序为:帧起始、仲裁段、控制段、数据段、CRC 段、ACK 段及帧结束。
功能段 (Field) |
组成/位定义 |
技术说明 |
|---|---|---|
帧起始 (SOF) |
Start Of Frame,1 位 (显性) |
标识帧开始,用于硬同步。 |
仲裁段 |
ID, RTR, IDE, SRR |
|
控制段 |
DLC (4 位), r0/r1 |
DLC: Data Length Code,指示数据字节数 (0-8)。r0/r1 为保留位。 |
数据段 |
0-8 字节 |
有效载荷,MSB 先行。 |
CRC 段 |
CRC 序列(15 位) + 界定符 |
硬件计算校验码,界定符为隐性位。 |
ACK 段 |
ACK 槽 + 界定符 |
发送方发隐性,接收方拉低为显性以应答。 |
帧结束 (EOF) |
7 位 (隐性) |
标识帧结束,无位填充。 |
远程帧
用于接收节点向发送节点请求数据。与数据帧的主要区别在于: RTR 位为隐性 (1) 且 无数据段。格式如 标准远程帧 和 扩展远程帧 所示。
标准远程帧
扩展远程帧
错误帧
当节点检测到总线错误时发送,由错误标志 (6 bits) 和错误界定符 (8 bits) 组成。图 主动错误帧 和 被动错误帧 展示了两种帧格式。 由于不同节点可能在不同时间点检测到错误并发送错误帧,导致总线上的错误标志位叠加,最终的错误标志位间可能在 6 到 12 个位之间,可参考 错误检测和管理 获取详细信息。
主动错误帧
被动错误帧
过载帧
当接收节点未准备好接收下一帧数据时发送,用于在两帧之间插入额外延时。过载帧格式如下:
过载帧的发送时机可参考 发送过载帧。
帧间隔
帧间隔用于分隔数据帧和远程帧的帧。帧间隔格式如下:
数据帧和远程帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、远程帧、错误帧、过载帧)分开。
过载帧和错误帧前不能插入帧间隔。
其中:
Intermission:在前一帧报文(EOF 或 错误界定符)结束后,总线必须保持 3 个位的隐性电平(1)
Suspension:当发生错误时,
如果一个节点处于 主动错误 状态,节点发完一帧,休息完 3 bit 的 Intermission 后,可以立刻争抢总线发送下一帧
如果一个节点频繁出错,变成了 被动错误 状态,协议规定它在发完一帧后,必须额外多等 8 个隐性位(suspension)。
Bus idle:如果上面两个阶段都过完了,总线上依然没有数据,那就进入“空闲状态”。此时总线一直维持隐性(1)。任何节点只要想发数据,随时可以把电平拉低(0)来启动发送(即发送 SOF 位)。
位时序与同步机制
A2C 采用异步串行通信,收发双方需约定波特率。为解决时钟漂移和传输延迟问题,ISO11898 定义了基于 时间量子 (Time Quantum, Tq) 的位时序分解与同步机制。
Bit 分解
根据 ISO11898-1 标准,总线上的一个 Bit 时序分为四个段:
单个 Bit 分解后的最小单位是 Time quantum(Tq),单位大小为 prescaler/core clk,其中 core clk 是 A2C 的时钟源输入。一个完整的 Bit 位一般由 8-25 个 Tq 组成。
同步段 (Sync_Seg) :用于判断 总线上信号的跳变是否恰好在 Sync_Seg 段内,如果是,则表明通信节点和总线同步
传播段 (Prop_Seg) :用于补偿信号在物理线路上的传输延迟及收发器内部延迟。电信号在总线上传播需要时间,例如在总线仲裁阶段,如果未预留这时间,节点 A 发送的信号还未到达对面节点 B,节点 A 就开始采样,此时采样错误
相位缓冲段 1 (Phase_Seg1) :该段是采样前的弹性缓冲, 紧挨着采样点 。如果当前 Bit 的 Sync_Seg 发现信号跳变晚了(在 Sync_Seg 后面),说明当前 Bit 来得迟,为了不让采样点来得太早,因此需要延长此段
相位缓冲段 2 (Phase_Seg2) :该段是采样后的弹性缓冲。如果当前 Bit 的 Sync_Seg 发现信号跳变早了(快了),说明当前 Bit 的结束的太早,需要缩短 Phase_Seg2 来使得下一 Bit 可以被正确采样
采样点 (Sample Point) 位于 Phase_Seg1 的结束时刻。通过控制各段的长度,可以对采样点的位置进行偏移,以便准确采样。
下表给出了各个段的参考范围。
参数 |
取值范围 |
描述 |
|---|---|---|
位时间预分频器 (Prescaler) |
1 ~ 32 |
Tq = prescaler / core_clk |
Sync_Seg |
1 个 Tq (固定) |
同步总线上的各个 A2C 节点 |
Prop_Seg |
1 ~ 8 个 Tq |
补偿网络内的物理延迟时间 |
Phase_Seg1 |
1 ~ 8 个 Tq |
补偿边缘相位误差,在同步过程中可能会暂时延长 |
Phase_Seg2 |
2 ~ 8 个 Tq |
补偿边缘相位误差,在同步过程中可能会暂时缩短 |
SJW |
1 ~ 4 个 Tq |
不能长于任意一个相位缓冲段 (Phase_Seg1/2) |
通信波特率
A2C 节点的通信速率是传输单个 Bit 的 Tq 总数的倒数,例如时钟源是 40MHz,分频系数是 2,则单个 Tq 的时间是 0.05us。假设单个 Bit 占用 20 个 Tq,则波特率结果为:
同步过程
前面约定的每个数据 bit 的段划分,并未涉及到相位细节。根据 ISO11898 标准,同步分为:
硬同步 :仅在当存在“帧起始信号(SOF)”时起作用
重新同步 :在 SOF 后续信号时起作用
两者都使用 Sync_Seg 段来进行检测,同步的目的都是使节点内的 Sync_Seg 段把跳变沿包含起来
硬同步
当 总线空闲结束 时,第一个帧起始信号 SOF 到来。接收节点检测到总线的 SOF 不在节点内部时序的 SS 段范围,所以判断自己内部时序与总线不同步。此时接收节点会强行将 Bit Time 计数器清零,强行将 Sync_Seg 段对齐到 SOF 信号的下降沿。同步后采样便可正确进行。
硬同步
以图 硬同步 为例,
发送节点 Node_A 在发送 SOF 位时,SOF 位的下降沿在 SS 段
这个时候接收节点 Node_B 发现自己当前位的 SS 段和发送节点 SOF 位的 SS 段不同步。也就是说当 Node_A 产生 SOF 位 SS 段时,Node_B 的当前位的 SS 段已经在 5 个 Tq 之前产生了;
于是接收节点 Node_B 强行将自己当前位的 SS 段拉到与 SOF 位的 SS 段同步
重新同步
在帧传输过程中(除 SOF 跳变外),每次检测到 隐性到显性(高电平至低电平)的跳变沿 时进行重新同步。以总线跳变沿与 Sync_Seg 段的相对位置进行区分,重新同步可分为:
相位超前时的重新同步,如图 相位超前时的重新同步 所示。
发送节点 Node_A 比接收节点 Node_B 的慢,也就是 Node_A 当前位的 ss 段产生的时候,Node_B 当前 Bit 的 ss 段已经在 2 个 Tq 之前产生
所以这个时候接收节点 Node_B 就将 PBS1 延长 2 个 Tq 的时间
于是此时 Node_A 当前位的采样点就和 Node_B 的采样点同步
相位滞后时的重新同步,如图 相位滞后时的重新同步 所示。
发送节点 Node_A 当前位的 SS 段诞生 2Tq 时长之后,接收节点 Node_B 的当前位才产生 SS 段
于是,接收节点 Node_B 当前位的 PBS2 段缩短
这样就会导致接收节点 Node_B 的下一 Bit 能够提前 2 个 Tq,从而 Node_B 的下一 Bit 采样点和 Node_A 下一 Bit 的采样点能够同步。
相位超前时的重新同步
相位滞后时的重新同步
重新同步时,Phase_Seg1 增加和 Phase_Seg2 减少的这段时长被定义为 重新同步补偿宽度 SJW (reSynchronization Jump Width),单次同步的时候不能增加或减少超过 SJW 的时间长度。若有需要, 控制器会通过多次小幅度调整来实现同步。 当控制器设置的 SJW 较大时,可以吸收的误差加大,但通信速度会下降。
错误检测和管理
在总线上发送或者接收数据时,若通信节点检测到错误,会主动发起错误帧。前面章节介绍到错误帧除了发送 6Bit 的错误标志外,可能会有 0 ~ 6 Bit 的错误标志重叠的情况。在介绍错误帧之前,首先需要了解 ISO11898 标准中的位填充、错误类型及错误处理机制。
位填充 Bit Stuff
ISO11898 协议中规定,信号同步方式依赖于信号的边沿跳变,如果数据流中连续出现大量相同的逻辑电平(例如连续的 '1' 或连续的 '0'),会导致信号长时间不翻转。接收端此时将无法同步,导致采样点漂移,通信出错。 为解决上述问题,需要进行位填充,具体规则如下:
发送节点逻辑:在发送数据帧和远程帧时,在 SOF ~ CRC 字段内检测到连续 5 个相同极性的位时,会在其后自动插入一个极性相反的填充位(Stuff Bit)。
接收节点逻辑:在接收数据帧和远程帧时,在 SOF ~ CRC 字段内解码数据流时,如果检测到连续 5 个相同极性的位,会自动剔除(De-stuff)随后的那一个相反极性的位,从而恢复原始数据。如果第 6 为位电平和前 5 位相同,则视为填充错误。
示意图如下,填充标志位用橘色色块标记:
位填充示意图
错误类型
常见的错误类型如下表所示:
错误种类 |
错误原因 |
错误的检测范围 |
错误帧发送时机 |
检测单元 |
|---|---|---|---|---|
位错误 |
比较输出电平和总线电平(不含填充位),当两电平不一样时所检测到的错误。 |
|
下一位期间 (在检测到位错误的位之后,立即开始发送错误标志) |
发送单元 |
填充错误 |
在需要位填充的段内,连续检测到 6 位相同的电平时所检测到的错误。 |
|
下一位期间 (在检测到第 6 个连续相同位的时刻,立即开始发送错误标志) |
接收单元 |
CRC 错误 |
从接收到的数据计算出的 CRC 结果与接收到的 CRC 序列不同时所检测到的错误。 |
|
ACK 界定符之后 (在 ACK 界定符位之后,即 EOF 的第一位位置开始发送) |
接收单元 |
格式错误 |
检测出与固定格式的位段相反的格式时所检测到的错误。 |
|
下一位期间 (例外:如果是在 CRC 界定符检测到的格式错误,看作 CRC 错误,在 ACK 界定符后发送) |
发送单元 接收单元 |
ACK 错误 |
发送单元在 ACK 槽 (ACK Slot) 中检测出隐性电平时所检测到的错误(未收到接收节点的 ACK 显性电平 0)。 |
|
ACK 界定符之后 (在 ACK 界定符位之后,即 EOF 的第一位位置开始发送) |
发送单元 |
错误帧发送时机:
立即发送 (Next Bit):
位错误、填充错误、格式错误(绝大多数情况)一旦被检测到,节点会在下一位立即破坏当前传输,发送错误帧。这保证了数据的一致性,防止错误的扩散。
延迟发送 (After ACK Delimiter):
CRC 错误和 ACK 错误是在 ACK 界定符之后才发送错误帧。
CRC 错误: 接收节点虽然在 CRC 校验阶段就算出了错误,但它不会立即报错,而是会先发送一个 ACK(如果格式正确),或者不发送 ACK,等到 ACK 界定符结束后,才在 EOF 阶段拉低总线报错。这样做是为了不破坏其他可能正确接收到数据的节点的 ACK 过程。
ACK 错误: 发送节点发现没人应答(ACK Slot 为隐性),它会在 ACK 界定符之后发送错误帧。
备注
位错误不会发生在 ID 仲裁段、 ACK 槽以及发生被动错误时:
ID 仲裁阶段如果发送 1 但是收到 0,则认为仲裁丢失
ACK 槽位,发送端发送隐性电平 1,读回时仍然是 1,表明未收到应答
节点发送被动错误标志(连续 6bit 隐性位),却回读到显性位,不认为是位错误。
在 EOF 最后 1 bit 出现显性位,发送过载帧,而不是错误帧。
发送节点的产生错误一般有:位错误、格式错误、ACK 错误
接收节点的产生错误一般有:填充错误、格式错误、CRC 错误
错误处理机制
当 A2C 通信节点检测到错误时,根据内部错误计数器(TEC 和 REC)的数值变化,会在以下三种状态之间自动切换。
错误状态跳转
备注
TEC: 发送错误计数器 (Transmit Error Counter)
REC: 接收错误计数器 (Receive Error Counter)
下表总结了各状态的进入条件及行为特性。
错误状态 |
进入条件 (阈值) |
错误标志类型 |
通信与行为特性 |
|---|---|---|---|
主动错误 (Error Active) |
TEC ≤ 127 且 REC ≤ 127 |
主动错误标志 (6 个连续显性位) |
|
被动错误 (Error Passive) |
TEC > 127 或 REC > 127 |
被动错误标志 (6 个连续隐性位) |
|
总线关闭 (Bus Off) |
TEC > 255 |
无 (禁止发送) |
|
错误计数器的变动在检测到错误标志的 第一位 时触发,一次数据发送/接收可能同时满足多个条件,错误计数值可能被多次调整。下表列出了计数规则变动条件:
序号 |
触发条件 |
TEC (发送) |
REC (接收) |
|---|---|---|---|
1 |
接收单元检测到出错 (例外:接收单元在错误帧的标志位或者过载帧标志位检测到“位错误”,接收计数不变) |
— |
+1 |
2 |
接收单元发完错误标志后首位为显性 |
— |
+8 |
3 |
发送单元在输出错误标志位时出错 |
+8 |
— |
4 |
发送单元在发送主动/过载标志期间检测到位错误 |
+8 |
— |
5 |
接收单元在发送主动/过载标志期间检测到位错误 |
— |
+8 |
6 |
各单元从主动错误标志、过载错误标志的最开始检测出连续 14 个显性位之后,每连续检测到 8 个显性位时 |
+8 |
+8 |
7 |
检测到被动错误标志后追加连续 8 个显性位时 |
+8 |
+8 |
8 |
正常发送成功 (ACK 且无错且 EOF 结束时仍未出错) |
-1 |
— |
9 |
接收成功 (CRC 无错且正常回读到 ACK) |
— |
若 REC > 127,接收成功时置为 127;若 REC = 0,保持 0;否则 -1 |
10 |
总线关闭恢复 (检测到 128 次 × 11 个隐性位) |
置 0 |
置 0 |
发送错误帧
错误标志未重叠:下图 错误标志未重叠 展示了节点 A 发送时检测到“位错误”,然后节点 B 检测到连续 6 个相同的显性电平产生“填充错误”,此时总线上节点 A 的错误标志位和节点 B 的错误标志位并未重叠
错误标志未重叠
错误标志重叠:下图 错误标志重叠 展示了节点 A 产生了“位错误”,节点 B 检测到连续 6 个相同的显性电平,产生填充错误。两个节点的主动错误标志重叠 2 位,剩下部分还有 4 位。
错误标志重叠
发送过载帧
过载帧的标志位是连续 6Bit 的显性电平 0,会破坏总线上其他节点的发送过程,导致其他节点不能正常发送报文,变相推迟了其他节点的发送。 以下三种情况下需要发送过载帧:
接收节点内部未就绪:接收节点由于自身处理速度限制或缓冲区限制,尚未准备好接收下一帧数据,会在帧间隔(Intermission)的第一位发送过载帧,强行拉长空闲时间。
接收节点在帧间隔(Intermission)的第 1 位或第 2 位检测到显性位 :正常的帧间隔应至少包含 3 个连续的隐性位。若在前两位出现显性位,通常意味着有节点提前发送了报文(时序错误)或总线出现了干扰。此时节点会发送过载帧来处理这种异常同步。
接收节点在错误界定符 (Error Delimiter) 或 过载界定符 (Overload Delimiter) 的 第 8 位(最后一位)检测到了显性位 (Dominant, 0):界定符的标准格式是 8 个连续的隐性位。如果在最后一位检测到显性位,被视为下一帧报文过早开始(或者前一帧未能正确结束)。在这种特定情况下触发的过载帧,不会增加节点的错误计数器。
帧结束 (EOF) 最后一位检测到显性位 :由于 EOF 前 6 位已通过检查,协议判定 当前帧接收有效 (Valid),不作为格式错误处理。
备注
错误计数器:过载帧的发送是“无害”的,它 不会 增加节点的发送错误计数器 (TEC) 或接收错误计数器 (REC)。
数量限制:为了防止总线被永久阻塞,控制器通常限制连续发送过载帧的次数(通常最多允许 2 帧延时)。
A2C 配置
时钟源配置
A2C 的时钟源依赖 XTAL(40MHz),用户可调用 A2C_CoreClockSet() 来设置 XTAL 作为时钟源。
波特率与位时序参数配置
前面已经提到 A2C 总线的一个位(Bit)由四个时间段组成。为简化配置,A2C 控制器将传播段 (Prop_Seg)、相位缓冲段 1 (Phase_Seg1)合并为 TSEG1 ,将相位缓冲段 2 (Phase_Seg2)称为 TSEG2 。
备注
TSEG1 的设定是传播段 (Prop_Seg)、相位缓冲段 1 (Phase_Seg1)之和。
以 时钟源为 40MHz,要求 A2C 的通信速率为 1Mbaud/s ,采样点在 80%为例 ,各个段参数值计算如下:
采样点公式
采样点计算公式如下:
满足 80%比例关系(4/5)的值有 8/10、12/15、16/20、20/25。
而单个 Bit 的 Tq 数量为:
前面提到单个 Bit 总的 Tq 数量一般在 8 ~ 25,所以总 Tq 数量可选 10 或者 20,方便计算。
若选择 Tq 总数为 10,此时可以得到
则 TSEG1 = 8 - 1 = 7 和 TSEG2 = 10 - 7 - 1 = 2 。
SJW 的值通常在 1 ~ 4 Tq,且不超过 TSEG1 和 TSEG2 的较小值。在此例中推荐设置为 1 Tq。
Bit 时序参数设置
波特率计算公式如下:
已知 1Mbps 速率下,时钟源为 40MHz,总 Tq 数为 10,则分频系数 BRP 为 4。
则可以配置以下各个段参数为:
参数 |
物理值 |
寄存器 |
备注 |
|---|---|---|---|
Clock |
40 MHz |
XTAL作为时钟源 |
|
BRP |
4 |
3 |
tq = 100ns |
NBT |
10 tq |
总位宽 |
|
TSEG1 |
7 tq |
6 |
包含 PropSeg + PhaseSeg1 |
TSEG2 |
2 tq |
1 |
PhaseSeg2 |
SJW |
1 tq |
1 |
|
结果 |
80% |
实际采样点 (1+7)/10 = 80% |
实际使用过程中,用户可直接调用 A2C_CalcBitTiming() 来计算目标波特率所需要的各个参数。
三点采样
当使能三点采样模式后,A2C 控制器会在三个不同的点对输入信号进行采样,每个采样点之间间隔 Tq,如下图所示。最终的逻辑电平由三个采样点中的多数电平决定。该方法可以有效地滤除信号中的毛刺,提高系统鲁棒性。
备注
一般在低速率模式(低于 125Kbps)下建议开启三点采样,此时每个 Tq 的时长较长,更容易因为外部毛刺而产生电平突变。
报文收发设置
A2C 模块通过管理报文(消息)缓冲区(message buffer,简称 MB)实现报文的发送和接收(包含过滤)。A2C 提供了一组寄存器作为公共接口(以下简称 RAM 接口 )来管理 消息缓冲区,如下图所示。
报文缓冲区管理
A2C 模块配备独立的 RAM 空间(352 × 32 bits),被划分为 16 个报文缓冲区(MB0~MB15),默认每个缓冲区占用 6 × 32 bits。
容量配置 : 每个缓冲区仅存储一条报文,但其大小可独立配置。
地址分配 : 设置每个缓冲区的基地址(Base Address)。 若 MB0 基地址设为 0x0,MB1 基地址设为 0x6,则 MB0 的大小即为 6 × 32 bits。
容量边界: 整个 RAM 的有效范围可单独指定。
报文发送和接收
报文发送流程
选定缓冲区:选择想要使用的消息缓冲区并使能
填充数据:将待发送的数据、ID、DLC 以及帧属性(IDE, RTR)写入 RAM 接口
配置模式:设定为发送模式
写入缓冲区:将上述参数设定和数据写入消息缓冲区
状态更新:消息缓冲区的状态位自动更新,以及上报中断(如果使能发送中断)
报文接收流程
选定缓冲区:选择想要使用的消息缓冲区并使能
配置过滤规则:设置 RAM 接口 的 ID、掩码(MASK)、IDE 和 RTR 位,定义该缓冲区期望接收的报文特征
配置模式:设定为接收模式
写入缓冲区:将上述参数设定写入消息缓冲区
数据接收和存储:当总线收到报文并通过 CRC 校验后,处理器扫描所有接收缓冲区,执行过滤匹配。若匹配成功且无错误,报文存入对应缓冲区。
状态更新:消息缓冲区的状态位自动更新,以及上报中断(如果使能接收中断,用户可在中断内读取缓冲区报文)。
有关 A2C 的使用示例可参考 A2C example。
缓冲区优先级
当多个缓冲区同时满足发送或接收条件时,硬件依据缓冲区编号(0-15)执行仲裁:
发送优先级 (Tx Priority): 低编号优先。编号越小(如 MB0),发送优先级越高。
接收优先级 (Rx Priority): 高编号优先。编号越大(如 MB15),在接收匹配时的优先级越高。
报文过滤设定
ISO11898 标准采用广播通信机制,总线上没有物理地址的概念。节点通过 “报文过滤” 机制来决定是否接收总线上的数据帧。
A2C 模块可通过组合设置 接收标识符(ID) 和 接收掩码(Acceptance Mask) ,实现硬件级报文筛选,减轻 CPU 处理非相关报文的负担。
配置寄存器如下图所示:
A2C 报文过滤设置
接收所有报文
仅设置 ARB 寄存器的接收标识符,不配置 MASK 接收掩码。这表明无需关注接收标识符设置,接收所有报文
接收部分报文
设置 ARB 和 MASK 寄存器的接收标识符,配置 MASK 掩码。例如图 A2C 报文过滤设置,过滤标准帧时,如果 ARB 中的位 [28:18] 设置为 0x1,MASK 中的位 [28:18] 设置为 0x7FC,表明标准帧的 ID 低两位无需严格匹配,基址 ID 0x00、0x01、0x02 和 0x03 都将被接收。
接收指定报文
设置 ARB 寄存器的接收标识符,并配置 MASK 所有掩码位为 1。此时将严格匹配接收 ID,只有指定 ID 的报文可以被接收。
小技巧
用户还可以设定 MASK 中的以下属性来进一步匹配帧类型:
RTR 属性:是否严格匹配 ARB 中的 RTR 设定(接收数据帧还是远程帧)
IDE 属性:是否严格匹配 ARB 中的 IDE 设定(接收标准帧还是扩展帧)
FIFO 模式
A2C 支持将 RAM 顶部的 4 个缓冲区(MB12~MB15)合并为一个先进先出(FIFO)队列,以增强连续接收能力。
启用机制 : 启用 FIFO 后,MB12~MB15 被保留作为 FIFO 存储空间。
过滤规则 : FIFO 统一使用 MB12 的配置(ID, IDE, RTR 及掩码)作为过滤标准。
最高优先级 : FIFO 拥有最高的接收优先级,高于普通接收缓冲区。
溢出处理 : 当 FIFO 已满(MB12~MB15 均有数据)且收到新报文时,FIFO 执行滚动覆盖策略。最早接收的数据(原 MB12)将丢失,原 MB13 的数据移至 MB12,以此类推,新报文将被存入 MB15。同时触发溢出状态标志。
状态监控 (A2C_FIFO_STS):
fifo_msg_empty: FIFO 为空fifo_msg_full: FIFO 已满(存有 4 帧未读报文)fifo_msg_overflow: 溢出(满状态下继续接收新报文)fifo_msg_lvl: 当前 FIFO 内的报文数量
备注
FIFO 模式已经默认开启,如不需要可关闭。
使用 DMA 接收报文
A2C 模块支持通过通用直接内存访问控制器(GDMA)进行数据接收,并且支持两种流控模式:由 GDMA 作为流控制器,或由 A2C 作为流控制器。
当启用 DMA 时,消息缓冲区(Message Buffer )中的数据,包含仲裁段(ARB)、控制段(CS)及数据段(DATA),会依次通过 GDMA 传输至目标 Memory 地址。
配置过程如下:
A2C 侧配置:
在 Rx DMA 配置寄存器中,设置 Rx DMA 所有权的归属,并配置
rxdma_src_msize,通常设为 1。rxdma_owner = 0,所有权属于 GDMArxdma_owner = 1,所有权属于 A2C
在要使用的消息缓冲区控制寄存器中,使能该 Buffer 的 DMA 功能
在 A2C 全局控制寄存器中,开启 Rx DMA 使能。
GDMA 侧配置:
配置 GDMA 的源地址、目标地址、DMA 传输方向、块大小 (block size) 等参数。
备注
Rx DMA 每次传输操作仅针对一个 Message Buffer。
GDMA 的 Source Burst 大小 必须与 A2C 侧配置的
rxdma_src_msize保持一致。
自动重传
ISO 11898-1 标准规定,如果控制器在发送报文过程中未能成功发送(即未收到 ACK、发生错误或仲裁失败),控制器可配置自动重新发送该报文。使能自动重传后,软件只需写入一次发送请求,硬件会自动处理后续的重传逻辑。这一过程对上层软件(Application Layer)通常是透明的。
备注
不支持设定具体的重传次数。
使能自动重传
在 A2C 模块中, A2C_AutoReTxEn 控制位用于决定是否遵循标准的 ISO 自动重传流程:
使能 (
A2C_AutoReTxEn= 1): 标准模式 。当发送失败(如仲裁丢失或产生发送错误)时,硬件会自动重新参与总线竞争,尝试再次发送同一帧报文,直到发送成功或节点因错误过多进入“总线关闭(Bus Off)”状态。禁止 (
A2C_AutoReTxEn= 0): 单次发送模式 。A2C 控制器只尝试发送一次报文。无论发送成功与否(即使发生错误或丢失仲裁),硬件都不会尝试重传。
触发自动重传的场景
当自动重传功能使能时,以下三种场景会触发重传:
仲裁丢失 (Arbitration Lost) :
当前节点在发送 ID 阶段,检测到总线电平与自己发送的电平不一致(自己发隐性 1,总线显性 0),说明有更高优先级的节点正在发送。当前节点立即停止发送,转为接收状态。一旦总线空闲,硬件会立即再次尝试发送该报文。
发送错误 (Transmission Error) :
发送过程中检测到位错误(Bit Error)、填充错误(Stuff Error)、格式错误(Form Error)或 CRC 错误,发送节点会发送错误帧破坏当前传输,待总线空闲时重新发送。
应答错误 (ACK Error) :
发送节点在 ACK Slot 发送隐性电平(1),但总线上没有检测到显性电平(0)。这意味着总线上没有任何节点正确响应该报文(即回复 ACK)。发送节点判定为 ACK Error,随后发送错误帧。待总线空闲时,重新发送该报文。
低功耗唤醒
A2C 模块支持低功耗休眠模式,休眠类型仅 支持 CG(Clock gating)模式 。在此模式下,模块的主时钟停止,但内部集成的 唤醒检测电路 仍然工作。
A2C 使用低频时钟 (OSC4M) 驱动唤醒电路。当 CPU 及 A2C 模块进入休眠模式时,系统需保持 OSC4M 处于开启状态以支持监测功能。有关休眠模式配置可参考 省电配置 。
唤醒示意图
唤醒电路的工作流程如下:
启用条件:
唤醒检测仅在 A2C 进入休眠模式(
a2c_sleep_en置位)且唤醒滤波功能开启(a2c_wakepin_flt_en置位)时有效。检测原理:
电路持续监测 Rx 引脚上显性电平持续时长,与预设的阈值
a2c_wakepin_flt_length比较,判断是否为有效的唤醒信号。如 唤醒示意图 所示,显性电平持续时长 t(即 Rx pin 上的逻辑电平 0 的持续时长) 大于设定的阈值(a2c_wakepin_flt_length/OSC4M),即可唤醒 A2C 模块及整个系统。触发动作:
唤醒:如果检测到的显性电平持续时间超过预设阈值,唤醒电路将生成唤醒信号,重新激活 A2C 模块及整个系统。
保持:如果显性电平持续时间未达到阈值,模块与系统继续保持休眠状态
备注
唤醒时并不关心协议帧的具体内容 :唤醒 A2C 模块的显性电平来自一笔有效协议帧,该协议帧无法被接收。
唤醒时收发器应正常工作:部分收发器可能有待机/休眠(standby/sleep)模式,确保唤醒 A2C 模块前,收发器已经正常工作。
唤醒与丢包(Wake-up & Frame Loss):
由于系统从休眠恢复到主时钟稳定需要一定时间,A2C 模块 必然会错过触发唤醒的那一帧报文 。后续能否收到数据取决于发送方的重传机制:
若总线上无其他节点应答(ACK) :
发送节点因未收到 ACK 而判定发送失败,若其使能了自动重传机制,会立即重发该帧。此时 A2C 模块已完成唤醒初始化,可以正常接收这笔 重传 的报文。
若总线上有其他节点应答(ACK) :
发送节点收到 ACK 后认为报文发送成功,不会重传。此时,当前节点(A2C)虽然被成功唤醒,但 无法接收到该帧数据 (即发生了单帧丢失)。
测试模式
测试模式有两种,分为:
静默模式(Silence):即 ISO11898-1 中的总线监控模式 (Bus Monitoring Mode),用于在不干扰总线的情况下分析流量。可正常接收所有帧,但是模块不会发送任何帧、也不会发送 ACK。
回环模式:用于验证 A2C 控制器本身是否工作正常,可细分为
外部回环模式:该模式下,数据帧会被发送到 TX 端,可通过外部分析仪抓取协议帧
内部回环模式:该模式数据帧完全在 A2C 控制器内部传输,不会被发送到外部
静默模式
外部回环模式
内部回环模式