IIC总线协议,7位,8位,10位地址

IIC总线

1.1. 概述
IIC开发于1982年,当时是为了给电视机内的CPU和外围芯片提供更简易的互连方式。电视机是最早的嵌入式系统之一,而最初的嵌入系统是使用内存映射(memory-mapped I/O)的方式来互连微控制器和外围设备的。要实现内存映射,设备必须并行连入微控制器的数据线和地址线,这种方式在连接多个外设时需大量线路和额外地址解码芯片,很不方便并且成本高。
为了节省微控制器的引脚和和额外的逻辑芯片,使印刷电路板更简单,成本更低,位于荷兰的Philips实验室开发了IIC(Inter-Integrated Circuit),它是由数据线 SDA和时钟线SCL两根线构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送
IIC数据传输速率有标准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps),另外一些变种实现了低速模式(10 kbps)和快速+模式(1 Mbps)
在这里插入图片描述
1.2. 硬件结构
每一个I2C总线器件内部的SDA、SCL引脚电路结构都是一样的,引脚的输出驱动与输入缓冲连在一起。其中输出为漏极开路的场效应管、输入缓冲为一只高输入阻抗的同相器。这种电路具有两个特点:

由于 SDA、SCL 为漏极开路结构,借助于外部的上拉电阻实现了信号的“线与”逻辑;
引脚在输出信号的同时还能对引脚上的电平进行检测,检测是否与刚才输出一致。为 “时钟同步”和“总线仲裁”提供硬件基础。

1.3. 数据类型
IIC数据传输的过程中,数据帧的大小固定为8位的字节,高位先发送。

主控器向被控器发送的信息种类有:
启动信号、停止信号、7位地址码、读/写控制位、10位地址码(地址扩展)、数据字节、重启动信号、应答信号、时钟脉冲。

被控器向主控器发送的信息种类有:
应答信号、数据字节、时钟低电平(时钟拉伸)。

1.3.1. 总线空闲状态
IIC总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

1.3.2. 启动信号
SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据

1.3.3. 结束信号
SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

1.3.4. 重新开始信号
在IIC总线上,由主机发送一个开始信号启动一次通信后,在首次发送停止信号之前,主机通过发送重新开始信号,可以转换与当前从机的通信模式,或是切换到与另一个从机通信。当SCL为高电平时,SDA由高电平向低电平跳变,产生重新开始信号,它的本质就是一个开始信号
在这里插入图片描述

1.3.5. 应答信号
IIC总线上的所有数据都是以8位字节传送的,发送器每发送一个字节,就在第9个时钟脉冲期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

因此一个完整的字节数据传输需要9个时钟脉冲。如果从机作为接收方向主机发送非应答信号,主机方就认为此次数据传输失败;如果是主机作为接收方,在从机发送器发送完一个字节数据后,向从机发送了非应答信号,从机就认为数据传输结束,并释放SDA线。不论是以上哪种情况都会终止数据传输,这时主机或是产生停止信号释放总线或是产生重新开始信号,开始一次新的通信。
在这里插入图片描述

1.3.6. 数据传送位
在IIC总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。进行数据传送时,在SCL呈现高电平期间,SDA上的电平必须保持稳定。只有在SCL为低电平期间,才允许SDA上的电平改变状态。
在这里插入图片描述

1.3.7. 插入等待时间
如果被控器需要延迟下一个数据字节开始传送的时间,则可以通过把时钟线SCL电平拉低并且保持,使主控器进入等待状态。一旦被控器释放时钟线,数据传输就得以继续下去,这样就使得被控器得到足够时间转移已经收到的数据字节,或者准备好即将发送的数据字节。

带有CPU的被控器在对收到的地址字节做出应答之后,需要一定的时间去执行中断服务子程序,来分析或比较地址码,其间就把SCL线钳位在低电平上,直到处理妥当后才释放SCL线,进而使主控器继续后续数据字节的发送
在这里插入图片描述

1.3.8. 总线冲突和总线仲裁
假如在某IIC总线系统中存在两个主器件节点,分别记为主器件1和主器件2,其输出数据分别为DATA1和DATA2,它们都有控制总线的能力,这就存在着发生总线冲突(即写冲突)的可能性。

假设在某一瞬间两者相继向总线发出了启动信号,鉴于:I2C总线的“线与”特性,使得在数据线SDA上得到的信号波形是DATA1和DATA2两者相与的结果

