技术文档

单片机iic总线 什么是I2C总线,它有着哪些特点,设计时需要哪些细节?

小编 2025-06-17 技术文档 23 0

什么是I2C总线,它有着哪些特点,设计时需要哪些细节?

一、前言

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

二、I2C总线开发设计需要注意点

1、总线容量及驱动能力

I2C总线的外围扩展器件都是CMOS器件,总线有足够的电流驱动能力,因此总线上扩展的节点数不由电流负载能力决定,而由电容负载确定。总线上每个实际节点器件的总线接口都有一定的等效电容,等效电容的存在会造成总线传输的延迟,导致数据传输出错。

通常总线负载能力为400pF,通常各个I2C器件都会有它自己的电容值,一般为不大于20pF,据此可计算出总线长度及节点数目的限制数量。总线上的每个外围器件都有一个器件地址,因此总线上扩展外围器件时也要受器件地址限制。

2、I2C总线的电气结构

I2C总线为双向同步串行总线,因此I2C总线接口内部为双向传输电路,如图所示。总线端口输出为开漏结构,故总线上必须有上拉电阻,上拉电阻与电源电压、SDA、SCL以及总线串接电阻有关,可参考有关数据手册进行选择,通常可选4.7K到10K。

3、每个节点都有一个固定的节点地址。

I2C总线为双向同步串行总线,因此总线上的单片机都可以成为主节点,其器件地址由软件给定,存放在总线的地址寄存器件中,称为主器件的从地址。在总线的多主系统中,单片机作为从节点时,其从地址才有意义,所以总线上所有的外围器件都有规范的器件地址。

4、I2C总线时序

I2C总线上数据传递时,总线上传送的每一帧数据均为一个字节。但启动总线后,传送的字节数没有限制,只要求每传送一个字节后,对方回应一个应答位。

在发送时,首先发送的是数据的最高位。每次传送开始有起始信号,结束时有停止信号。在总线传送完一个字节后,可以通过对时钟线的控制使传送暂停。

①时钟和数据发送:

SDA引脚通常使用外部设备拉高。SDA引脚上的数据只能在SCL为低电平时进行更改,SCL为高电平时数据更改将指示开始或停止条件。如图所示。

②起止条件:

SDA由高到低且SCL为高是启动条件,必须先于任何其他命令。SDA由低到高且SCL为高是停止条件,在一个读序列后,停止命令会使EEPROM进入待机模式。如图所示。

③应答:

所有地址和数据字均以8bit字连续传输到EEPROM,EEPROM发送一个"0"来应答,以确认它已收到每个字。应答发生在第九个时钟周期如图所示。

三、设计实例

我们对于AT24C256肯定不会陌生,这是ATMEL公司256kbit串行电可擦的可编程只读存储器,8引脚双排直插式封装,具有结构紧凑、存储容量大等特点,可以在2线总线上并接4片该IC,特别适用于具有高容量数据储存要求的数据采集系统。

EEPROM存储器设备既可以接收又可以发送数据。每个挂接在总线上的器件都有唯一一个地址识别。

主机访问EEPROM时,主机在向EEPROM发送完控制字节和地址信息后,紧接着向EEPROM存储器发送起始条件和控制信号并发送读标志位信号,切换数据的收发方向。接着在收到EEPROM的响应信号后便可以读出需要的数据了。

四、总结

通过以上实例,我们可以知道I2C优点主要表现在:

1、简化了硬件电路。在这种总线中只需要两根线,即串行数据线(SDA)和串行的时钟线(SCL)。

2、每个挂在总线上的I2C器件都有一个唯一的地址,并可以通过软件寻址。

3、因为在总线上可能有多个主I2C器件,因此I2C总线接口协议中有冲突监测和仲裁机制,以防止通信中的数据丢失或发生错误。

4、这种串行的两线双向的总线在标准模式下的速率为100kbit/s,在快速模式下的速率为400kbit/s,在高速模式下为3.4Mbit/s。

5、I2C器件中有滤波抗扰措施来保证数据的完整性。

6、在总线上挂接的器件数目是有限的,即总线上的容抗不能超过400pF。

一篇文章讲透I2C总线协议

最近一段时间工作上比较忙,一直没有抽出空来写文章与大家分享,这两天腾出些时间静下心来沉淀一番。看标题大家已经知道了是来总结I2C总线,我相信大家或多或少的都接触过I2C总线,这篇文章我们就由浅入深的仔细来研究研究,看看能不能挖掘些新东西,加深一下理解。

