详细解析IIC通信协议苍月代表我

1、IIC简介I2C(Inter-integratedCircuit集成电路总线)总线支持设备之间的短距离通信,用于处理器和一些外围设备之间的接口,它只需要两根信号线来完成信息交换。I2C的一个特殊优势是微控制器只需两个通用I/O引脚和软件即可控制器件芯片网络。I2C最早是飞利浦在1982年开发设计并用于自己的芯片上,一开始只允许100kHz、7-bit标准地址。1992年,I2C的第一个公共规范发行,增加了400kHz的快速模式以及10-bit扩展地址。

在I2C的基础上,1995年Intel提出了“SystemManagementBus”(SMBus),用于低速设备通信,SMBus把时钟频率限制在10kHz~100kHz,但I2C可以支持0kHz~5MHz的设备:

普通模式(100kHz即100kbps)、快速模式(Fm)(400kHz)、快速模式+(Fs+)(1MHz)、高速模式(Hs)(3.4MHz)、超高速模式(UFm)(5MHz)。注:基于IIC是Master与Slave模式,所以两者间的通信要保持时钟频率的一致。IIC是半双工。

2、IIC应用I2C适用于外围设备,其简单性和低制造成本比速度更重要。I2C总线的常见应用包括:

通过小型ROM配置表描述可连接设备,以实现“即插即用”操作,例如:双列直插式内存模块(DIMM)上的串行存在检测(SPD)EEPROM通过VGA,DVI和HDMI连接器为显示器提供扩展显示识别数据(EDID)。通过SMBus对PC系统进行系统管理;SMBus引脚分配在常规PCI和PCIExpress连接器中。访问保持用户设置的实时时钟和NVRAM芯片。访问低速DAC和ADC。更改显示器中的对比度,色调和色彩平衡设置(通过显示数据通道)。改变智能扬声器的音量。控制小型(例如功能手机)OLED或LCD显示器。读取硬件监视器和诊断传感器,例如风扇的速度。打开和关闭系统组件的电源3、IIC协议I2C协议把传输的消息分为两种类型的帧:

地址帧——用于master指明消息发往哪个slave;

数据帧(单个或者连续)——由master发往slave的数据(或由slave发往master),每一帧是8-bit的数据。

通常我们所说的IIC读写是相对于Master来说的。

下图描述的是一个IIC完整时序图,从左往右依次看,大致总结为两类:

IIC写寄存器的标准流程:

Master发起STARTMaster发送I2Caddr(7bit)和w操作0(1bit),等待ACKSlave发送ACKMaster发送regaddr(8bit),等待ACKSlave发送ACKMaster发送data(8bit),即要写入寄存器中的数据,等待ACKSlave发送ACK第6步和第7步可以重复多次,即顺序写多个寄存器Master发起STOPIIC读寄存器流程:

Master发送I2Caddr(7bit)和W操作1(1bit),等待ACKSlave发送ACKMaster发送regaddr(8bit),等待ACKSlave发送ACKMaster发起STARTMaster发送I2Caddr(7bit)和R操作1(1bit),等待ACKSlave发送ACKSlave发送data(8bit),即寄存器里的值Master发送ACK第8步和第9步可以重复多次,即顺序读多个寄存器

下面会详细这些流程:

3.1开始条件(StartCondition)要启动地址帧,Master将SCL保持为高电平并将SDA拉低。也就是说,开始条件表现为:当SCL为高电平时,SDA线上的高电平到低电平的跳变即定义了START条件。这使得所有Slave都注意到传输即将开始。如果两个Master希望一次获得总线的所有权,则无论哪个设备将SDA拉低,第一个将SDA拉低的将获得对总线的控制权。Master可以发出重复启动,启动新的通信序列而不放弃对其他Master的控制;我们稍后再谈。

3.2地址帧(AddressFrame)在任何新的通信序列中,地址帧始终是第一个。对于7位地址,地址首先输出最高有效位(MSB),然后是R/W位,指示这是读(1)还是写(0)操作。

帧的第9位是NACK/ACK位。所有帧(数据或地址)都是这种情况。一旦发送帧的前8位,接收设备就可以控制SDA。如果接收设备在第9个时钟脉冲之前没有将SDA线拉低,则可以推断出接收设备要么没有接收到数据,要么不知道如何解析消息。在这种情况下,则由master来决定如何处理(stop或repeatedstartcondition),也就是代码中等待超时需要做什么处理。

3.3数据帧(DataFrame)在发送地址帧之后,可以开始传输数据。Master将以规则的间隔继续生成时钟脉冲,数据将由Master或Slave置于SDA上,具体取决于R/W位是否指示读或写操作。数据帧的数量是任意的,并且大多数从器件将自动递增内部寄存器,这意味着后续读取或写入将来自下一个寄存器。

3.3.1写一个寄存器:

3.3.2写多个寄存器:

3.3.3读一个寄存器:图片缺失

3.3.4读多个寄存器:

3.4停止条件(StopCondition)一旦发送了所有数据帧,主设备将生成停止条件。停止条件由SCL上0->1转换后SDA上的0->1(低到高)转换定义,SCL保持高电平。在正常的数据写操作时,SDA上的值应该不会当SCL为高电平改变,以避免错误的停止条件。图如3.1小节所示。

4、IIC协议的高级特性4.110-bit地址在10-bit地址的I2C系统中,需要两个帧来传输slave的地址。第一个帧的前5个bit固定为b11110,后接slave地址的高2位,第8位仍然是R/W位,接着是一个ACK位,由于系统中可能有多个10-bitslave设备地址的高2bit相同,因此这个ACK可能由多有slave设备设置。第二个帧紧接着第一帧发送,包含slave地址的低8位(7:0),接着该地址的slave回复一个ACK(或NACK)。