在总线被启动后,主器件1企图发送数据“101……”,主器件2企图发送数据“100……”。

两个主器件在每次发出一个数据位的同时都要对自己输出端的信号电平进行抽检,只要抽检的结果与它们自己预期的电平相符,就会继续占用总线,总线控制权也就得不到裁定结果。

主器件1的第3位期望发送“1”,也就是在第3个时钟周期内送出高电平。在该时钟周期的高电平期间,主器件1进行例行抽检时,结果检测到一个不相匹配的电平“0”,这时主器件1只好决定放弃总线控制杈;因此,主器件2就成了总线的惟一主宰者,总线控制权也就最终得出了裁定结果,从而实现了总线仲裁的功能。

从以上总线仲裁的完成过程可以得出:仲裁过程主器件1和主器件2都不会丢失数据;各个主器件没有优先级别之分,总线控制权是随机裁定的。

系统实际上遵循的是“低电平优先”的仲裁原则,将总线判给在数据线上先发送低电平的主器件,而其他发送高电平的主器件将失去总线控制权

1.3.9. 时钟同步
如果在某一I2C总线系统中存在两个主器件节点,分别记为主器件1和主器件2,其时钟输出端分别为CLK1和CLK2,它们都有控制总线的能力。

假设在某一期间两者相继向SCL线发出了波形不同的时钟脉冲序列CLK1和CLK2,在总线控制权还没有裁定之前这种现象是可能出现的。

鉴于IIC总线的“线与”特性,使得时钟线SCL上得到的时钟信号波形,既不像主器件1所期望的CLK1,也不像主器件2所期望的CLK2,而是两者进行逻辑与的结果。

CLKI和CLK2的合成波形作为共同的同步时钟信号,一旦总线控制权裁定给某一主器件,则总线时钟信号将会只由该主器件产生

1.3.10. 总线封锁状态
在特殊情况下,如果需要禁止所有发生在I2C总线上的通信活动,封锁或关闭总线是一种可行途径,只要挂接于该总线上的任意一个器件将时钟线SCL锁定在低电平上即可。

1.3.11. 高速模式
原理上讲,使用上拉电阻来设置逻辑1会限制总线的最大传输速度。而速度是限制总线应用的因素之一。这也说明为什么要引入高速模式(3.4 Mbps)。在发起一次高速模式传输前,主设备必须先在低速的模式下(例如快速模式)发出特定的“High Speed Master”信号。为缩短信号的周期和提高总线速度,高速模式必须使用额外的I/O缓冲区。另外,总线仲裁在高速模式下可屏蔽掉。

1.3.12. 时钟拉伸
在 IIC 通信中,主设备决定了时钟速度。因为时钟脉冲信号是由主设备显式发出的。但是,当从设备没办法跟上主设备的速度时,从设备需要一种机制来请求主设备慢一点。这种机制称为时钟拉伸,而基于I²C结构的特殊性,这种机制得到实现。当从设备需要降低传输的速度的时候,它可以拉下时钟线,逼迫主设备进入等待状态,直到从设备释放时钟线,通信才继续。

1.4. 通信过程
首先,主设备发一个START信号,然后其它设备开始监听总线以准备接收数据。接着,主设备发送一个7位设备地址加一位的读写操作的数据帧。当所有从设备接收数据后,比对地址自己是否目标设备。如果比对不符,设备进入等待状态,等待STOP信号的来临;如果比对相符,设备会发送一个应答信号——ACK作回应。

当主设备收到应答后便开始传送或接收数据。数据帧大小为8位。主设备发送数据,从设备应答;相反从设备发送数据,主设备应答。当数据传送完毕,主设备发送一个STOP信号,向其它设备宣告释放总线,其它设备回到初始状态。

1.5. 寻址约定
为了消除IIC总线系统中主控器与被控器的地址选择线,最大限度地简化总线连接线,IIC总线采用了独特的寻址约定,规定了开始信号后的第一个字节为寻址字节,用来寻址被控器件,并规定数据传送方向。

在IIC总线系统中,寻址字节由七位地址位(它占据了D7-D1位)和一位方向位(为D0位)组成。方向位为0时表示主控器将数据写入被控器,为 1时表示主控器从被控器读取数据。主控器发送开始信号后,立即发送寻址字节,这时总线上的所有器件都将寻址字节中的7位地址与自己器件地址比较。如果两者相同,则该器件认为被主控器寻址,并发送应答信号,被控器根据读/写位确定自身是作为发送器还是接收器。

