ZHCAF63 June   2024 MSPM0G3507

 

  1.   1
  2.   摘要
  3.   商标
  4. 1引言
    1. 1.1 连接 CAN 和 I2C 的桥接器
  5. 2实施
    1. 2.1 原理
    2. 2.2 结构
  6. 3软件说明
    1. 3.1 软件功能
    2. 3.2 可配置参数
    3. 3.3 自定义元件的结构
    4. 3.4 FIFO 的结构
    5. 3.5 I2C 接收和传输(透明传输)
    6. 3.6 I2C 接收和传输(协议传输)
    7. 3.7 CAN 接收和传输
    8. 3.8 应用集成
  7. 4硬件
  8. 5应用程序方面
    1. 5.1 结构灵活
    2. 5.2 I2C 的可选配置
    3. 5.3 可选的 CAN 配置
    4. 5.4 CAN 总线多节点通信示例
  9. 6总结
  10. 7参考资料

结构

具有协议传输和透明传输功能的 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 中所示。

 CAN FD 帧图 2-2 CAN FD 帧
表 2-1 CAN 数据包格式
ID 区域 数据
协议传输 4/1/0 个字节 (数据长度)字节

对于 I2C 协议传输,基于串行帧信息来识别消息。表 2-2 中列出了 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_iddestination_iddata lengthdata。用户还可以根据应用程序要求来更改消息项目。此外,该方案还会检查 FIFO 是否已满,以进行过载控制。用户可以在需求变化时添加过载控制操作。

CAN 和 I2C 传输均在主函数中执行。当检测到 FIFO 不为空时,将提取 FIFO 元素。消息经格式化后发出。对于 CAN,CAN 帧为固定格式,如 表 2-1 中所示。对于 I2C,消息以 表 2-2 中所列格式发送。

 CAN-I2C(I2C 控制器)桥接器的结构:协议和透明图 2-3 CAN-I2C(I2C 控制器)桥接器的结构:协议和透明
 CAN-I2C(I2C 目标)桥接器的结构:协议和透明图 2-4 CAN-I2C(I2C 目标)桥接器的结构:协议和透明

图 2-5 展示了 FIFO 的结构。每个 FIFO 使用三个全局变量来指示 FIFO 状态。对于 gI2c2Can_FIFOgI2c2Can_FIFO.fifo_in 表示写入位置,gI2c2Can_FIFO.fifo_out 表示读取位置,gI2c2Can_FIFO.fifo_Count 表示 gI2c2Can_FIFO 中的元素数量。

如果 gI2c2Can_FIFO 为空,则 gI2c2Can_FIFO.fifo_in 等于 gI2c2Can_FIFO.fifo_outgI2c2Can_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_FIFOgI2c2Can_FIFO 类似。

 FIFO 的结构图 2-5 FIFO 的结构