ZHCAF59 March 2025 MSPM0G3507
可以在 图 2-3 中看到具有协议传输功能的 CAN-UART 桥接器的结构。CAN-UART 桥接器可以分为四个独立的任务:从 UART 接收、从 CAN 接收、通过 CAN 传输、通过 UART 传输。两个 FIFO 实现双向消息传输和消息缓存。
图 2-4 展示了具有透明传输功能的 CAN-UART 桥接器的结构。添加了计时器中断,用于在一个数据包结束时检测超时。
UART 和 CAN 接收均设置为中断触发,以便能及时接收消息。进入中断时,首先通过 getXXXRxMsg() 提取消息。
对于 CAN,CAN 帧是固定格式。MSPM0 支持传统 CAN 或 CANFD。CANFD 的帧如 图 2-2 所示。本文中的示例可以在数据区域中为协议传输定义零、一和四个字节的附加 ID。
图 2-2 CAN FD 帧| ID 区域 | 数据 | |
|---|---|---|
| 协议传输 | 4/1/0 字节 | (数据长度)字节 |
对于 UART 协议传输,根据串行帧信息来识别消息。UART 消息格式在 UART 数据包格式中列出。
| 报头 | ID 区域 | 数据长度 | 数据 | |
|---|---|---|---|---|
| 协议传输 | 0×55 0×AA | 4/1/0 字节 | 1 字节 | (数据长度)字节 |
| 透明传输 | — | — | — | (数据长度)字节 |
报头是一个固定的十六进制数字,组合为 0x55 0xAA,表示组的开头。ID 区域默认占用四个字节以匹配 CAN ID,可配置为一个字节,或者 ID 区域不存在。数据长度区域占用一个字节。数据长度区域之后是特定长度的数据。此格式作为示例提供。用户可以根据应用的要求修改格式。
对于 UART 透明传输,发生超时时会识别消息。所有字节都被视为纯数据。默认值是数据包信息的装载。(例如 ID)。
收到消息后,processXXXRxMsg() 转换消息的格式,并将消息作为新元素存储在 FIFO 中。FIFO 元素的格式如 图 2-5 所示。在 FIFO 元素的格式中,FIFO 元素中有四个类别:来源 ID、目标 ID、数据长度 和数据。用户还可以根据应用的要求更改消息项目。此外,该方案还会检查 FIFO 是否已满以进行过载控制。用户可以根据应用要求添加过载控制操作。
CAN 和 UART 传输均在主函数中执行。当检测到 FIFO 非空时,将提取 FIFO 元素。消息将被格式化并发送。对于 CAN,CAN 帧是固定格式。对于 UART,消息以 CAN 数据包格式中所述的格式发送。在本文的设计中,使用 UART TX 中断将数据填充到 UART TX 缓冲区中。
FIFO 结构如 图 2-5 所示。每个 FIFO 使用三个全局变量来指示 FIFO 状态。gUart2Can_FIFO, gUart2Can_FIFO.fifo_in 指示写入位置,gUart2Can_FIFO.fifo_out 指示读取位置,gUart2Can_FIFO.fifo_Count 指示 gUart2Can_FIFO 中的元素数量。
如果 gUart2Can_FIFO 为空,gUart2Can_FIFO.fifo_in 等于 gUart2Can_FIFO.fifo_out,并且 gUart2Can_FIFO.fifo_count 为零。
执行 processUartRxMsg() 时,来自 UART 的新消息将存储到 gUart2Can_FIFO 中。因此,gUart2Can_FIFO.fifo_in 会移动到下一个位置,并且 gUart2Can_FIFO.fifo_count 会递增 1。
将消息从 gUart2Can_FIFO 传输到 CAN 时,gUart2Can_FIFO.fifo_out 会移动到下一个位置,而 gUart2Can_FIFO.fifo_count 会减去 1。gCan2Uart_FIFO 与 gUart2Can_FIFO 类似。