主器件作为被控器时,其7位从地址在IIC总线地址寄存器中给定,为纯软件地址。而非单片机类型的外围器件地址完全由器件类型与引脚电平给定。IIC总线系统中,没有两个从机的地址是相同的。主控器不应该传输一个和它本身的从地址相同的地址。

7位I2C总线可以挂接127个不同地址的I2C设备,0号”设备”作为群呼地址.

地址的分配方法有两种:

含CPU的智能器件,地址由软件初始化时定义,但不能与其它的器件有冲突
不含CPU的非智能器件,由厂家在器件内部固化,不可改变。
高7位为地址码,其分为两部分:

高4位属于固定地址不可改变,由厂家固化的统一地址;
低三位为引脚设定地址,可以由外部引脚来设定(并非所有器件都可以设定);
常用IIC接口通用器件的器件地址是由种类型号以及寻址码组成的,共7位。如格式如下:
D7 D6 D5 D4 D3 D2 D1 D0
器件类型由:D7-D4 共4位决定的。这是由半导公司生产时就已固定的了,也就是说这4位已是固定的。用户自定义地址码:D3-D1共3位。这是由用户自己设置的,通常的作法如EEPROM这些器件是由外部IC的3个引脚所组合电平决定的(用常用的名字如A0,A1,A2)。这也就是寻址码。所以为什么同一IIC总线上同一型号的IC只能最多共挂8片同种类芯片的原因了。

1.6. 写过程
主机在检测到总线为“空闲状态”(即 SDA、SCL 线均为高电平)时,发送一个启动信号“S”,开始一次通信的开始
主机接着发送一个命令字节。该字节由 7 位的外围器件地址和 1 位读写控制位 R/W组成(此时 R/W=0为写)
相对应的从机收到命令字节后向主机回馈应答信号 ACK(ACK=0)
主机收到从机的应答信号后开始发送第一个字节的数据
从机收到数据后返回一个应答信号 ACK
主机收到应答信号后再发送下一个数据字节
当主机发送最后一个数据字节并收到从机的 ACK 后,通过向从机发送一个停止信号P结束本次通信并释放总线。从机收到P信号后也退出与主机之间的通信
在这里插入图片描述

注意:①主机通过发送地址码与对应的从机建立了通信关系,而挂接在总线上的其它从机虽然同时也收到了地址码,但因为与其自身的地址不相符合,因此提前退出与主机的通信;②主机的一次发送通信,其发送的数据数量不受限制。主机是通过 P 信号通知发送的结束,从机收到 P 信号后退出本次通信;③主机的每一次发送后都是通过从机的 ACK 信号了解从机的接收状况,如果应答错误则重发。
1.7. 读过程
主机发送启动信号后,接着发送命令字节(其中 R/W=1)
对应的从机收到地址字节后,返回一个应答信号并向主机发送数据
主机收到数据后向从机反馈一个应答信号
从机收到应答信号后再向主机发送下一个数据
当主机完成接收数据后,向从机发送一个“非应答信号(ACK=1)”,从机收到ACK=1 的非应答信号后便停止发送
主机发送非应答信号后,再发送一个停止信号,释放总线结束通信
在这里插入图片描述
注意:主机所接收数据的数量是由主机自身决定,当发送“非应答信号/A”时从机便结束传送并释放总线(非应答信号的两个作用:前一个数据接收成功,停止从机的再次发送)。
1.8. 总线死锁原因分析
I2C总线写操作过程中,主机在产生启动信号后控制SCL产生8个时钟脉冲,然后拉低SCL信号为低电平,在这个时候,从机输出应答信号,将SDA信号拉为低电平。如果这个时候主机异常复位,SCL就会被释放为高电平。此时,如果从机没有复位,就会继续I2C的应答,将SDA一直拉为低电平,直到SCL变为低电平,才会结束应答信号。而对于主机来说,复位后检测SCL和SDA信号,如果发现SDA信号为低电平,则会认为I2C总线被占用,会一直等待SCL和SDA信号变为高电平。这样,主机等待从机释放SDA信号,而同时从机又在等待主机将SCL信号拉低以释放应答信号,两者相互等待,I2C总线进人一种死锁状态。同样,当I2C进行读操作时,从机应答后输出数据,如果在这个时刻主机异常复位而此时从机输出的数据位正好为0,也会导致I2C总线进入死锁状态。

