概述: I²C 是Inter-Integrated Circuit的缩写,发音为"eye-squared cee" or "eye-two-cee" , 它是一种两线接口。 I²C 只是用两条双向的线,一条 Serial Data Line ,另一条Serial Clock 。 SCL:上升沿将数据输入到每个EEPROM器件中;下降沿驱动EEPROM器件输出数据。 SDA:双向数据线,为OD门,与其它任意数量的OD与OC门成"线与"关系。输出级 每一个I2C总线器件内部的SDA、SCL引脚电路结构都是一样的,引脚的输出驱动与输入缓冲连在一起。其中输出为漏极开路的场效应管,输入缓冲为一只高输入阻抗的同相器,这种电路具有两个特点: 1)由于SDA、SCL为漏极开路结构,因此它们必须接有上拉电阻,阻值的大小常为 1k8, 4k7 and 10k ,但1k8 时性能最好;当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线"与"关系。 2)引脚在输出信号的同时还将引脚上的电平进行检测,检测是否与刚才输出一致,为"时钟同步"和"总线仲裁"提供了硬件基础。主设备与从设备 系统中的所有外围器件都具有一个7位的"从器件专用地址码",其中高4位为器件类型,由生产厂家制定,低3位为器件引脚定义地址,由使用者定义。主控器件通过地址码建立多机通信的机制,因此I2C总线省去了外围器件的片选线,这样无论总线上挂接多少个器件,其系统仍然为简约的二线结构。终端挂载在总线上,有主端和从端之分,主端必须是带有CPU的逻辑模块,在同一总线上同一时刻使能有一个主端,可以有多个从端,从端的数量受地址空间和总线的最大电容 400pF的限制。   主端主要用来驱动SCL line; 从设备对主设备产生响应;

两者都可以传输数据,但从设备不能发起传输,传输由主设备控制。

4.费率:

普通模式:100kHz;

快速模式:400kHz;

高速模式:3.4MHz;

草案

1.空空闲状态

当I2C总线的SDA和SCL信号线同时处于高电平时,定义为总线的空空闲状态。此时各器件的输出级场效应管处于关断状态,即总线释放,电平由两条信号线的上拉电阻上拉。

2.开始位和停止位的定义:

起始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号。停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。

3.确认

每次发送器发送一个字节,数据线在时钟脉冲9期间被释放,接收器反馈一个响应信号。当响应信号为低电平时,指定为有效响应位,表示接收方已成功接收字节;当响应信号为高电平时,它被指定为非响应位,这通常表示接收器未能接收到该字节。反馈有效响应位ACK的要求是接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并确保在该时钟的高电平期间保持稳定的低电平。如果接收器是主机,在接收到最后一个字节后,它会发送一个NACK信号,通知受控发送器结束数据传输,并释放SDA线路,以便主机接收器可以发送停止信号p。

逻辑分析仪的采样结果如下图所示:释放总线后,如果没有响应信号,sda应该一直保持在高电平,但如图中蓝色虚线所示,它被下拉到低电平,证明已经收到响应信号。

给我们的两个信息是:1)接收方拉SDASCL上升沿之前的低水平期间为低;2)响应信号保持到SCL下降沿结束;如上面红色标记所示。

4.数据有效性:当I2C总线用于数据传输时,当时钟信号处于高电平时,数据线上的数据必须保持稳定。只有当时钟线上的信号处于低电平时,数据线的高电平或低电平状态才能改变。

我的理解:虽然只要求在高电平期间保持稳定,但是应该有一个提前,就是数据要在SCL上升沿之前准备好,因为之前的文章——I2C总线概述中已经指出,数据是在SCL上升沿驱动到器件中的。

5.数据传输:

I2C总线上传输的每一位数据都有相应的时钟脉冲,即在SCL串行时钟的配合下,每一位数据都在SDA上逐位串行传输。数据位的传输由边沿触发。

工作过程

总线上的所有通信都由主机发起。在交流中,主人和被控制者总是扮演两个不同的角色。

1.主设备向从设备发送数据

主设备发送起始位,通知总线上的所有设备传输已经开始。然后主机发送设备地址,匹配此地址的从机继续传输过程,其他从机忽略下一次传输,等待下一次传输开始。主设备寻址从设备后,发送从设备的内部寄存器地址进行读取或写入;之后,发送数据。数据传输完成后,传输停止位:

写作过程如下:

发送开始位

发送从设备的地址和读/写选择位;释放总线,等到EEPROM拉低总线进行应答;如果EEPROM接收成功,则进行应答;若没有握手成功或者发送的数据错误时EEPROM不产生应答,此时要求重发或者终止。发送想要写入的内部寄存器地址;EEPROM对其发出应答;发送数据发送停止位.EEPROM收到停止信号后,进入到一个内部的写入周期,大概需要10ms,此间任何操作都不会被EEPROM响应;

详细信息:

需要注意的是:主控制器通过发送地址码与对应的被控设备建立了通信关系,而与总线相连的其他被控设备同时收到了地址码,但由于与自己的地址不一致,提前退出了与主控制器的通信;

2.主控制器读取数据的过程:

阅读过程比较复杂。在从从机读取数据之前,您必须先告诉它您要读取哪个内部寄存器,因此您必须先写入它:

发送起始位;发送slave地址+write bit set;发送内部寄存器地址;重新发送起始位,即restart;重新发送slave地址+read bit set;读取数据主机接收器在接收到最后一个字节后,也不会发出ACK信号。于是,从机发送器释放SDA线,以允许主机发出P信号结束传输。 发送停止位

详细信息:

为了加深对I2C公交的理解,用C语言模拟IIC公交,边看源代码边看波形:

写操作的时序图如下图所示:

本文转载自bitart在Blog Park的博客,并进行整理。

1.《I2C总线 I2C总线详解》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《I2C总线 I2C总线详解》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/shehui/1799482.html