通常,I2C 主机控制 I2C 通信,I2C 从机无法触发从机到主机的通信。在本设计中,使用了另一个 IO。从机的 IO 下拉会通知主机要发送信息。用户可以根据需要修改引脚或删除 IO 功能。
对于 I2C 接收,
bridge_i2c.c 中定义了两个全局变量。
uint8_t gI2CReceiveGroup[I2C_RX_SIZE];
Custom_Element gI2C_RX_Element;
下面是 I2C 主机接收的过程。IO 中断用于检测 IO 下拉。
- 在 IO 中断中,调用 readI2CRxMsg_controller() 向 I2C 从机发送读取请求。
- 调用 getI2CRxMsg_controller() 以检测标头,从而将完整消息存储在 gI2cReceiveGroup 中。
- 调用 processI2CRxMsg_controller(),从 gI2cReceiveGroup 中提取数据,并将数据存储在 gI2C_RX_Element 中
- 将 gI2C_RX_Element 放入 gI2c2Can_FIFO 中。
下面是 I2C 从机接收的过程。
- 调用 getI2CRxMsg_target(),将消息存储到 gI2cReceiveGroup 中。
- 调用 processI2CRxMsg_target(),从 gI2cReceiveGroup 中提取数据,并将数据存储到 gI2C_RX_Element 中。
- 将 gI2C_RX_Element 放入 gI2c2Can_FIFO 中。
对于 I2C 传输,bridge_i2c.c 中定义了四个全局变量。
uint8_t gI2cTransmitGroup[I2C_TX_SIZE];
Custom_Element gI2C_TX_Element;
uint32_t gTxLen, gTxCount;
下面是 I2C 主机和从机传输的过程。
- 从 gCan2I2c_FIFO 获取 gI2C_TX_Element。
- 调用 processI2CTxMsg_controller()/processI2CTxMsg_target(),从 gI2C_TX_Element 获取数据、并将消息存储到 gI2cTransmitGroup 中。
- 调用 sendI2CTxMsg_controller() 和 sendI2CTxMsg_target(),通过 I2C 传输 gI2cTransmitGroup。对于 I2C 从机,使用 IO 触发主机以读取从机中的数据。
主机模式和从机模式的函数都包含在 bridge_i2c.c 中。