Lancer_zhang 发表于 2020-8-9 10:38:59

Attiny1617 关于IIC总线被持续拉低的原因分析

在之前的工作中遇到一次IIC总线的问题:一个主设备和两个从设备使用的一路硬件IIC的环境下,当分别加载两个从设备驱动的时候,出现了IIC总线中的SDA被一直拉低,SCL有周期性的毛刺


其中一个从设备是ATmel系列芯片,而问题就是出在Atmel的硬件IIC中。

经分析,在Atmel发送数据时产生了一个冲突,而在冲突的处理函数中,这里直接重新初始化IIC。

查阅了有关datasheet,发现:

如果从设备不能发送高电平或NACK,此时冲突标志位会被置起。

于是就不能发送数据了,但是从设备依然能正常工作。

这个冲突标志位是临时的,下一次的start信号会自动清除掉冲突标志位。

该标志用于使用地址解析协议的系统。 但是,检测到的冲突是非地址解析协议情况,表明存在协议冲突,应将其视为总线错误。



因此,原因是这样的,在主机读数据的过程中,从设备控制SDA,主设备控制SCL,此时重新初始化iic,也直接将管脚进行了初始化,直接打乱SCL的时钟和长期占有SDA。

于是,我尝试将冲突处理函数中的重新初始化和return去掉,发现:



IIC当前的问题帧的数据是不对的,但并不影响之后的帧的数据,也不会造成总线持续拉低的问题。

修改方法:

在冲突处理函数中,仅做打印通知,并且主机做好相应的数据过滤。
至于为什么产生冲突,目前分析很有可能还是和另一个从机设备的初始化有关。
如果有其他意见,还请大家提出,谢谢!

chengyang79 发表于 2020-8-10 08:14:10

主从都是硬件IIC吗?把主机改成软件IIC试试看呢。

Lancer_zhang 发表于 2020-8-10 09:16:31

chengyang79 发表于 2020-8-10 08:14
主从都是硬件IIC吗?把主机改成软件IIC试试看呢。

主机端是安卓BSP层,用的是标准iic驱动。
大概率是主机端在这个时间点初始化了管脚导致从机的SDA拉不上去。
准备在从机试下模拟iic,如果拉不上,应该就是主机端的这个原因

qwe2231695 发表于 2020-8-10 09:19:58

看起来电路有问题, 波形不干净

Lancer_zhang 发表于 2020-8-10 15:16:10

qwe2231695 发表于 2020-8-10 09:19
看起来电路有问题, 波形不干净

使用示波器抓过,也在100us下抓到了问题帧,没发现有脏波形,并且硬件是上拉的

Lancer_zhang 发表于 2020-8-10 15:33:37

产生冲突的根本原因是:主机端(BSP)在加载另一个从设备时,再一次初始化了管脚,而此时正好是另一个从机发送数据,而从机在发送数据时,没办法拉高SDA产生数据波形,于是collision置位
使IIC总线持续异常的原因是:在产生collision时,直接重新复位iic(管脚也被初始化了),导致主机控制的SCL时序被打乱,SDA被占。
页: [1]
查看完整版本: Attiny1617 关于IIC总线被持续拉低的原因分析