CAN FD
FD CAN (Flexible Data-Rate) is an extension of the original CAN protocol that allows for higher data rates and larger payloads. It was introduced to meet the increasing demands of modern automotive and industrial applications.
此笔记面向 RM 支持 CAN FD 的微控制器,介绍 CAN FD 协议的基本概念和特性。
Data & Context from BV1dtfRBZEGm
特性
- 灵活的数据速率:CAN FD 数据段支持最高 5 Mbps 的数据速率,而传统的 CAN 仅支持最高 1 Mbps。
- 更大的数据负载:CAN FD 允许每个数据帧携带最多 64 字节的数据,而传统的 CAN 仅支持最多 8 字节。
- 兼容性:CAN FD 设计为向后兼容,可以与传统的 CAN 设备共存。这意味着在同一网络中,CAN FD 设备可以与传统 CAN 设备通信,但只能以传统 CAN 的速率和数据负载进行通信。
FD_CAN是 CAN FD 的一个实现,提供了对 CAN FD 协议的支持,使得开发者能够在其应用中利用 CAN FD 的优势。注意: 若需要使用 CAN FD 功能,必须要使总线下的所有设备都支持 CAN FD,否则通信将出错。
FD_CAN Frame
FD_CAN 标准帧
| 字段 | 内容 | 长度 | 描述 |
|---|---|---|---|
| 仲裁段 | ID | 11 | 标识 CAN ID |
| 仲裁段 | R | 1 | 保留位,0 |
| 控制段 | IDE | 1 | 标识符扩展位,0 |
| 控制段 | EDL | 1 | FD 帧标记,1 |
| 控制段 | R0 | 1 | 保留位,1 |
| 控制段 | BRS | 1 | 数据段变比特率标记。若为 1,则后续内容直至校验段前不包括校验段,使用高波特率。若为 0,后续采样相同波特率。 |
| 控制段 | ESI | 1 | 错误状态指示,若为 1,则遇到了至少 128 个错误。若为 0,则错误不足 128 个。 |
| 控制段 | DLC | 4 | 数据长度字节数,默认 CAN 2.0 为 8 |
| 数据段 | Data | 0-8 / 12 / 16 / 20 / 24 / 32 / 48 / 64 | 数据内容 |
| 校验段 | CRC | 17 / 21 | 数据长度不大于 16 字节,则为 17 位,否则为 21 位 |
| 校验段 | CRC delimiter | 1 | 结束,1 |
FD_CAN 扩展帧
~略~
配置
基础配置
- 帧格式(Freme Format)
- 经典
- 无 FD 的 FD 模式
- FD 模式
- 收发模式(Mode)
- 常规:正常发送和接收,主动发送 ACK
- 限制操作:只收不发,主动发送 ACK
- 总线监控:只收不发,不发送 ACK
- 内部回环:隔离式自发自收,发送的帧不进入总线。
- 外部回环:自发自收,回环主动 ACK 应答
- 自动重传(Auto Retransmission)
- 使能:发送失败后自动重试,直到成功或达到最大重试次数
- 禁止:发送失败后不重试,直接丢弃帧
- 传输停止(Transmit Pause)
- 使能:发送完成后进入暂停状态,等待下一次触发
- 禁止:发送完成后立即准备发送下一帧
- 协议异常处理(Protocol Exception)
- 使能:当检测到协议异常时,自动进入错误状态,进行错误帧发送干扰信道
- 禁止:当检测到协议异常时,不自动进入错误状态
时间片配置
- 时钟校准:异步默认关闭
- 同步跳转宽度:时间片校准用,自动对齐最大跳转宽度,单位为时间片
- 常规段与数据段
- 总线时钟树 120 MHz
- 分配 3,FD_CAN 外设 40 MHz
- 时间片 25 ns,共 40 个时间片
- 缓冲段 1 与缓冲段 2 分别 29 个时间片和 10 个时间片
- 采样点 ~ 75%
存储空间配置
分配内存起始地址,共 10240 字节。
- 滤波器
- 发送标准帧:1 字(4 字节),每个 FD_CAN 最多 128 个
- 发送扩展帧:2 字(8 字节),每个 FD_CAN 最多 64 个
- 接收区(两条接收 FIFO、一个专用 Buffer)
- 一个接收缓冲机制至多 18 字 RAM 空间,两种缓冲机制总共每个 FD_CAN 最多 64 个
| Data field (Bytes) | Element size (RAM words) |
|---|---|
| 0 ~ 8 | 4 |
| 12 | 5 |
| 16 | 6 |
| 20 | 7 |
| 24 | 8 |
| 32 | 10 |
| 48 | 14 |
| 64 | 18 |
e.g. 若有 16 FIFO0,每个 8 字节,则需要 $16 * 4 = 64$ 字 RAM 空间;若有 8 FIFO1,每个 32 字节,则需要 $8 * 10 = 80$ 字 RAM 空间;若有 8 Buffer,每个 64 字节,则需要 $8 * 18 = 144$ 字 RAM 空间。总共需要 288 字 RAM 空间,约占总内存的 2.8%。
- 发送区(一条发送 FIFO,一个专用 Buffer)
- 一个发送缓冲机制至多 18 字 RAM 空间,两种缓冲机制总共每个 FD_CAN 最多 32 个
- FIFO 状态
- 仲裁队列:发送前内部仲裁
- 严格队列:发送前严格按照顺序
- 发送事件记录
- 记录元数据等,不存储数据内容
- 每个发送事件记录占用 2 字 RAM 空间,每个 FD_CAN 最多 32 个
| Data field (Bytes) | Element size (RAM words) |
|---|---|
| 0 ~ 8 | 4 |
| 12 | 5 |
| 16 | 6 |
| 20 | 7 |
| 24 | 8 |
| 32 | 10 |
| 48 | 14 |
| 64 | 18 |
e.g. 若有 8 FIFO,每个 8 字节,则需要 $8 * 4 = 32$ 字 RAM 空间;若有 8 Buffer,每个 64 字节,则需要 $8 * 18 = 144$ 字 RAM 空间。总共需要 208 字 RAM 空间,约占总内存的 2.0%。
- Messang RAM Offset:消息 RAM 起始地址
- 不可超过 2560 字(10240 字节),否则会与寄存器地址空间重叠,导致访问错误
- 分隔间隔起 0 ~ 97 ~ 194 分割偏移,或使用 2560 均分。
如果使用三个 FD_CAN 则每个分配 $\frac{2560}{3} = 853.33$,故分配起始点为 0、853 和 1706。