先说概念

I2C英文全称Inter-Integrated Circuit,字面意思是集成电路之间,也就是我们常说的I方C总线—I2C bus。它是一种串行通讯总线,使用多主从架构,由飞利浦公司(恩智浦NXP的母公司)在80年代开发,用于主板、嵌入式系统连接周边低速设备。

I2C由两条双向开漏线组成,这是一个很大的优势,接线简单。两条线利用上拉电阻将电位上拉。典型电位为+3.3V或+5V。标准传输速率为100Kb/s,低速模式10Kb/s。

物理层

下图为I2C总线的物理拓扑图,大家可以看到一共只有两条总线,一条SDA(serial data)数据线用来承载数据、一条SCL(serial clock line)时钟线用来控制数据收发时序。所有I2C设备的SDA都接到了总线的SDA上,SCL都接到了总线的SCL上。每个设备都有自己的唯一地址,以保证设备之间访问的准确性。

I2C总线的物理拓扑图

I2C在物理层的连接可以说是非常简单,这也是它最大的优势,原理就是通过控制SDA和SCL线的高低电平时序,来产生I2C总线协议所需要的信号进行数据传输。在总线处于空闲状态时SCL和SDA被上拉电阻拉高,保持高电平。

需要注意的是I2C的通讯方式为半双工,因为只有一条数据线,某一时刻只可能单向通讯。这也说明了I2C不适合大数据量的传输应用。

对于主机、从机的区分很简单,发布主要命令的就是主机,接受命令的就是从机,同一条I2C总线允许多个主机的存在。

协议层

作为基础我们先来了解几个重要的小概念。

1、初始状态 (即空闲状态):SDA与SCL均为上拉电阻所致的高电平时为初始状态;2、开始信号 :当SCL为高电平的时候,SDA被拉低,此为开始信号,表明通讯开始。 3、终止信号 :当SCL为高电平的时候,SDA被拉高,此为终止信号,表明本次通讯结束。

到这里大家有没有发现点什么?当SCL处于高电平的时候,SDA电平一旦变化就会是一种信号,要么开始要么是终止。所以在数据传输过程中, SCL处于高电平时,SDA必须保持状态稳定,只有SCL处于低电平时SDA才可以变化。

4、应答信号 :当发送器向接收器发送完一个字节/8位数据后,第9个时钟周期内,接收器必须给发送器一个应答信号,这样数据才算传输成功。高电平表非应答,低电平表应答。

我们了解这几个信号状态后,来一步一步看看数据是如何传输的。

1、向从机设备的某一个寄存器写一个字节数据:开始信号 +设备地址(7位) +读/写(1位) +等待从机应答 +寄存器地址(8位) +等待从机应答 +要写的数据(8位) +等待从机应答 +终止信号 。下图为24C02 EEPROM存储器写数据的时序图。

2、写我们见识了,那读一个试试:下图为读取24C02当前地址一个字节数据的时序图,是不是一目了然了。值得注意的是当读的时候地址7位后的读写状态位为1 。这里说一下为什么最后是NO ACK,在“读”这个操作下,主机为接收器,主机的NO ACK表示停止接收24C02的数据,不然24C02会继续发。

3、我们再读一个长一点的:下图为读取24C02任意地址一个字节数据的时序图。开始信号 +设备地址(7位) +写(1位) +等待从机应答 +数据地址(8位) +等待从机应答 。前面这一步为假写,目的是告诉24C02要读哪个地址的数据。继续,开始信号 +设备地址(7位) +读(1位) +等待从机应答 +读到的数据(8位) +等待主机(接收机)应答 +终止信号

补点干货

1、设备的地址 。I2C设备的地址为8位,但是时序操作时最后一位不属于地址,而是读or写状态位。这就是为什么arduino的SH1106库里操作的地址不是0x7-而是0x3-,因为有用的是前7位,地址整体右移一位处理了。再一个设备地址的前四位是固定死的,是厂家用来表示设备类型的,比如接口为I2C的温度传感器类设备地址前四位一般为1001即9X、EEPROM存储器地址前四位一般为1010即AX、oled屏地址前四位一般为0111即7X等等。

