当我们主机发送当前读操作时:读取不完整数据,不发送最后的NACK应答和STOP操作,然后按照协议的方式释放SDA总线,然后无法进行后续通信.
- 主机发:START+Address+读取数据(7 Bit).
- 主机发送时钟,检测SDA线是否为高电平,当为高时,发送STOP.(最多发送九个时钟)
- 进行随机地址读,从机不响应.(Slave NACK)
请问,当从机进入异常状态时,我们可以通过哪些有效操作恢复从机(除了硬件复位操作)?
以上波形发送顺序为Q4-01 -> Q4-02 -> Q4-03
第一个波形为我们发送的不完整帧;
第二个波形为按协议方式释放SDA并发送STOP;
第三个波形为新的一次通信被拒绝响应.
Q4-01
Q4-02
Q4-03
已解决! 转到解答。
记录之前邮件沟通的部分信息:
Q:
您好!感谢您对第1个问题的回复。
麻烦您再帮忙看看,主机只发送9个STOP信号给从机,从机把SCL总线拉低.导致总线上无法进行任何通信.我现在的遇到的问题是SCL线被从设备拉低,导致没有办法在唤醒过来,有办法恢复通信吗?
Answer:
请尝试重启从机, 重新开始通信。
以下是我对这个问题的理解:
1:看你这个波形,应该是GPIO模拟的I2C。
2:在主机读数据的时候,如果从机没有ACK,应该是没有数据需要被读了。
3:你的Q4-02这个图的stop信号我不太能理解,这个stop信号看上去像有问题。
4:Q4-03的波形,通信在地址匹配的时候成功了,后面也是成功的发送了8个bit的数据,我应该怎么理解通信被拒绝了呢?
5:一般情况下,读取数据不完整,只有在中止在SDA被从机拉低的clock会有问题,这样的话,可能会导致重新start失败的情况。
6:你这个用的是什么芯片?目前在通信中发现了什么问题?
7: 主机收不到从机的ACK的话,一般会选择重新传,多次传输失败,会report error。 但是这个都是你程序设计得逻辑。
我重复了室验验证,现在把实验过程详细复述一遍:
室验条件:
IIC主机为模拟IIC,从机为CY8C5868评估板的硬件IIC Slave.
图示:黄线为中断响应,如果进入中断将翻转两次;
红线为SCL线;
绿线为SDA线.
测试操作:
- 将我们A0低表中数据填充为0x00~0x7F;
- 单字节随机地址读取A0表0x44位置的数据为A0[0x44]=0x44;
- 单字节随机地址读取A0表0x54位置的数据,此操作帧为不完整帧结构
帧:START + Address(0xA0) + Read Data(7 Bit).
4.由于IIC从机未正常结束,SDA线被拉低,通过协议释放SDA方式释放SDA总线,并结尾发送STOP;
5.重新开始单字节随机地址读取A0表0x55位置的数据操作,从机异常现象为第一次响应地址但是不进入中断,在地址后一个Byte数据时响应为 NACK;
6.如果再次进行单字节随机地址读取A0表0x55,从机表现为不响应器件地址并且把SCL总线拉低不再释放;
7.由于SCL总线被从机拉住无法进行任何操作.
记录之前邮件沟通的部分信息:
Q:
您好!感谢您对第1个问题的回复。
麻烦您再帮忙看看,主机只发送9个STOP信号给从机,从机把SCL总线拉低.导致总线上无法进行任何通信.我现在的遇到的问题是SCL线被从设备拉低,导致没有办法在唤醒过来,有办法恢复通信吗?
Answer:
请尝试重启从机, 重新开始通信。