关于硬件IIC卡死在各事件的解决方法
1、关于硬件IIC卡死在EV5事件解决方法
主机使用I2C_GenerateSTART()函数发送START条件后,主机必须等待事件5(启动条件已在I2C总线上正确释放),关于事件5,主要是对是否发送起始位(STAR1寄存器位0)、主从模式以及总线是忙还是空闲(STAR2寄存器位0、位1)进行判断,当这3位均为1,即已发送起始位、主模式且总线忙,会跳过while循环进行下一步操作。若卡死在while循环,可以检查一下以上寄存器3位是否为1。此外,卡死在EVT事件,可按照以下方法试一下能否解决问题:
- 程序中关闭自动应答,不使用I2C_AcknowledgeConfig(I2C2, ENABLE),可以按照这样试一下;
- 每次在读之前重新初始化一下IIC或者使能IIC试一下;
- 关于EV5事件的清除,读SR1然后将地址写入DR寄存器将清除该事件,可在程序中按照该流程试一下;
- 可尝试降低一下通信速度看看是否会有问题;
- 加入超时机制,当卡死在某事件(while循环)一段时间之后,直接跳过该循环,等待下一次操作;
2、关于硬件IIC卡死在EV6事件解决方法
当使用硬件IIC驱动EEPROM卡死在EV6事件
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
问题原因:在判断EV6事件的时候,EEPROM此时还在写入数据,我们发送了地址过去,但并没有产生应答
解决方法:在判断EV6事件之前加一个延时,如下图:
当使用硬件IIC主从通信主机卡死在EV6事件
该问题一般是由于从设备不够快造成的,可在配置IIC主机的时候总线速度适当降低一些或在各个读写操作中加入一定的延时。
3、关于IIC主从通信卡在while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
该问题可检测一下总线空闲时是否都为高电平,其次注意一下外设的使能,先使能开启GPIO时钟,再开启IIC时钟,最后再配置IIC,注意顺序。
当卡死在while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));时同样可按照上述方法进行检查。