硬件IIC卡死的各种事件解决方法汇总

硬件IIC卡死在各种事件的解决方法

1.卡在事件EV5

主机使用I2C_GenerateSTART()函数发送START条件后,主机必须等待事件5(启动条件已在I2C总线上正确释放),关于事件5,主要是对是否发送起始位(STAR1寄存器位0)、主从模式以及总线是忙还是空闲(STAR2寄存器位0、位1)进行判断,当这3位均为1,即已发送起始位、主模式且总线忙,会跳过while循环进行下一步操作。若卡死在while循环,可以检查一下以上寄存器3位是否为1。此外,卡死在EVT事件,可按照以下方法试一下能否解决问题:

程序中关闭自动应答,不使用I2C_AcknowledgeConfig(I2C2, ENABLE),可以按照这样试一下;
a.每次在读之前重新初始化一下IIC或者使能IIC试一下;
b.关于EV5事件的清除,读SR1然后将地址写入DR寄存器将清除该事件,可在程序中按照该流程试一下;
c.可尝试降低一下通信速度看看是否会有问题;
d.加入超时机制,当卡死在某事件(while循环)一段时间之后,直接跳过该循环,等待下一次操作;

2.卡在事件EV6

当使用硬件IIC驱动EEPROM卡死在EV6事件

while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))

问题原因:在判断EV6事件的时候,EEPROM此时还在写入数据,我们发送了地址过去,但并没有产生应答

解决方法:在判断EV6事件之前加一个延时,如下图:
在这里插入图片描述
当使用硬件IIC主从通信主机卡死在EV6事件

该问题一般是由于从设备不够快造成的,可在配置IIC主机的时候总线速度适当降低一些或在各个读写操作中加入一定的延时。

3.卡在MASTER_TRANSMITTER_MODE_SELECTED

此时是I2C上挂在设备的物理地址不正确导致,或者是元起价损坏,一般是自己配置要读写访问的物理地址不正确引起的。

4.关于IIC主从通信卡在while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY))

该问题可检测一下总线空闲时是否都为高电平,其次注意一下外设的使能,先使能开启GPIO时钟,再开启IIC时钟,最后再配置IIC,注意顺序。

当卡死在while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));时同样可按照上述方法进行检查。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值