IIC协议

一、IIC总线简介

        IIC总线是飞利浦半导体公司(现改名为恩智浦)研发的一种串行总线,IIC总线串行数据线是一个双向口,可以进行数据的双向传输,这种设计理念解决了数字控制电路中的难题,数字信号沿正方向传输到控制系统中。IIC总线具有良好的通用性和生产兼容性,无论是NMOS工艺、CMOS工艺还是TTL工艺,IIC总线都能支持。

       IIC总线支持多主机系统,所谓主机就是指能够控制总线信息传输的器件,也称主器件,一般地,主器件是微处理机或单片机,IIC总线允许有两个或两个以上的这样的器件挂接在系统上,IIC总线式一个多主机的总线,即总线上允许有超过一个能控制总线的器件存在。

       IIC通讯协议和通信接口在很多工程中有广泛的应用,如数据采集领域的串行AD,图像处理领域的摄像头配置,工业控制领域的X涉嫌管配置等等。除此之外,由于IIC协议占用引脚特别少,硬件实现简单,可扩展性强,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。

二、IIC总线的特点

IIC总线协议有如下特点:

(1)电路结构简单,只有两根数据线进行数据传输,即串行数据线(SDA)和串行时钟线(SCL);数据线即用来表示数据,时钟线用于数据收发同步;

(2)挂接在IIC总线上的任何器件都被赋予一个唯一的地址,这个地址式用软件输入的;主机可以利用这个地址进行不同设备之间的访问;

(3)IIC总线协议有三个版本,对应三个版本有三种模式,分别式标准模式、快速模式和高速模式,对应着三种模式的IIC总线的数据线也存在三个传输速率,分别式100Kbit/s、400Kbit/s、3.4Mbit/s;但是目前大多数的IIC设备尚不支持高速模式;

(4)IIC总线接口芯片上通常会配有滤波器,用于总线的串行数据线上,可将数据线上的毛刺除去;

(5)控制总线的主器件,既可以发送数据到从器件,也可以由从器件接收数据,无论发送或接收数据都经由双向的串行数据线传送;

(6)IIC总线支持多主机系统,若有多个主器件同时对总线发起控制,IIC总线协议中的总线仲裁和冲突检测可以解决,数据不会丢失;

(7)IIC总线没有片选线,因此挂接在IIC总线上的器件数量不受片选线的控制,只由总线上的最大总容抗不大于400pF决定。

(8)总线通过上拉电阻接到电源,当IIC设备空闲时,会输出高阻态,而当所有设备都空闲时,都输出高阻态,由上拉电阻把总线拉成高电平;

缺点:数据的传输速率比SPI慢,数据帧的大小限制在8位。

三、IIC总线的硬件结构

 IIC通讯设备之间的常用连接方式,如图所示:

         IIC总线的硬件结构是两根用三态门实现的,能进行数据双向传输的线,分别是串行数据线(SDA)和串行时钟线(SCL)。外围设备或为处理器挂接到总线上,只需要自身的数据线和时钟线分别于IIC总线的串行数据线和串行时钟线相连即可,整个系统的结构是否简单明了。

         由于IIC总线的串行数据线和串行时钟线都是双向口,因此系统中的各个器件都采用集电极开路或漏极开路的结构,他们通过一个上拉电阻Rp连接到电源电压VCC上,如图所示。

        因为每个器件都是通过电阻间连接到一个高电压上,因此IIC总线不被使用时,各器件的串行数据线和串行时钟线都为高电平。一旦某一设备要使用总线,将自身的信号拉低,那么与其相连的总线上相应的信号线也会被拉低,可以说每个器件的数据线都是相“与”的关系,同时每个器件的时钟线也是相“与”的关系,这种关系统称为“线与”。

        串行数据线SDA是双向的,对外SDA只有一根线,但在IIC总线接口芯片内部被分为两根线,分别为SDA_in和SDA_out。SDA_in接在MOS管的漏极,用来接收总线上发送的数据,SDA_out接在MOS管的栅极,用来将要发送的数据推导总线上。当然串行时钟线SCL也是采用双向口实现的,SCL在器件内部也被分为SCL_in和SCL_out两根线。对主器件来说,他利用SCL_out向总线发出控制信号,决定总线的使用;而主器件来说,他利用SCL_in的电平加以监测,根据SCL_in的高地电平情况决定下一步的动作。对于从器件来说,从器件的SCL_in也是用于监测总线上时钟的变化情况,从而决定了自身合适发送或接收数据,而SCL_out可以用来拉低总线的时钟线,迫使总线进入等待状态。

