通信协议(三)——IIC协议

      最后更新:2022-06-25 17:15

      1、基础知识

      1.1 概念

      集成电路,I2C是一个由Philips开发的简单、双向同步串行总线。只有两个线可以用于将信息传输到与总线连接的设备之间。IIC总线是一个共享串行总线,它用于短距离、低速和低数据量两台设备之间的数据通信,一般用于PCB板卡上的设备之间,当然在芯片内部,该协议也可以在设计SOC时在芯片上的功能模块之间使用。

      IIC通信协议和通信接口在许多工程项目中广泛应用。例如,数据采集领域的串行AD,图像处理场相机配置,工业控制领域X射线管的配置等。除此之外,因为I2C协议的脚印特别小,硬件实现简单,可扩展型强,系统中的多个集成电路(IC)之间的通信现在被广泛应用。

      IIC分类:
      硬件IIC:与I2C驱动电路相对应的I2C芯片上有一个I2C外部的硬件电路,其I2C管脚也被特别使用,而硬件(硬件)I2C则通过直接调用内部注册表来配置。
      软件IIC:软件IIC通信指由单片机模拟的两个I/O端口,软件控制的管脚状态模拟I2C通信波形,软件模拟了注册表的工作方式。

      1.硬件I2C比软件更高效,而软件I2C更灵活,因为它不受管道限制。
      2.IIC是一种半双向通信方式

      1.2 物理层

      IIC只有两个信号线,一个是双向数据通信线SDA,一种是有效的电源和钟双功能线SCL,所有在IIC总线设备上接收的串行数据SDA都接收到总线SDA上,每个设备的时钟线SCL连接到总线SCL。每台I2C总线上的设备都有其独特的地址,确保不同设备之间访问的准确性。IIC总线允许连接多个主设备和多个设备,一般情况下,主要设备是单片芯片或FPGA,其他都是从设备。

      特点:

      主要线(Mainline)指由多个设备共享的信号线。 在IIC通信总线中,多个IIC通信设备可以连接来支持多个通信主机和多个通信接收机。

      IIC总线只使用两个总线,一个双向串行数据线(SDA)和一个串行时钟线(SCL)。一个数据线用于显示数据,一个时钟线用于同步数据接收和发送。

      3)每个连接到总线的设备都有一个独立的地址,主机可以使用它来访问不同的设备。

      当IIC设备处于闲置状态时,输出高阻尼状态,所有设备处于闲置状态时,输出高阻尼状态。

      为了防止数据冲突,在多个主机使用相同的总线时,使用仲裁来决定哪些设备占用总线。

      6)IIC数据有三个传输速率:标准模式(100kbps),快速模式(400kbps)和快速模式(3.4Mbps),其他变量实现低速模式(10kbps)和快+模式(1Mbps)。

      主机和从机的概念:

      主机负责在整个系统中协调和分配任务,主机通常通过接收主机指令完成特定任务,主机与主机之间的数据通信通过总线连接进行。 发出的主命令称为主机,收到的命令称为接收机。

      IIC的高阻态:

      Open Drain是一个高电阻状态,适合输入/输出,可以独立输入/输出低电压和平高电阻状态,必要时产生高电压水平,使用外部超负荷电阻。

      高电阻状态:高电阻状态是三个状态的门路电路的状态,逻辑门的输出分为高电压和低电压两种状态,第三个状态是高电阻的门路电路。

      我们知道所有IIC设备都连接到一个单线,因此,当我们交流时,我们往往只用少数设备进行交流,这时,其余的空置设备可能被公共汽车堵塞,或者干扰到总线。为了避免巴士信号的混淆,IIC的闲置状态只能有外部引力,这时空置设备被拖到高阻力状态,也就是相当于断路,整个IIC总线只能正常通信,如果设备打开。它不会干扰其他设备。

      IIC物理层总结:

      IIC巴士的物理连接非常简单,它由SDA(string data line)和SCL(string clock line)和超负荷抵抗组成。通信原理是控制SCL和SDA线的正常电路顺序.生成IIC总线协议所需的信号通过数据.在总线空闲状态时,SCL和SDA提高到RP抵抗,为SDA和SCL线保持高压。

      IIC通信模式是半双重的,只有一个SDA线能同时通信单道,485也是半双重的,而SPI和uart通信是完全双重的。

      1.3 协议层

      IIC总线在数据传输过程中有三个类型的信号:启动信号、结束信号和响应信号。

      1)启动信号:SCL是高电压正常,SDA从高电压跳到低电压,开始传输数据。
      2)端信号:SCL是高压正常,SDA从低压跳到高压,结束数据传输。
      3)响应信号:接收8位数据后接收数据的IC,一个集成电路将特定的低压平行脉冲发送到数据中,表示已收到数据。当CPU向控制单元发送信号后,等待控制单元发送响应信号,在CPU接收响应信号后,根据实际情况决定是否继续发送信号.若未收到应答信号,当单位被认为是控制的时,失败发生。

      IIC巴士时间线图:

      IIC通信协议过程:

      1表示“繁忙状态”,时钟信号SCL和数据信号SDA都保持高压,没有任何IIC设备工作。
      当IIC总线处于“不活跃状态”时,2表示“启动信号”,SCL仍保持高电压正常,SDA从高电压降到低电压,产生初始信号。此时,所有与总线连接的IIC设备在检测初始信号后跳出闲置状态,等待控制节点的输入。

      3表示“数据读写状态”,当串行时钟线SCL处于低压平衡状态时,SDA允许改变传输数据位(对于高电压,0为低电平),当SCL处于高压状态时,SDA要求稳定,相当于1位元数据传输的时钟周期,经过八小时的循环,传输8位数据,即一个字节。第8个时钟周期末,主机释放SDA,让服务器响应,在第9个时钟周期,从机器拉下SDA来响应;如果第九个时钟周期,SCL通常有很高的电源,SDA未被发现为低水平,视为非应答,这表明数据传输失败了。应该指出,数据以8位元传输,即每单位字符串1位元,它首先发送了线程的最高 bit 。


      当数据SDA在从低到高电压的上升过程中产生停止信号时,IIC总线跳回“繁忙状态”。

      数据读写状态的顺序如下:

      当串行时钟线SCL处于低压平衡状态时,SDA允许改变传输数据位(对于高电压,0为低电平),当SCL处于高压状态时,SDA要求稳定,相当于1位元数据传输的时钟周期,经过八小时的循环,传输8位数据,即一个字节。

      第8个时钟周期末,主机释放SDA,让服务器响应,在第9个时钟周期,从机器拉下SDA来响应;如果第九个时钟周期,SCL通常有很高的电源,SDA未被发现为低水平,视为非应答,这表明数据传输失败了。应该指出,数据以8位元传输,即每单位字符串1位元,它首先发送了线程的最高 bit 。

      1.4IIC设备地址及存储地址

      IIC器件地址:

      每个IIC设备都有设备地址,有些设备在离开工厂时设置地址。用户不可以更改,例如,OV7670地址为0x42。一些设备,例如EEPROM,以前的四个地址已定为1010,以下三个地址由硬件链接确定,因此一个IIC总线可以连接到8个EEPROM芯片。

      IIC地址:

      我们知道IIC总线是一个支持多个设备的总线,所有设备共享数据线SDA.因此,在数据线上传输数据时,每个设备如何知道这种传送是传递给自己?这需要每个设备有一个独特的地址,每个I2C设备都有一个七位设备地址。

      通常情况下,当主机与远程机建立通信时,主要的机会是直接向串行数据线SDA发送控制命令,与主机硬件连接的远程设备接收到发送给主机的控制命令.所有来自家庭的设备在收到发送给主机的控制命令后将与其自己的设备地址相比较;如果两个地址是相同的,接收器将响应响应信号,通知主机设备,在主机接收响应信号后,安装通讯接口的维修设备,两者都可以开始交流数据。

      除了设备地址外,机器设备的主机地址也被用来定位主机。 在数据传输过程中,注册表的地址被指定,数据可以写入特定注册表。 注册表地址根据机器的注册表数目分为8和16位。

      “如果主机向接收者发送地址,接收者如何知道地址是主机,并如何计算地址?”

      严格讲,主机没有向接收者发送地址,相反,主机向公共汽车发送一个地址(这个地址来自其中一个主机,而不是主机的,因此,从机器上如何知道地址是主机的问题是无关的),所有服务器都可以接收发送给主机的地址,然后每个接收器将由主机发送的地址与其自己的地址比较,如果匹配上了,接收器将向主机发送消息响应信号.接收响应信号后,主机开始向总线发送数据,与主机建立通信。 如果主机没有接收响应信号,则表示无法找到地址。

      主设备用于启动总线传输数据,并生成一个打开发送设备的时钟,在该点,任何被指定的设备被认为是来自设备。 主机与接收机之间的关系不是不变的,但取决于数据被传输的方向。

      1)如果主机想向接收机发送数据,主机首先向接收机发送地址,然后主动向接收机发送数据,最后终止主机的数据传输;
      2)如果主机想从设备接收数据,首先,从主设备到设备的地址,然后,主机接收设备发送的数据,最后, 主机终止接收过程.在这种情况下,主机负责生成定时钟和终止数据传输。这是主要设备的两个操作,即写操作和读操作。

      1.5IIC读写操作

      (1)数据写操作

      单字节数据写操作

      启动:IIC的启动信号表示传输的启动。
      DEVICE_ADDRESS:从设备地址,是机器地址的七位
      R/W: W(写)为写作, R(读)为阅读
      ACK: 应答信号
      WORD_ADDRESS: 来自机器的相应处理器的地址,例如访问 OLED处理器。
      数据:数据发送
      停止:停止信号.IIC结束

      标准流程为:

      主机发射 START
      主机发送I2C添加器(7位)和w操作0(1位),等待ACK
      奴隶发送ACK
      主人 sendsreg addr (8bit),等待ACK
      奴隶发送ACK
      主机发送数据(8位),即将数据写入注册表,等待ACK
      奴隶发送ACK
      步骤6和7可以重复多次,即按顺序写多个注册表
      主教练开始STOP

      主机将数据写给接收机(传输方向不会改变,如要改变传输方向,必须先发送停止条件)

      传输的具体细节:

      1.主机控制SDA,主机首先生成 START信号;

      2.主机控制SDA,并设置相应的七位地址(A6-A0),并添加一位数据方向性R/W,0表示主机发送数据(写),1表示主机接收数据(读);

      3.从机器控制的SDA发送ACK位(较低的SDA),如果答复是可能的,或发送NACK(较高的SDA);

      4.主机控制的SDA,从机器设置8位注册地址(B7-B0),主机发送地址时,每个公共汽车上的服务器将这些7位地址代码与它们自己的地址进行比较,若相同,以为主人正给你打个电话,根据R/T位置确定自己为传送器和接收器;

      5.从机器控制的SDA中,如果它能够响应,发送ACK位(较低的SDA),否则发送NACK(较高的SDA),在该点,主机等待机器(A)的响应信号;

      6.当主机收到响应信号时,主机控制SDA,发送地址进入主机,并继续等待主机的响应信号;

      7.当主机接收响应信号时,发送N字节的数据,并继续等待主机的N时响应信号;

      8.主机控制SDA,生成停止条件,停止发送。

      IIC应答信号:

      每个字节在发送时需要一个响应信号。

      主人等待每个8位数据被发送的SlaveACK。
      在第9时钟,如果奴隶发送ACK,SDA将降低。
      如果没有ACK,则会增加SDA,这会导致主机进行RESTART或STOP进程。

      每次发送消息后,需要响应信号,主机接收响应信号并向接收者发送停止信号。

      在单字节写字操作中,主机将单字节数据写给客户端一次;在页写字操作中,主机可以写给客户端多字节数据一次(适合大规模数据写字,节省时间)。

      注意,所有I2C设备都支持单字元数据写字操作,但只有一些I2C设备支持页写字操作;对于支持页写字操作的设备,单字元写字操作的数量不能超过设备页内存储单元的数量。

      页写过程如下:

      (一)主机向接收机产生和发送初始信号,向接收机设备写控制命令,读写到低级设置的控制位,指示接收机的数据写操作,并写出控制命令的前高位和后低位;

      (2)从接收器到控制命令,响应信号被发送回,主机接收响应信号并开始存储地址输入。 如果是2字节地址,按顺序执行操作;如果是单字节地址,跳到步骤(5);

      (三)从机器上先写高8位地址,高位是前,低位是后;

      (4)从机器接收的响应信号将写入低位8位地址,高位地址则由低位地址先行,如果它是2位地址,则跳到步骤(6);

      (五)写单字存储地址前后按“高”和“低”顺序;

      (六)地址编写完成时,主机收到机器的响应信号,开始编写第一个单字元数据;

      (7)数据编写完成,主机接收响应信号并开始编写下一个单字节的数据;

      (8)数据输入完成,主机接收响应信号。 如果所有数据编写完成,按顺序执行程序;如果数据编写完成,跳回步骤(7);

      (9)主机将停止信号发送给接收机,并完成页面写字操作。

      (2)数据读操作

      当前地址读取操作过程如下:

      1. 主机向接收机发送控制命令,读写控制位置设置到高压水平,指示接收机的数据读操作;
      2. 主机从机器接收响应信号,并开始从机器接收单字节数据;
      3. 数据接收完成后,主机产生钟的高压水平非响应信号;
      4. 主机将停止信号发送给接收机,单字节读取操作完成。

      随机读操作:

      顶部是单字节地址,底部是两字节地址。

      主机读取机器的数据(传输方向可以更改,即在改变传输方向之前没有发送停止条件)

      标准流程为:
      主机发送I2C addr(7bit)和w(w)操作0(1bit),等待ACK

      奴隶发送ACK
      主人 sendsreg addr (8bit),等待ACK
      奴隶发送ACK
      主机发射 START
      主机发送I2C addr(7bit)和r(read)操作1(1bit),等待ACK
      奴隶发送ACK
      奴隶发送数据(8位),即注册表中的值
      主人发送ACK
      步骤7和8可以重复多次,即读取多个注册表以

      传输的具体细节:

      1.主机控制SDA,主机首先生成 START信号;

      2.主机通过设置指定的七位地址(A6-A0)来控制SDA,并添加一个位元R/W(位于0位),说明该命令已写给主机;

      3.从机器控制的SDA,发送ACK位数(较低的SDA),或发送NACK位数(较高的SDA),如果响应是可能的;

      4.主机控制的SDA, 当主机收到应答信号时,发送要访问的地址(B7-B0),继续等待从机的应答信号;

      5.从机器控制的SDA,发送ACK位数(较低的SDA),或发送NACK位数(较高的SDA),如果答复是可能的;

      6.当主机收到响应信号时,主机将改变通信模式(主机将从发送到接收,从机器将从接收器转换为发送),因此主机将重新发送启动信号,然后立即从机器发送地址,注意,目前地址第8位为1,指示主机设置接收模式以开始读取数据,

      7. 从 机器 控制 的 SDA, 发送 ACK 位数 ( 较低 SDA ), 或 发送NACK ( 高 SDA ), 如果 反应 是 可能 的 ;

      8.由机器控制的SDA发送数据字节,当主机接收响应信号时,可以接收数据字节,当接收完毕时,主机发送非响应信号,指示不接收数据;

      9.主机控制SDA,如果响应可能,则发送ACK位(较低的SDA),或NACK(较高的SDA);如果要发送STOP条件,则最后一个字符串的响应必须设置为NACK(较高的SDA)。

      顺序读操作:

      与随机读操作相比,读取的数据量要多。IIC序列读取操作是记录或存储单元的数据序列读取。如果你想读进n字节的连续数,只要输入存储地址,就可以读取第一字节的数据,可实现连续n-byte数据的序列读取。

      读取操作的顺序如下:

      (一)主机向接收机产生和发送初始信号,向接收机设备写控制命令,读写到低级设置的控制位,指示接收机的数据写操作,并写出控制命令的前高位和后低位;

      (2)从接收器到控制命令,响应信号被发送回,主机接收响应信号并开始存储地址输入。 如果是2字节地址,按顺序执行操作;如果是单字节地址,跳到步骤(5);

      (三)从机器上先写高8位地址,高位是前,低位是后;

      (4)从机器接收的响应信号将写入低位8位地址,高位地址则由低位地址先行,如果它是2位地址,则跳到步骤(6);

      (五)写单字存储地址前后按“高”和“低”顺序;

      (六)在输入和完成地址时,主机从接收机接收响应信号,再向接收机发送起始信号;

      (7) 主机向接收机发送控制命令,读写控制位置设置到高压水平,指示接收机的数据读操作;

      (八)主机从机器接收响应信号,开始从机器接收第一个单字节数据;

      (9)数据接收完成后,主机生成响应信号并将其发送回接收机,从接收机开始对响应信号下一个数据批量。如果数据接收完成,则执行下一个操作步骤;如果数据接收未完成,则执行下一个操作步骤。

      (10)主机为钟产生高压平整响应信号;

      (11)主机将停止信号发送给接收机,读取操作按顺序完成。

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类