USER GUIDE / PERIPHERALS / I2C / DISABLE I2C
禁用I2C
添加了寄存器 I2C_ENBST 是为了允许软件明确地确定硬件何时完全关闭,以响应 I2C_ENABLE 寄存器的 0 位从 1 设置为 0。
步骤
- 定义一个定时器间隔(tI2C_poll),等于系统中使用并由 I2C 支持的最高 I2C 传输速度的信号周期的 10 倍。例如,如果最高的 I2C 传输模式为 400 kb/s,则 tI2C_poll 为 25 us。
- 定义一个最大超时参数 MAX_T_POLL_COUNT,这样如果任何重复的轮询操作超过这个最大值,就会报告一个错误。
- 执行一个阻塞线程/进程/函数,防止软件启动任何进一步的 I2C 主机事务,但允许完成任何挂起的传输。
- 变量 POLL_COUNT 被初始化为 0。
- 将 I2C_ENB 寄存器的 0 位设置为 0。
- 读取 I2C_ENBST 寄存器,并测试 I2C_ENABLE[0]。将 POLL_COUNT 加 1。如果 POLL_COUNT >= MAX_T_POLL_COUNT,请使用相关错误代码退出。
- 如果 I2C_ENBST[0] 为 1,则休眠 tI2C_poll 并继续上一步。否则,请使用相关成功代码退出。
总结刷新 TX FIFO 的条件
- 当 I2C_ENABLE[0] 设置为 0 时,TX FIFO 在复位时刷新并保持。
- TX_ABRT 事件发生。TX FIFO 仍然处于这种刷新状态,直到读取寄存器 I2C_CTXABT。一旦执行了这个读取,TX FIFO 就准备从 APB 接口接收更多的数据字节。
- 当作为从机时,从机收到了一个读取命令并且有一些数据存在于 TX FIFO 中,所以从机发出一个 TX_ABRT 中断来刷新 TX FIFO 中的旧数据。
生成 START, STOP 和 RESTART 的条件
只有当用户通过设置写入 I2C_DC 寄存器的命令的第 9 位(Stop 位)来明确请求时,才会生成 STOP 条件。自然地,如果发送的最后一个字节没有设置第 9 位(Stop 位),如果 TX FIFO 变为空,组件不会一个生成 STOP;在这种情况下,组件将 SCL 保持为低电平,使总线停止,直到 TX FIFO 中有新数据可用。
图 1 说明了 I2C 作为主机发送器运行时,TX FIFO 变空时的行为,并显示了 STOP 条件的生成。

图 2 说明了 I2C 作为主机接收器运行时,TX FIFO 变空时的行为,并显示了 STOP 条件的生成。

图 3 和图 4 说明了用户可以控制 I2C 总线上 RESTART 条件生成的配置。如果设置了 I2C_DC 寄存器的第 10 位(Restart),并且重启功能被使能(IC_RESTART_EN=1),则在向从机写入或读取数据字节之前会生成一个 RESTART。如果重启功能未被使能,则会生成一个 STOP 后跟一个 START 来代替 RESTART。图 3 说明了作为主机发送器运行期间的这种情况。

图 4 说明了相同情况,但是在作为主机接收器运行期间。

图 5 说明了作为主机发送器的运行,其中设置了 I2C_DC 寄存器的停止位,并且 Tx FIFO 不为空。

图 6 说明了作为主机发送器的运行,其中加载到 Tx FIFO 的第一个字节被允许在重启位设置时变空。

图 7 说明了作为主机接收器的运行,其中设置了 I2C_DC 寄存器的停止位,并且 Tx FIFO 不为空。

图 8 说明了作为主机接收器的运行,其中允许在 TxFIFO 后加载的第一个命令为空,并设置了重启位。
