Edit online

关键流程设计

2 Dec 2024
Read time: 1 minute(s)

初始化流程

I2C 模块驱动的初始化流程如下:


i2c_design_init_linux

传输流程

在 master 驱动中,数据的传输由 xfer 发起,可以完成多个 msg 的传输。传输流程如下:


i2c_design_xfer

I2C 模块总线信号

在 I2C 总线的数据传输过程,由 start/restart/stop 作为总线的控制信号。了解 I2C 模块中 start/restart/stop 信号的生成方式,有助于了解驱动的源码实现。
  • master transmitter

    master transmitter

    对图中 3 个关键点的解释:

    1. I2C 作为 transmitter 时,当向 TXFIFO 中写入数据时,I2C 模块会自动发出 start 信号

    2. 若 stop 位未置位,则当 TXFIFO 中的数据全部发送,TXFIFO 为空时,会保持 SCL 为低电平,直到再次向 TXFIFO 中写入数据

    3. 再次向 TXFIFO 写入数据时,将 stop 位置 1,则在完成该字节的发送后,master 会自动发送 stop 信号

  • master receiver

    master receiver

    对图中 3 个关键点的解释:

    1. I2C 作为 receiver 时,当向 TXFIFO 写入读命令(即向 I2C_DATA_CMD 写入读命令) 时,I2C 模块会自动发送 start 信号

    2. 当接收到 slave 端发送的数据后,只有再次发送一次读命令,才会对本次收到的数据恢复 ACK 确认信号

    3. master 在接收到最后一个数据后,回复 NACK,slave 端才会结束数据的传送。在发送最后一个读命令时,同时将 stop 位置位,则 master 在接收到 slave 发送的数据后,I2C 模块会自动发送 NACK 信号

注:

I2C 模块的数据传输,无论是 transmitter 还是 receiver,都会用到 TXFIFO,transmitter 时用来发送数据,receiver 时用来发送命令。所以,中断处理中,触发 TXFIFO_EMPTY 中断的,可能是 msg,也可能是 write msg

中断流程


i2c_design_interrupt