注意:10-bit地址的设备和7-bit地址的设备在一个系统中是可以并存的,因为7-bit地址的高5位不可能是b11110。实际上对于7-bit的从设备地址,合法范围为b0001XXX-b1110XXX,’X’表示任意值,因此该类型地址最多有112个(其他为保留地址[1])。

两个地址帧传输完成后,就开始数据帧的传输了,这和7-bit地址中的数据帧传输过程相同。

4.2重复开始条件(repeatedstartcondition)有时master需要在一次通信中进行多次消息交换(例如与不同的slave传输消息,或切换读写操作),并且期间不希望被其他master干扰,这时可以使用“重复开始条件”

在一次通信中,master可以产生多次startcondition,来完成多次消息交换,最后再产生一个stopcondition结束整个通信过程。由于期间没有stopcondition,因此master一直占用总线,其他master无法切入。

为了产生一个重复的开始条件,SDA在SCL低电平时拉高,然后SCL拉高。接着master就可以产生一个开始条件继续新的消息传输(按照正常的7-bit/10-bit地址传输时序)。重复开始条件的传输时序如下图所示:

4.3时钟拉伸有时,低速slave可能由于上一个请求还没处理完,尚无法继续接收master的后续请求,即master的数据传输速率超过了slave的处理能力。这种情况下,slave可以进行时钟拉伸来要求master暂停传输数据。

通常时钟都是由master提供的,slave只是在SDA上放数据或读数据。而时钟拉伸则是slave在master释放SCL后,将SCL主动拉低并保持,此时要求master停止在SCL上产生脉冲以及在SDA上发送数据,直到slave释放SCL(SCL为高电平)。之后,master便可以继续正常的数据传输了。可见时钟拉伸实际上是利用了时钟同步的机制(见下文),只是时钟由slave产生。

如果系统中存在这种低速slave并且slave实现了clockstretching,则master必须实现为能够处理这种情况,实际上大部分slave设备中不包含SCL驱动器的,因此无法拉伸时钟。

所以更完整的I2C数据传输时序图为:

4.4时钟同步和仲裁如果两个master都想在同一条空闲总线上传输,此时必须能够使用某种机制来选择将总线控制权交给哪个master,这是通过时钟同步和仲裁来完成的,而被迫让出控制权的master则需要等待总线空闲后再继续传输。在单一master的系统上无需实现时钟同步和仲裁。

4.5时钟同步时钟同步是通过I2C接口和SCL之间的线“与”(wired-AND)来完成的,即如果有多个master同时产生时钟,那么只有所有master都发送高电平时,SCL上才表现为高电平,否则SCL都表现为低电平。

4.6总线仲裁总线仲裁和时钟同步类似,当所有master在SDA上都写1时,SDA的数据才是1,只要有一个master写0,那此时SDA上的数据就是0。一个master每发送一个bit数据,在SCL处于高电平时,就检查看SDA的电平是否和发送的数据一致,如果不一致,这个master便知道自己输掉仲裁,然后停止向SDA写数据。也就是说,如果master一直检查到总线上数据和自己发送的数据一致,则继续传输,这样在仲裁过程中就保证了赢得仲裁的master不会丢失数据。

输掉仲裁的master在检测到自己输了之后也不再产生时钟脉冲,并且要在总线空闲时才能重新传输。

仲裁的过程可能要经过多个bit的发送和检查,实际上两个master如果发送的时序和数据完全一样,则两个master都能正常完成整个的数据传输。

THE END
1.IIC协议IIC总线在传输数据的过程中一共有三种类型信号,分别为:开始信号、结束信号和应答信号。 //起始位,停止位,数据位,速度 1. 起终信号 这些信号中,起始信号是必需的,结束信号和应答信号 起始信号 SCL =1 SDA = 1; 延时 while(!sda) 延时 终止信号 https://blog.csdn.net/2301_79405674/article/details/141103501
2.IIC总线协议详解IIC(Inter-Integrated Circuit)总线是一种由 NXP(原 PHILIPS)公司开发的两线式串行总线, 用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合 使用,传输距离短,任意时刻只能有一个主机等特性。 在CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbpshttp://www.tqpw.cn/eRMbu6Yn.shtml
3.IIC通信协议总结(详细说明完整过程)腾讯云开发者社区IIC协议把传输的消息分为两种类型的帧: 地址帧–用于master指明消息发往哪搁slave; 数据帧(单个或者连续)–由master发往slave的数据或者是接收到来自于slave的数据。一次读写单位为8bit,高位先发 注:IIC读写是相对于master来说的。IIC总线的数据传送1、数据位有效性的规定:IIC总线进行数据传送时,时钟信号为高电平https://cloud.tencent.com/developer/article/2073230
4.详解IIC通信协议以及FPGA实现业界新闻IIC也称为I2C(Inter-Integrated Circuit)由飞利浦公司(现在的恩智浦半导体)开发,是一种用于短距离数字通信的串行,同步,半双工通信接口协议;传输在标准模式下可以达到100kbit/s,在快速模式下可以达到400Kbit/s, 在快速模式增强模式下可以达到1Mbit/s,在高速模式下可以达到3.4Mbit/s。 https://www.jindouyun.cn/document/industry/details/244275
5.cubemxIIC稳定吗mob64ca1410eb61的技术博客OLED 裸屏总共种接口包括:6800、8080 两种并行接口方式、3 线或 4 线的串行 SPI 接口方式、 IIC 接口方式(只需要 2 根线就可以控制 OLED 了!),这五种接口是通过屏上的 BS0~BS2 来配置的。 0.96 寸 OLED 模块(SPI接口模块): 模块接口定义: GND 电源地 VCC 电源正(3~5.5V) D0 OLED 的 D0 脚,在https://blog.51cto.com/u_16213686/12904898