2、I2C接口的致命缺点就是传输距离近同时速度慢。 大家在使用I2C总线接口的时候切记不要长线传输,尽量只在PCB板内传输,不然偶尔丢数据甚至读不到数据会让人崩溃,不要问我是怎么知道的,问只有眼泪。

3、关于两线为什么设计成开漏 ,这个问题我记得我之前在写《STM32单片机I/O的8种工作模式》时给大家埋下过伏笔。今天就来说一下具体原因。主要有两点①防止短路:大家想想如果不设为开漏,而设为推挽,几个设备连在同一条总线上,这时某一设备的某个IO输出高电平,另有一台设备的某一个IO输出低电平,这时你会发现这两个IO的VCC和GND短路了;但是开漏就不会有这个问题,如下图示:

第二个原因是“线与”,我们想个场景:如果总线上的一个A设备将SDA拉高,这时总线上另一个B设备已将SDA拉低,这时由于1&0=0,所以A设备检查SDA的时候会发现不是高电平而是低电平,这就表明总线上已经有其他设备占用总线了,A只好放弃,如果检测是高电平那就可以使用。如下图示为24C02芯片内部图,可以看到状态检测脚。

总结

I2C总线作为一个常见的总线协议,是非常值得我们来仔细研究琢磨的,通透以后我们再使用任意I2C接口的设备时就可以信手拈来了。我一直觉得在学习的过程中,“会使用”不一定就是我们追求的终点,会用的同时把一些更深的东西搞懂搞透会收获意想不到的喜悦。

PS.近期会有开源项目推出,敬请期待~

「创作不易」

希望大家随手点个赞

这是对我最大的支持和鼓励你们的支持就是我继续创作的动力

相关问答

【C51 单片机IIC总线 中用K=(K】作业帮

[最佳回答]读一个字节啊,将SDA的数据一位一位赋值给变量k,k最开始是0,即0x00000000,当i=0时,k先左移一位,还是0x0000000,然后0x00000000与SDA相或(这里假设...

单片机 一个IO口如何控制两颗发光二极管(LED)?

单片机的一个GPIO只能输出0和1两种状态,如果控制一个LED灯的话,可以实现LED的亮灭控制。两个LED具有四个状态:1)同时亮;2)同时灭;3)一个亮一个灭;4)一个灭...单...

iic 能用普通io口吗?

可以,但要注意两个操作要点:第一,承担SCL时钟信号的ⅠO口必须定义为推挽输出模式,以便向IlC从机输出时钟信号;承担SDA数据线的IO口必须定义成开漏输出和高阻...

单片机 、光耦

由上位管理主机(HOST)、USB/CAN转换器和多个智能节点组成。节点的数量由大型仓库里的粮库数量决定,一般在采用标准帧进行CAN通信时,节点...节点的...

STC 单片机 模拟的I2C 总线 上数据传送速率能达到12M吗?

还要写数据线,加一个指令周期,写数据前要判断,判断前要移位。你写一个程序即可以算算要多少指令周期。这还不考虑,上升沿与下降沿的延时。stc单片机IO口由0变...

电子项目开发中,如何确定使用I2C 总线 还是SPI总线或者CAN总线?

如下图所示。SPI通过片选来确定所挂接设备的数量,占用单片机的GPIO口,不适用于挂接多个设备的情况,除非GPIO完全够。什么时候选用CAN总线CAN总线是设备间的...

i2c和spi分别用几根线?

I2C总线使用两根线,分别是时钟线SCL和数据线SDA,用SCL的边沿同步SDA数据的读写,所以叫同步串行通讯。SPI总线使用四根线,包括时钟线SCLK、单向数据线MOSⅠ和...

IIC总线 中,如何区分数据和地址?

IIC上的每个器件是否都要一个地址寄存器来确定自己的地址:很多器件都是通过硬件来确定地址的。有的在出厂时地址就设置好了,用户不可以更改,有的确定了几位,...

单片机 中24c02n芯片是做什么用的啊?

这个问题我来回答一下。单片机中用到的at24c02n芯片是用来存储数据的,相当于电脑的硬盘。单片机的存储系统是由flash存储器和sram存储器构成的。flash存储器用...

用GPIO模拟 IIC总线 ?

IIC总线只有两条线(SCL和SDA),IIC协议其实就是这两条线上的数据传输的时序规定。主控制芯片通过向IO口(已经与从芯片的IIC端口SCL和SDA连接)按从芯片提供的...

猜你喜欢