我是因为停止信号时序有问题
本来是这样
void I2CStop(void)
{
I2C_SDA(0);
I2C_SCL(0);
HAL_Delay_us(5);//SCL保持4.7us,拉高SDA
I2C_SDA(1);
HAL_Delay_us(5);
I2C_SCL(1);
HAL_Delay_us(5);
}
调整了SCL SDA 顺序之后的
void I2CStop(void)
{
I2C_SDA(0);
I2C_SCL(0);
HAL_Delay_us(5);//SCL保持4.7us,拉高SDA
I2C_SCL(1);
HAL_Delay_us(5);
I2C_SDA(1);//起始终止信号始终都要是在SCL高电平期间变化SDA,这是与其他时序的根本区别,所以一定要先拉高SCL再变化SDA
HAL_Delay_us(5);
}
然后就能正常读写了
不直到为啥其他IIC设备都能用这个时序,包括我上午才用的BMP280都能正常读写,AT24C02就不行。