IIC总线的这种集电极开路或漏极开路的结构有很多优势,具体来说有以下三点:

(1)总线不被使用时,串行数据线和串行时钟线都通过电阻与高电平相连,信号电平保持稳定,不损耗电流,因此这种结构能达到减小静态功耗的作用。

(2)电源电压的选择可以与IIC总线上挂接的器件的工作电压保持一致,因此IIC总线电气兼容性良好。

(3)各个设备的数据线可以不通过任何额外的电路而直接互联,同理各设备的时钟线也可以直接互联。

四、IIC总线协议介绍

        IIC总线协议规定,主器件通过改变串行时钟线和串行数据线发起一根开始信号,然后通过SDA线进行数据的传输,数据传输的过程要注意数据的有效性和地址器件的格式,每传输一字节的数据,数据的接收方就要给出一根应答信号,串行时钟线被拉低迫使总线进入等待状态,传输过程的终止需要主器件发出停止信号。除此之外,IIC总线协议还包括时钟同步和总线仲裁。

       4.1开始信号和停止信号

          在IIC总线上发起一次数据传输,首先要由主器件产生开始信号,才能表征一根数据传输进程的开始,数据传送完成后,同样要由主器件产生结束信号,才能表征一根数据传输进程的结束。

         所谓开始信号,就是当串行时钟线SCL为1时,串行数据线SDA的逻辑电平由1变为0,串行数据线在跳变的过程中,串行时钟线上的高电平必须保持不变,这样时钟线和数据线的组合就称之为开始信号,当主器件按对IIC总线发送开始信号时,标志总线进入忙状态。

        所谓结束信号,就是当串行时钟线SCL为高电平时,串行数据线SDA从低电平跳变为高电平,串行数据线跳变的过程中,串行时钟线上的高电平必须保持不变,这种的时钟线和数据线的组合称之为结束信号。下面给出了IIC总线的开始信号和停止信号的时序图。

      4.2数据的稳定性

        对于通信系统来说,数据传输能够正确而有效地进行是十分重要的,因此,IIC总线协议特别对数据稳定性加以规定。

        当串行时钟线SCL为高电平时,串行数据线SDA上不能有信号的跳变,必须保持稳定,当串行时钟线SCL为低电平时,才允许串行数据线SDA上的数据改变。下面给出了数据稳定的示意图。

      4.3应答机制

        在IIC总线的串行数据线上的传输的数据必须以8bit为一个字节,总线协议中并不对传输的字节数加以控制。串行数据线上传输8bit数据之后,必须由数据的接收方给出一个应答信号ACK,接收方不给应答信号的情况称之为非应答。应答信号也可称之为握手信号,是总线协议为保证数据传输过程中数据不丢失而采取的有效手段。当数据的接收方因特殊情况不难一次性完整的接收8bit数据时,他就可以通过SCL的输出电路SCL_out将总线的串行时钟线SCL的电平拉低,迫使总线进入等待状态,知道数据的接收方可以接收数据之后,将总线的串行时钟线的电平置高,这样通信就能正常继续进行。

      4.4   7位地址格式

       主设备向IIC总线发出开始信号产生后,主设备会向串行数据线SDA上发送一个字节的地址信息,这个地址信息就是此主设备将于之发生通信的从设备之间的地址。IIC总线由两种地址格式,这里采用7位地址格式。所谓的7位地址格式是指7位从器件的地址,最低位表示数据传输方向,“1”表示主器件向从器件写入数据,“0”表示主器件向从器件读取数据,具体表示如下图:

        通常情况下,要想终止一次数据传输进行,需要发起本次数据传输的主设备通过发出一个停止信号来完成。如果主设备仍有其他的数据需要传输,那么他就可以再一次发送一个开始信号,而不是发送停止信号,这样新一轮的数据传输就能开始,主设备同理需要重新发送从设备的地址,以此寻找新的通信方。数据的传输中有三种不同的格式:

