ST硬件IIC上电检一直检测到忙状态

阅读: 评论:0

ST硬件IIC上电检一直检测到忙状态

ST硬件IIC上电检一直检测到忙状态

硬件环境:
I2C主机:STM8S003
I2C从机:HTU21D
控制方式:硬件IIC


问题描述:
在程序正常运行的过程中,拔掉设备电源并迅速插回,可能出现主机不能与从机进行连接并且主机持续检测到I2C总线忙,导致无法读取温度,并且复位也不能解决。使用示波器测量SCL和SDA,发现SDA为低,SCL为高。但当断电时间长一点再次上电,通信正常。

问题原因:
板间存在较大电容,在拔掉电源的后,单片机迅速掉电停止工作,而从机在电容板间电容的的支撑下能够继续工作一段时间,并且掉电的时间处于主从机通信的过程,从机保持数据线为低状态,并等待主机的时钟信号。但是此时主机复位将不再继续产生时钟信号,并且上复位后重新初始化硬件I2C模块,硬件I2C检测到SDA为低且不是自身占用的总线,所以将置为BUSY状态,导致主机不能访问I2C总线。
解决方案:
由于是从机持有数据线并等待时钟信号,所以我们在上电第一次就检测到BUSY状态时,将I2C的IO口设置为普通的GPIO输出口,模拟100K的时钟频率,并在检测到SDA为高时,发送一个STOP信号,用以完成(中断)从机的上次通信过程,使I2C总线恢复空闲状态,然后在软复位I2C。(本方法仅适用于单主机模式)

I2C_Cmd(DISABLE); //禁用I2C
GPIO_Init(GPIOB,GPIO_PIN_4,GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(GPIOB,GPIO_PIN_5,GPIO_MODE_IN_FL_NO_IT); 
while(time--)
{GPIO_WriteLow(GPIOB,GPIO_PIN_4);delay_us(10);GPIO_WriteHigh(GPIOB,GPIO_PIN_4);delay_us(10);ret = GPIO_ReadInputPin(GPIOB,GPIO_PIN_5);if(SET == ret){GPIO_Init(GPIOB,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST);delay_us(5);GPIO_WriteLow(GPIOB,GPIO_PIN_5);delay_us(10);GPIO_Init(GPIOB,GPIO_PIN_5,GPIO_MODE_IN_FL_NO_IT);return HAL_OK;}
}
return HAL_ERROR;

本文发布于:2024-02-02 10:41:06,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170684166343261.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:检测到   状态   硬件   ST   上电检一直
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23