通常,I2C 主机控制 I2C 通信,I2C 从机无法触发从机到主机的通信。在本设计中,使用了另一个 IO。从机的 IO 下拉会通知主机有需要发送的信息。用户可以根据需要,修改引脚或删除 IO 功能。
对于 I2C 接收,bridge_i2c.c 中定义了三个全局变量。
uint8_t gI2CReceiveGroup[I2C_RX_SIZE];
Custom_Element gI2C_RX_Element;
uint16_t gGetI2cRxMsg_Count;
下面是 I2C 主机接收的过程。IO 中断用于检测 IO 下拉。
- 在 IO 中断中,调用 readI2CRxMsg_controller() 向 I2C 从机发送 I2C_TRANSPARENT_LENGTH) 字节的读取请求。
- 调用 getI2CRxMsg_controller_transparent (),将消息存储到 gI2cReceiveGroup 中。当接收到 (I2C_TRANSPARENT_LENGTH) 个字节时,、消息接收完成。
- 调用 processI2CRxMsg_controller_transparent (),从 gI2cReceiveGroup 中提取数据,并将消息存储到 gI2C_RX_Element 中。
- 将 gI2C_RX_Element 放入 gI2c2Can_FIFO 中。
下面是 I2C 从机接收的过程。
- 调用 getI2CRxMsg_target_transparent () 将消息存储到 gI2cReceiveGroup 中。当 I2C 停止中断发生(I2C 停止条件)时,消息接收完成。
- 调用 processI2CRxMsg_target_transparent (),从 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_transparent() 和 processI2CTxMsg_target_ transparent(),从 gI2C_TX_Element 接收数据,并将消息存储到 gI2cTransmitGroup 中。
- 调用 sendI2CTxMsg_controller() 和 sendI2CTxMsg_target(),通过 I2C 传输 gI2cTransmitGroup。对于 I2C 从机,使用 IO 触发主机以读取从机中的数据,并且仅发送 (I2C_TRANSPARENT_LENGTH) 个字节。
主机模式和从机模式的函数都包含在 bridge_i2c.c 中。