ZHCAF63 June 2024 MSPM0G3507
具有协议传输和透明传输功能的 CAN-I2C 桥接器的结构如 图 2-3 和 图 2-4 所示。图 2-3 适用于 I2C 主机,图 2-4 适用于 I2C 从机。CAN-I2C 桥接器可以分为四个独立的任务:从 I2C 接收、从 CAN 接收、通过 CAN 传输、通过 I2C 传输。两个 FIFO 实现双向消息传输和消息缓存。
I2C 和 CAN 接收均设置为中断触发,以便及时接收消息。进入中断时,首先通过 getXXXRxMsg() 获取消息。
对于 CAN,CAN 帧是固定格式。MSPM0 支持传统 CAN 或 CANFD。CANFD 的帧如 图 2-2 所示。本文中的示例可以针对协议传输在数据区域中定义 0/1/4 个附加字节(I2C 地址的默认长度为一个字节),如 表 2-1 中所示。
图 2-2 CAN FD 帧| ID 区域 | 数据 | |
|---|---|---|
| 协议传输 | 4/1/0 个字节 | (数据长度)字节 |
对于 I2C 协议传输,基于串行帧信息来识别消息。表 2-2 中列出了 I2C 消息格式。
| 接头 | ID 区域 | 数据长度 | 数据 | |
|---|---|---|---|---|
| 协议传输 | 0x55 0xAA | 4/1/0 字节 | 1 字节 | (数据长度)字节 |
| 透明传输 | — | — | — | 主件到从件 — (数据长度)字节 从机到主机 — (I2C_TRANSPARENT_LENGTH) 字节 |
标头是一个固定的十六进制数,与 0x55 0xAA 组合在一起,表示组的开头。ID 区域默认占用四个字节以匹配 CAN ID,我们可将其配置为一个字节或 ID 区域不存在。数据长度区域占用一个字节。在数据长度区域之后,会跟随一定长度的数据。此格式作为示例提供。用户可以根据应用需求来修改格式。
请注意,在 I2C 这种通信方法中,由 I2C 主机来控制消息传输和接收。通常,I2C 从件无法发起通信。对于 I2C 从机到主机通信,I2C 从机可以在需要发送消息时下拉 IO,如 图 2-4 中所示。当检测到 IO 为低电平时,I2C 主机可以在 IO 中断中启动 I2C 读取命令,如 图 2-3 中所示。
在 I2C 透明传输中,通过 I2C 停止中断来标识消息,如 图 2-4 中所示。所有字节均视为纯数据。加载数据包信息(例如 ID)的默认值。
收到消息后,processXXXRxMsg() 会转换消息的格式,并将消息作为新元素存储在 FIFO 中。图 2-5 显示了 FIFO 元素的格式。在 FIFO 元素的格式中,有 origin_id、destination_id、data length 和 data。用户还可以根据应用程序要求来更改消息项目。此外,该方案还会检查 FIFO 是否已满,以进行过载控制。用户可以在需求变化时添加过载控制操作。
CAN 和 I2C 传输均在主函数中执行。当检测到 FIFO 不为空时,将提取 FIFO 元素。消息经格式化后发出。对于 CAN,CAN 帧为固定格式,如 表 2-1 中所示。对于 I2C,消息以 表 2-2 中所列格式发送。
图 2-5 展示了 FIFO 的结构。每个 FIFO 使用三个全局变量来指示 FIFO 状态。对于 gI2c2Can_FIFO,gI2c2Can_FIFO.fifo_in 表示写入位置,gI2c2Can_FIFO.fifo_out 表示读取位置,gI2c2Can_FIFO.fifo_Count 表示 gI2c2Can_FIFO 中的元素数量。
如果 gI2c2Can_FIFO 为空,则 gI2c2Can_FIFO.fifo_in 等于 gI2c2Can_FIFO.fifo_out,gI2c2Can_FIFO.fifo_count 为零。
执行 processI2cRxMsg() 时,来自 I2C 的新消息将存储到 gI2c2Can_FIFO 中。因此,gI2c2Can_FIFO.fifo_in 会移动到下一个位置,并且 gI2c2Can_FIFO.fifo_count 会递增 1。
从 gI2c2Can_FIFO 向 CAN 传输消息时,gI2c2Can_FIFO.fifo_out 会移动到下一个位置,而 gI2c2Can_FIFO.fifo_count 减 1。gCan2I2c_FIFO 与 gI2c2Can_FIFO 类似。