I2C通讯常见问题汇总

本文对I2C通信常出现的问题进行一个比较完整的汇总,希望能对大家工程开发过程中有所帮助。

1、简单介绍一下I2C到底是什么,毕竟有新朋友可能还不明白它的概念。

I2C是由飞利浦公司于1982年发明的一种比较简单的通信协议,为什么要发明这个玩意呢?其实并不是无缘无故发明的,而是因为飞利浦自己开发了一款芯片,而当时世界上由没有现成的可靠的简单的通信协议,所以为了让自己开发的芯片简单易用,就发明了这个协议。

该协议规定了通信时序和数据包包含哪些数据信息:

先说通信时序,如下图所示,I2C总线是由数据线和时钟线两条数据线构成,当时钟线SCL为高电平时,如果数据线SDA从高电平拉为低电平就表示I2C传输正式开始,时钟为低电平时数据线上的数据发生变化,而在时钟上升沿的时候采集数据线上的数值,每传输一个字节,从设备都应该通过低电平的方式给出应答,当时钟线为高时,数据线从低电平拉为高电平时意味着一轮I2C传输过程结束。

再说数据包包含哪些信息,I2C数据包中会包含从机地址、读命令/写命令、从机的寄存器地址以及待写入数据等。不同I2C从机所支持的I2C协议会有所差异,比如有些设备只支持7位地址,有些设备既支持7为地址也支持10位地址,有些设备支持连续读和连续写,有些设备则可能只支持单字节读写。

I2C通讯常见问题汇总_第1张图片

最后,说说I2C通信总线硬件系统,如下图所示就是I2C总线的系统图。总线上挂满了I2C接口器件,有主机也有从机,空闲状态下总线必须被上拉电阻拉高。

 

I2C通讯常见问题汇总_第2张图片

2、I2C通信过程中无法正常完成通信主要有如下原因:

2.1 数据线和时钟线都没有上拉到电源

2.2 数据线和时钟线对调了

2.3 设备地址搞错了

2.4 设备没有正常供电

2.5 通信速率过高,超过了设备支持的速率

2.6 通信时序出现问题,没有按照I2C规范进行

2.7 总线上可能有多个地址相同设备,导致通信冲突

2.8 通信初期时钟线和数据线电平不稳定,导致误触发了起始信号,从而使得通信过程无法退出,数据总线时钟处于忙碌状态。

2.9 有些I2C设备本身有写保护机制,如果此时是保护状态,那么数据是写不进去的

大致就是上面这些原因导致通信不成功,每次遇到问题都从这些方面着手思考,总会把问题定位好。下面我讲一个发生在我身边的真实的故事,这也是我决定要写这篇文章的直接原因。

        就在前几天,我们公司研发部在研发一款产品的过程中,发现一个非常奇怪的问题,产品中有一个24C04,MCU写进去的数据与读出来的数据不同,比如写进去的数据是“abcdefgh”这些字符串,结果读出来的却是些莫名其妙的数据。首先仔细检查了读写时序代码,发现没有问题;接着又用示波器看了波形,发现数据确确实实写进去了,因为每次应答都正常,就是读出来有问题。那么肯定不是硬件问题,因为如果是硬件问题,那么怎么可能可以写进去呢,也不应该是软件问题啊,因为读时序确确实实是非常正常的。那么奇怪了!!!后来我无意中发现了问题所在,就是上面的第九点,这个EEPROM已经被写保护了,所以其实数据根本没有写进去,虽然波形正确,那也只是数据进入到了24C02,却并不代表它已经被存放在EEPROM了。

          其实,问题无非就是那些,逐个排除,总能把问题找到。今天就写到这里吧,很晚了,该睡觉了。

你可能感兴趣的:(通信协议)