初中生
最后登录1970-1-1
在线时间 小时
注册时间2024-8-31
|
本帖最后由 我不理解 于 2024-9-2 22:16 编辑
如下是野火给出的i2c驱动c程序的等待检测代码
void I2C_EE_WaitEepromStandbyState(void)
{
vu16 SR1_Tmp = 0;
do
{
/* Send START condition */
I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);
/* Read I2C1 SR1 register */
SR1_Tmp = I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1);
/* Send EEPROM address for write */
I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);
}while(!(I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1) & 0x0002));
<- 此处,在上一句给了发送7地址指令后,i2c此时是必定还没有发完这些地址的。那么直接判断i2c 的ADDR有没有发送完成是否是个合理的行为,虽然我不知道为什么程序可以跑,我猜测硬件层面状态机可能混乱阴差阳错导致程序运行成功了?可能在某次eeprom可以接到start信号后即使stm32发了好几次start eeprom也是 一直接按内部状态机运行,然后给了个ack信号?然后被stm32捕捉到了?
非常费解好吧!!!!
/* Clear AF flag */
I2C_ClearFlag(EEPROM_I2Cx, I2C_FLAG_AF);
/* STOP condition */
I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE);
}
|
|