I2C通讯常见问题汇总

news/2025/1/24 14:00:26/

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

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

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

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

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

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

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

 

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了。

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


http://www.ppmy.cn/news/503505.html

相关文章

Linux I2C从设备树信息查看与添加方法

下面介绍如何查看一个i2c-adapter对应的设备树文件,i2c-client对应的设备树文件 我们知道I2C-client的信息和adapter的一些信息如寄存器等信息是放在设备树里面的,那么在设备树的什么位置呢?在arch/arm/boot/dts/xxx.dts 在默认的文件系统中…

51单片机I2C程序

I2C总线时序I2C总线信号时序总结 对I2C总线时序的一点理解以及ACK和NACK(NAK) http://www.cnblogs.com/zym0805/archive/2011/07/31/2122890.html I2C是由Philips公司发明的一种串行数据通信协议,仅使用两根信号线:SerialClock(简称SCL&…

一文搞懂I2C通信总线

目录 1、简介 2、物理特性 3、通讯特性 3.1、开始和停止条件 3.2、地址传送 3.3、数据传送 3.4、总线应答 3.5、总线仲裁 3.6、时钟同步/时钟延展 4、通信时序和协议 4.1、起始条件 4.2、重复起始条件 4.3、地址帧 4.4、读⁄写位 4.5、ACK⁄NACK位 4.6、数据帧…

I2C通信 读写数据过程

在通信之初,主从机必须根据自己的要求约定好通信规则:command的定义和位置、address的位数和位置。 以读写从机寄存器数据为例: 假设从机寄存器地址为8位、从机寄存器也位8位(被读取数据为8位); 约定读comm…

很清晰的解读i2c协议

转载:http://dpinglee.blog.163.com/blog/static/14409775320112239374615/ 1.I2C协议 2条双向串行线,一条数据线SDA,一条时钟线SCL。 SDA传输数据是大端传输,每次传输8bit,即一字节。 支持多主控(multimastering…

I2C总线介绍

1.1 I2C总线知识 1.1.1 I2C总线物理拓扑结构 I2C总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态…

I2C库函数

1.void I2C_DeInit(I2C_TypeDef* I2Cx) 功能:将I2Cx外设寄存器重设为默认值 注释:该函数调用了RCC_APB1PeriphResetCmd来进行挂载于APB上外设的寄存器的复位 例如:I2C_DeInit(); 2.void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C…

硬件I2C与模拟I2C

硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C;一般也较为稳定,但是程序较为繁琐。硬件(固件)I2C是直接调用内部寄存器进行配置&a…