I2C通信没反应怎么办?
内容提要
在硬件开发中,遇到I2C通信问题时,可以通过示波器捕获通信波形,检查通信时序、地址和信号质量等,来解决问题。I2C总线是一种流行的双向总线,可以连接多个主机和从设备。主机通过发送START和STOP标志来初始化和结束通信。数据传输需要保持时钟电平高,数据位通过SCL时钟脉冲传输。每个字节后有一个ACK位,表示接收成功。主机可以写入和读取从机的寄存器数据。
延伸解读
开漏输出:I2C双向通信的硬件基础
I2C总线采用开漏输出结构,设备只能拉低总线或释放总线,不能主动输出高电平。高电平由上拉电阻提供。这种设计避免了多个设备同时输出不同电平导致的短路,也实现了真正的双向通信。理解这一点有助于排查通信失败:如果上拉电阻缺失或阻值不当,总线可能无法恢复到高电平,导致通信完全无反应。
用示波器排查I2C故障的关键观察点
当I2C通信无反应时,示波器是核心工具。应重点观察:START和STOP标志是否出现、SCL和SDA的时序是否符合规范、从机地址是否正确、每个字节后的ACK位是否被拉低。如果ACK位保持高电平(NACK),可能表示从机未就绪、地址错误或缓冲区满。信号质量如上升沿过缓也可能导致误判,需检查上拉电阻与总线电容的匹配。
读写操作流程差异与常见误区
写操作直接发送从机地址(读写位为0)、寄存器地址和数据。读操作则需先以写模式发送要读取的寄存器地址,再发送重复START和读地址(读写位为1),然后由主机提供时钟并接收数据。主机在读取最后一个字节后应发送NACK而非ACK,以通知从机释放总线。若混淆读写流程,容易导致通信失败或数据错误。
Q&A
I2C通信没反应时,应该怎么排查问题?
可以用示波器捕获通信波形,检查是否符合通信时序要求、主机是否发送了数据、I2C通信地址是否正确、从机是否正常应答、通信信号质量是否良好等,通过这样的排查一般能找到问题所在。
I2C总线的物理接口由哪两根线组成?
I2C总线的物理接口由串行时钟线(SCL)和串行数据线(SDA)组成,两者均需要通过上拉电阻连接到Vcc。
I2C通信中START和STOP标志是如何定义的?
当SCL处于高电平时,SDA上的下降沿意味着一个START标志,而SDA上的上升沿意味着一个STOP标志。主机通过发送START标志初始化通讯,发送STOP标志结束通讯。
I2C通信中ACK和NACK的作用是什么?
每个字节(包括地址字节)后总是伴随着来自接收方的1位ACK位。ACK位使得接收方可以告知发送方当前字节已成功接收,并且可以发送下一字节。如果SDA线在ACK/NACK时钟周期保持为高电平,则作为NACK,表示接收方无法接收或发送、收到无法识别的数据、缓冲区满,或主机完成读取后通知从机终止通讯。
主机如何向I2C从机写入数据?
主机发送START标志以及从机地址(最后1位读写位设为0表示写操作),从机应答后,主机发送希望写入的寄存器地址,从机再次应答,然后主机发送寄存器数据,最后发送STOP标志结束通讯。
主机如何从I2C从机读取数据?
主机先发送START标志和从机地址(读写位为0表示写操作),接着发送要读取的寄存器地址,从机应答后,主机再次发送START标志和从机地址(读写位为1表示读操作),从机应答后,主机释放SDA线但继续提供时钟,从机传输数据。每接收一个字节,主机发送ACK;接收完所需字节后,主机发送NACK,然后发送STOP标志结束通讯。
I2C总线为什么使用开漏输出?
开漏输出允许将总线上的电压拉低或释放总线以允许其被上拉电阻拉高。由于没有设备可以在总线上输出高电平,这避免了设备输出高而另一个设备试图输出低所导致的短路问题。同时,在多主机环境下,如果主机输出高但读回低,它可以中止通讯,因为另一个设备正在使用总线。