(1)主设备作为数据发送方,从设备作为数据接收方,整个信息传输进程中,数据传输方向保持一致,即主设备写数据到从设备。首先由主设备产生一个开始信号,再发送7位从器件地址加一位读写方向,寻址成功后,相应的从器件会产生一个应答信号,此后主设备便可以发送8位数据到总线上,每接收到一字节的数据,从设备就要产生一个应答信号,直到主设备发出停止信号。传输格式如下:

 

(2)从设备发送数据,由主设备接收。先有主设备发送一字节的从设备地址信息,此时主设备时数据发送方,从设备时数据接收方。个从设备接收到地址后,于自身的地址比较,地址一致的从设备给出应答信号。寻址成功后从设备就成了数据的发送方,主设备就成为了数据的接收方。主设备通过总线读取从设备的数据信息,从设备没发送来一字节的数据,主设备接收后就要给一个应答信号,停止本次传输的停止信号需要主设备给出。数据传输格式如下图所示:

 

(3)第三种属于复合格式,数据传输的格式在传输过程中会改变,改变数据流向时,主设备必须再次开始信号和要寻址的从设备地址,才能开始一个新的数据传输进程。数据传输格式如图所示:

 

 

### IIC协议的工作原理 IIC(Inter-Integrated Circuit)是一种用于于短距离通信的同步串行总线协议,广泛应用于嵌入式系统中的芯片间通信。以下是其工作原理的关键点: #### 1. 总线结构 IIC协议使用两条主要线路进行通信: - **SCL (Serial Clock Line)**:时钟信号线,由主设备控制,用于同步数据传输。 - **SDA (Serial Data Line)**:数据信号线,用于在主设备和从设备之间传递数据。 这两条线均需上拉电阻连接至电源电压,以确保默认状态为高电平[^4]。 --- #### 2. 数据帧格式 每个字节的数据传输遵循固定的格式: - 每次传输一个字节(8位),高位优先。 - 字节之后跟随一个应答位(ACK/NACK)。 具体流程如下: - 主设备发起START条件,通知从设备即将开始通信。 - 发送地址帧(7位地址+1位读/写标志)并等待从设备返回ACK。 - 进行数据交换(单向或多向)。 - 结束时发送STOP条件,释放总线[^3]。 --- #### 3. 应答机制 - **ACK**:当接收方成功接收到数据后,会将SDA线拉低作为确认信号。 - **NACK**:如果接收方无法处理当前数据或无需进一步操作,则保持SDA为高电平。 这种机制可以有效检测错误并协调双方的速度差异[^3]。 --- #### 4. 通信模式 根据速率和支持功能的不同,IIC定义了几种传输模式: | 模式名称 | 最大波特率 | 方向 | |------------------|--------------|------------| | 标准模式 | 100 kbps | 双向 | | 快速模式 | 400 kbps | 双向 | | 快速模式 Plus | 1 Mbps | 双向 | | 超级快速模式 | 5 Mbps | 单向 | 不同模式之间的兼容性取决于具体的实现需求[^5]。 --- #### 5. 实现细节 以下是一个典型的主机接收过程代码示例,展示了如何利用IIC协议完成数据获取: ```c u8 IIC_Read_Byte(u8 ack) { u8 i, receive = 0; // 将SDA设置为输入模式 IIC_SDA_IN(); for (i = 0; i < 8; i++) { SCL = 0; // 下降沿触发 delay_us(2); SCL = 1; // 上升沿采样 delay_us(2); receive <<= 1; // 移动已接收位 if (Read_Sda()) { // 如果SDA为高电平 receive++; } } if (!ack) { IIC_NAck(); // 不发送应答 } else { IIC_Ack(); // 发送应答 } return receive; } ``` 此函数实现了逐位读取的功能,并依据参数决定是否发出应答信号[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炎龙铠甲会合体

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值