我是因为停止信号时序有问题
本来是这样
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就不行。
在I2C通信中,调整了I2CStop函数的SCL和SDA信号顺序后,设备能正常读写。原函数中SDA在SCL变为高电平后改变,而调整后的函数确保了SCL先升高再改变SDA,这一改动使得包括BMP280在内的其他设备工作正常,但AT24C02出现不兼容情况。
1万+

被折叠的 条评论
为什么被折叠?



