转载请标明原地址。
前言:
之前我使用STM8的硬件IIC通信卡死在判忙,专门写了一篇注意事项。这个周又使用,对之前的理解注意事项又有了更深刻的理解。
上一篇,IO口状态设置不对,会使IIC不能正常工作。本质上我也没想明白,这一次使用又使用,结果碰到了更难理解的问题,直接把STM8复位都不能恢复正常。倒是更加深了之前为什么IO设置不对会是硬件I2C不能正常工作的理解。
当把I2C 数据脚设置为输出低的时候,I2C总线会认为外部器件把总线占用了,所以不能正常使用。
来说说,最近碰到的IC复位都不能解决的问题,只能通过长时间断电,来解决。最后万能的网友提供了IO操作模拟一个结束信号,可以达到修复总线的效果。更进一步查,STM32也有这样的问题。
我在测试的时候,人为按复位键让IC复位。结果发现会有IIC卡死的现象,仿真后发现是有事件锁死。因为是测试程序,我没有写超时处理。原本认为再大的问题,复位总会解决,没想到怎么都不能恢复了。最后只能长时间断电来恢复。
用逻辑分析仪抓,如果在IIC工作,且数据线为低的时候。发生复位,再使用则硬件IIC会卡死。想要解决,在初始化硬件IIC之前要使用IO模拟一个结束信号。并且让IO都设置成高。有这样修改以后硬件IIC就不会因为复位卡死。
出现这种情况,可能有两种原因。
1.STM8外部复位后,功能寄存器没有复位。
2.外部器件把总线锁死了。
所以,长时间断电,把主控IC和外部器件的电都耗掉了,都正确复位了。第二种方式,使用IO强制产生一个结束信号,让外设安全退出。
从当前分析,出现锁死的原因是第1种的可能性大,是STM8自身复位没有成功。因为如果是第二种,外部器件锁死IIC,那外部器件处于输出状态,IO模拟不能使外部器件结束IIC通讯,锁死状态不能解除。
STM8硬件I2C事件锁死
最新推荐文章于 2024-07-15 21:44:44 发布