#申请原创#
@21小跑堂
简介
重要提示:IIC总线通信时,如果设计为一主多从时,主机为硬件IIC,从机也得是硬件IIC,从机是软件模拟IIC时,那么主机最好也设计为模拟IIC,否则,在写数据时有可能会出现总线死锁。
另外,一主多从通信时,最好都是只读数据,如果有一个从机有写数据,要单独一路IIC通信。
问题点:
IIC死锁也就是SDA, SCL电平都为低电平,无法通信。
案例中设备是低功耗设备,设备休眠时会关闭IIC上拉电源,以降低功耗,外部从机有2个。
问题:偶发唤醒的时候,IIC挂死,通信崩溃?
一、分析软件
当IIC死锁复现时,首先确认两个问题:
1.用STM32CubeProgrammer读取寄存器状态数据,IIC配置时要把故障中断使能,TCIE和ERRIE标志为1,则表示故障中断已配置。
I2C_CR1的寄存器TCIE和ERRIE
配置IIC故障[color=rgb(78, 161, 219) !important]中断,可以手动加入程序中:
2.PE标志位置1就是说明IIC已经使能,等效于__HAL_I2C_ENABLE(&hi2c1);BUSY标志位置1说明硬件已经开始,没有问题。
IIC寄存器数据没有问题,说明软件是OK的,那么,再从硬件角度分析。
二、分析硬件
1.IIC上拉电源是否稳定?
2.IIC上拉电阻阻值是否合适?一般1~10K。
3.IIC电源的电容是否过大?
4.一主多从通信,是否都为读数据?如果有一路有写数据,要分时去通信,避免数据交叉通信。
5.主机、从机是否都为硬件IIC?
经过以上排查,基本问题可以解决。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|