解决方案通常有如下几种:

将从机的电源设计为可控,当发生总线死锁的时将从机复位
可以在从机的程序中加入监测功能,如果总线长时间被拉低则释放对总线的控制
在主机中增加I2C总线恢复程序。每次主机复位后,如果检测到SDA被拉低,则控制SCL产生<=9个时钟脉冲(针对8位数据的情况),每发送一个时钟脉冲就检测SDA是否被释放,如果SDA已经被释放就再模拟产生一个停止信号,这样从机就可以完成被挂起的读写操作,从死锁状态中恢复过来。这种方法有一定的局限性,因为大部分主机的I2C模块由内置的硬件电路来实现,软件并不能够直接控制SCL信号模拟产生需要的时钟脉冲
1.9. 地址扩展
任何IIC设备都有一个7位地址,理论上,现实中只能有127种不同的IIC设备。实际上,已有IIC的设备种类远远多于这个限制,在一条总线上出现相同的地址的IIC设备的概率相当高。为了突破这个限制,很多设备使用了双重地址——7位地址加引脚地址(external configuration pins)。IIC 标准也预知了这种限制,提出10位的地址方案。
10位的地址方案对 IIC协议的影响有两点:

地址帧为两个字节长,原来的是一个字节;
第一个字节前五位最高有效位用作10位地址标识,约定是“11110”。
在这里插入图片描述

1.10. IIC总线典型应用
IIC设备典型应用:
在这里插入图片描述
物理结构上,IIC系统由一条串行数据线SDA和一条串行时钟线SCL组成。主机按一定的通信协议向从机寻址和进行信息传输。在数据传输时,由主机初始化一次数据传输,主机使数据在SDA线上传输的同时还通过SCL线传输时钟。信息传输的对象和方向以及信息传输的开始和终止均由主机决定。

每个器件都有一个唯一的地址,而且可以是单接收的器件(例如:LCD驱动器)或者可以接收也可以发送的器件(例如:存储器)。发送器或接收器可以在主模式或从模式下操作,这取决于芯片是否必须启动数据的传输还是仅仅被寻址。

以上原文链接:https://blog.csdn.net/u010650845/article/details/73467586

关于7,8,10位地址的讲解

7位寻址
在7位寻址过程中,从机地址在启动信号后的第一个字节开始传输,该字节的前7位为从机地址,第8位为读写位,其中0表示写,1表示读。

在这里插入图片描述

图1:7位寻址。I2C总线规范规定,标准模式I2C,从机地址为7位长,其次是读/写位。

任何I2C设备都必须遵循这个标准,USB2XXX传输的从机地址即为这7bit地址,不包含读写位,读写位会根据不同的函数自动添加进去。

保留地址
I2C规范保留了两组和8个地址,1111XXX和0000XXX。这些地址用于特殊用途。下表已被取自 I2C规范(2000年)。

从机地址+R/W描述
0000 0000呼叫地址
0000 0001起始字节
0000 001XCBUS地址
0000 010X保留供不同的总线格式
0000 011X保留将来用
0000 1XXXHS模式主机码
1111 0XXX10位从机地址
1111 1XXX保留将来用

8位地址
一些厂商在提供从机地址的时候说的是包含了读写位的8bit地址,比如他说写地址为0x92,读地址为0x93,如下图所示
在这里插入图片描述

这种情况下,你只需要将这个地址的前7bit提取出来,然后传入USB2XXX的接口函数即可,比如为0x49。

还有一种方式可以判断厂商提供的地址是7bit模式地址还是8bit地址模式的地址,7bit地址模式下,地址的取值范围在0x07到0x78之间,若超过了这个范围,那么这个地址可能就是8bit地址。

图片关键词

图3:有效的7bit地址范围

10位寻址
I2C总线的10bit寻址和7bit寻址是兼容的,这样就可以在同一个总线上同时使用7bit地址和10bit地址模式的设备,在进行10bit地址传输时,第一字节是一个特殊的保留地址来指示当前传输的是10bit地址。

在这里插入图片描述

在使用USB2XXX传输10bit地址模式的时候,只需要在初始化的时候配置为10bit地址模式,然后再调用读写数据函数的时候传入正确的10bit地址即可。

以上原文链接:https://www.cnblogs.com/aspirs/p/12371237.html

  • 10
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值