ZHCUAN6E October 2022 – May 2025 MSPM0L1105 , MSPM0L1106 , MSPM0L1116 , MSPM0L1117 , MSPM0L1227 , MSPM0L1227-Q1 , MSPM0L1228 , MSPM0L1228-Q1 , MSPM0L1303 , MSPM0L1304 , MSPM0L1304-Q1 , MSPM0L1305 , MSPM0L1305-Q1 , MSPM0L1306 , MSPM0L1306-Q1 , MSPM0L1343 , MSPM0L1344 , MSPM0L1345 , MSPM0L1346 , MSPM0L2227 , MSPM0L2227-Q1 , MSPM0L2228 , MSPM0L2228-Q1
I2C 目标可以将时钟周期性地拉低以减慢通信,从而扩展事务。I2C 模块有一个 12 位的可编程计数器,它可以跟踪时钟被拉低了多长时间。计数值的高 8 位可通过 I2CTIMEOUT_CTL 寄存器进行软件编程。I2CTIMEOUT_CTL.TCNTLA 寄存器中编程的 CNTL 值必须大于 0x01 才能启用超时功能。请注意,低电平超时配置只需在初始化期间(而非运行状态期间)设置。
应用程序可以对计数器的 8 个最高有效位进行编程,以反映事务中可接受的累积低周期。每个计数等于 (1 + TPR) × 12 个功能时钟 FCLK 的超时周期,其中 TPR 是可编程计时器周期。超时计数器 A 在 SCL 保持低电平的整个时间内连续进行计数。当 SCL 为高电平时,超时计数器 A 重新加载 I2CTIMEOUT_CTL.TCNTLA 寄存器位中的值,并在 SCL 的下降沿从该值开始向下计数。
即使 SCL 在总线上保持低电平,为超时计数器生成的 BUSSCLK 时钟也能继续运行,与编程的 I2C 速度无关。
I2C 时钟低电平超时周期计算方法如下:
例如,如果 BUSSCLK 时钟为 20MHz 并且 I2C 模块以 100kHz 的速度运行,TPR 将等于 19。请参阅节 22.2.1.1,了解 TPR 的计算方法。一个超时周期等于 (1 / 20MHz) × ( 1 + 19) × 12,即 12µs。将 I2CTIMEOUT_CTL.TCNTLA 寄存器编程为 0xDA 将得到值 0xDA0,因为低 4 位设置为 0x0。换言之,也就是 3488 个时钟周期,即在 100kHz 频率下,累计时钟低电平周期为 3488 × 12µs,即 41.856ms。
当到达时钟超时期限时,I2C 控制器原始中断状态 (RIS) 寄存器中的 TIMEOUTA 位被设置,以便让控制器开始纠正措施,解决远程目标状态问题。此外,还会设置 I2C 控制器状态 MSR 寄存器中的 BUSBSY 位。在 I2C 变为空闲状态或 I2C 控制器复位期间,该位清零。软件可以通过 I2C 控制器总线监视 MBMON 寄存器中的 SDA 和 SCL 位读取 SDA 和 SCL 信号的原始状态,从而帮助确定远程目标的状态。
发生超时情况时,应用软件必须选择如何尝试恢复总线。如果在传输(接收或传输)结束之前检测到超时,软件应在初始化下一次传输之前刷新 FIFO。SMBus 和 PMBus 实现需要时钟低电平超时。