表19.24其他状态应用软件的响应写I2CON状态代码(I2CSTAT) I2C总线和硬件的状态读/写I2DAT STA STO SI AA I2C硬件执行的下一个动作0xF8无可用的相关状态信息; SI=0无I2DAT动作无I2CON动作等待或执行当前传输0x00由于非法起始或停止条件的出现,在MST或选择的从机模式中将出现总线错误。当外部干扰使I2C模块进入未定义的状态时也出现0x00状态无I2DAT动作0 1 0 X只有MST或寻址的SLV模式中的内部硬件受影响。一般情况下,总线被释放、I2C模块切换到非寻址的SLV模式。STO复位19.8.8一些特殊情况I2C硬件可以处理以下几种串行传输过程中出现的特殊情况:

19.8.9两个主机同时启动重复起始条件在主发送模式或主接收模式下可以产生重复起始条件。如果此时另一个主机同时产生重复起始条件,就出现特殊情况(图19.14)。在出现这种情况之前,任何一个主机都不会丢失仲裁,因为它们发送的数据相同。如果I2C硬件在产生重复起始条件之前在I2C总线上检测到重复起始条件,它将释放总线,并且不产生中断请求。如果另一个主机通过产生停止条件来释放总线,则I2C模块将发送一个正常的起始条件(状态0x08),并开始启动重新尝试完整的串行数据传输。更详细的I2C总线仲裁可以参考此处

19.8.10仲裁丢失后的数据传输在主发送模式和主接收模式中仲裁可能会丢失(见图19.8)。I2STAT寄存器中的状态代码可表示仲裁丢失,代码有:0x38,0x68,0x78和0xB0(见图19.10和图19.11)。如果I2CON中的STA标志被服务这些状态的程序置位,则当总线再次空闲时,会发起一个起始条件(状态0x08),并且不受CPU的影响,开始重新尝试完整的串行数据传输。关于硬件仲裁和串行总线的多机通信,请参考这篇文章

19.8.11强制访问I2C总线在某些应用中,非控制源可能会造成总线挂起。在这种情况下,干扰、总线的暂时中断或SDA和SCL之间的暂时短路都会导致总线挂起。如果非控制源产生了一个多余的起始条件或屏蔽了一个停止条件,则I2C总线一直保持忙碌状态。如果STA标志置位且在相应的时间内未访问总线,那么I2C总线有可能会被强制访问。这可通过在STA标志仍被设置时置位STO标志来实现。不发送停止条件。I2C的硬件操作就好像是接收到停止条件一样,可以发送起始条件。STO标志通过硬件清除(见图34)。想了解更多I2C总线强制访问的细节,请点击这里

19.8.12 SCL或SDA低电平妨碍I2C总线的操作。如果你对I2C总线协议及其仲裁有兴趣,可以阅读这篇详解