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 控制器状态
用户可以通过读取 I2Cx.MSR 寄存器来检查 I2C 控制器的当前状态。
| 位域 | 说明 |
|---|---|
| BUSY | I2C 控制器忙。在事务正在进行期间,设置 BUSY 位。 |
| ERR | I2C 错误。该错误可能源于目标地址未得到确认或者发送数据未得到确认。 |
| ADRACK | 确认地址。如果发送的地址未得到确认,则设置该位。 |
| DATACK | 确认数据。如果发送的数据未得到确认,则设置该位。 |
| ARBLST | 仲裁丢失。如果控制器丢失了仲裁,则设置该位。 |
| IDLE | I2C 总线空闲。 |
| BUSBSY | I2C 总线忙。该位根据 START 和 STOP 条件发生变化,将其设置为总线忙。 |
| CLKTO | 时钟超时错误。如果发生时钟超时错误,则设置该位。 |
| MBCNT | I2C 控制器事务计数。此字段包含事务的当前倒计时值。 |
为了让控制器脱离空闲模式开始接收数据,用户需要设置 I2Cx.MCTR 寄存器中的 START 位来生成开始条件。然后,一旦控制器检测到总线空闲,就会自动发送 START 条件,后跟目标地址。应遵循以下所有过程。
I2Cx.MSA.DIR 设置为 1 以启用接收模式,I2Cx.MCTR.START 设置为生成开始条件,可以对 I2Cx.MBLEN 进行编程以指示接收操作的字节数 (n)。I2Cx.MCTR.ACK 和 I2Cx.MCTR.STOP 位可以根据用户配置设置或清零。设置 I2Cx.MCTR.BURSTRUN 以开始操作。数据包格式为 START+ADDR+R+DATA*n +(ACK/NACK) + (STOP)。最后数据的 ACK/NACK 取决于 ACK 位,额外的 STOP 发送取决于 STOP 位。
接收到最后一个字节后,设置 CPU_INT.IIDX 寄存器中的 MRXDONE (0x01) 中断,以指示控制器接收事务已完成。用户可以使用 CPU_INT.IIDX 寄存器中的 MRXFIFOTRG (0x03) 中断从接收 FIFO 中读取数据。当控制器 RX FIFO 包含的内容 >= 定义的字节时将触发该中断,触发电平可以通过使用 I2Cx.MFIFOCTL 寄存器中的 RXTRIG 位来定义。控制器接收器模式的流程图如图 22-11 所示。
为了让控制器脱离空闲模式开始发送数据,用户需要设置 I2Cx.MCTR 寄存器中的 START 位来生成开始条件。然后,一旦控制器检测到总线空闲,就会自动发送 START 条件,后跟目标地址。如果在目标地址发送过程中没有丢失仲裁,则将发送写入 MTXFIFO 的数据。应遵循以下所有过程。
I2Cx.MSA.DIR 清零以启用发送模式,I2Cx.MCTR.START 设置为生成开始条件,可以对 I2Cx.MBLEN 进行编程以指示发送操作的字节数 (n)。I2Cx.MCTR.STOP 位可根据用户配置设置或清零。设置 I2Cx.MCTR.BURSTRUN 以开始操作。数据包格式为 START+ADDR+W+DATA*n + (STOP),STOP 的发送取决于 STOP 位。
发送完最后一个字节后,设置 CPU_INT.IIDX 寄存器中的 MTXDONE (0x02) 中断,以指示控制器发送事务已完成。用户还可以设置 CPU_INT.IIDX 寄存器中的 MTXEMPTY (0x06) 中断,以查看 MTXFIFO 是否为空且已准备好加载更多数据。如果发送 FIFO 中的所有数据都已移出,则将触发此中断。控制器接收器模式的流程图如图 22-12 所示。