I2C通信是我们在工作中会经常使用到的一种低速通信协议,实现方式上可以分为软件I2C和硬件I2C两类。其中软件I2C通过拉高和拉低IO口来模拟SCL及SDA的时序,速率较低,但基本所有单片机都可以使用;硬件I2C的速率更高,通过配置几个寄存器即可,使用较为简单,但不是所有的单片机都支持。
使用I2C时一般情况下,单片机会与I2C设备在同一块单板上,但也有通过连接线连接的情况,通过连接线连接时,难免会出现连接线连接不牢固或者断开的情况,发生这种情况时,一方面我们需要保证程序不受设备断开的影响,其他功能可以正常运行;另一方面,我们希望如果把设备重新连接好后可以恢复正常运行。这种需求若在使用软件I2C时很容易实现,但在使用硬件I2C时,由于在发生断连的情况时,会某寄存器的个别只读位置位,如GD32,在硬件I2C异常时,会有一个只读的错误位被置位,导致SCL和SDA被强制拉低,拉低后无法通过设置IO电平置位,因此在使用时需要先将I2C去使能等操作使那个只读错误位复位,然后通过写IO的方式拉高SCL和SDA,最后重新配置I2C寄存器即可。