对于I2C,为啥很多人说他不好用呢,主要是它超时根本没有一个超时时间,那么在硬件上出现问题,比如把一根线拔了就永久的进入死循环,整机直接跑死,这对于四轴这种东西的话就是直接掉下来了,非常的恐怖。
GD32官方的例程如下:
while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY))
{}
就一个while跑死去读标志位
更改如下
#define I2C0_READ_TIMEOUT 10 // ms
#define I2C0_WRITE_TIMEOUT 10 // ms
uint8_t i2c0_read_time_out;
uint8_t i2c0_write_time_out;
while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && (i2c0_read_time_out++ <= I2C0_READ_TIMEOUT))
{}
if(i2c0_read_time_out > I2C0_READ_TIMEOUT)
{
TimeOut_UserCallback();
return 0;
}
i2c0_read_time_out = 0;
经过测试就算I2C跑死也不会影响成程序正常运行。