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

2023-05-16

1、基础知识

1.1 概念

        IIC通讯协议(Inter-Integrated Circuit,也常被写作I2C)是由 Philips 公司开发的一种简单、双向二线制同步串行总线,只需要两根线即可在连接于总线上的器件之间传送信息。IIC总线是一种共享的串行总线,是用于两个设备之间的短距离低速低数据量的数据通信,一般就用在PCB板卡上的设备之间,当然在芯片内部,做SOC设计时也可以把这种协议用在片上功能模块之间。

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

IIC分类:
        硬件IIC:一块硬件电路,硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,硬件(固件)I2C是直接调用内部寄存器进行配置。
        软件IIC:软件IIC:软件IIC通信指的是用单片机的两个I/O端口模拟出来的IIC,用软件控制管脚状态以模拟I2C通信波形,软件模拟寄存器的工作方式。

1.硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。
2.IIC是半双工通信方式

1.2 物理层 

        IIC只有两根信号线,一根是双向的数据通信线SDA,一根是有效使能和时钟双功能线SCL,所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。IIC总线上允许连接多个主设备和多个从设备,一般情况下,主设备是单片机或者FPGA,其他都是从设备。

特点:

        1)它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个 IIC 通讯总线中,可连接多个 IIC 通讯设备,支持多个通讯主机及多个通讯从机。

        2) 一个 IIC 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。数据线即用来表示数据,时钟线用于数据收发同步,是一种简单、双向、二线制、同步串行总线。

        3)每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。

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

        5)多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。

        6)IIC数据有三种传输速率,分别是标准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps),另外一些变种实现了低速模式(10 kbps)和快速+模式(1 Mbps)。

主机和从机的概念:

        主机就是负责整个系统的任务协调与分配,从机一般是通过接收主机的指令从而完成某些特定的任务,主机和从机之间通过总线连接,进行数据通讯。发布主要命令的称为主机,接受命令的称为从机。

IIC的高阻态:

        漏极开路(Open Drain)即高阻状态,适用于输入/输出,其可独立输入/输出低电平和高阻状态,若需要产生高电平,则需使用外部上拉电阻。

        高阻状态:高阻状态是三态门电路的一种状态。逻辑门的输出除有高、低电平两种状态外,还有第三种状态——高阻状态的门电路。电路分析时高阻态可做开路理解。

        我们知道IIC的所有设备是接在一根总线上的,那么我们进行通信的时候往往只是几个设备进行通信,那么这时候其余的空闲设备可能会受到总线干扰,或者干扰到总线。为了避免总线信号的混乱,IIC的空闲状态只能有外部上拉, 而此时空闲设备被拉到了高阻态,也就是相当于断路, 整个IIC总线只有开启了的设备才会正常进行通信,而不会干扰到其他设备。

IIC物理层总结:

        IIC 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生IIC总线协议所需要的信号进行数据的传递。在总线空闲状态时,SCL和SDA被上拉电阻Rp拉高,使SDA和SCL线都保持高电平。

        IIC通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,485也为半双工,SPI和uart通信为全双工。    

1.3 协议层

        IIC 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。

        1)开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
        2)结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
        3)应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

IIC 总线时序图:

IIC的通信协议流程:

        ①表示“总线空闲状态”,在此状态下时钟信号 SCL 和数据信号 SDA 均保持高电平,此时无 IIC 设备工作。
        ②表示“起始信号”,在 IIC 总线处于“空闲状态”时,SCL 依旧保持高电平时,SDA 出现由高电平转为低电平的下降沿,产生一个起始信号,此时与总线相连的所有 IIC 设备在检测到起始信号后,均跳出空闲状态,等待控制字节的输入。

        ③表示“数据读/写状态”,在串行时钟线SCL为低电平状态时,SDA允许改变传输的数据位(1 为高电平,0为低电平),在SCL为高电平状态时,SDA要求保持稳定,相当于一个时钟周期传输1bit数据,经过8个时钟周期后,传输了8bit数据,即一个字节。第8个时钟周期末,主机释放SDA以使从机应答,在第9个时钟周期,从机将SDA拉低以应答;如果第9个时钟周期,SCL为 高电平时,SDA未被检测到为低电平,视为非应答,表明此次数据传输失败。需要注意数据以8bit即一个字节为单位串行发出,其最先发送的是字节的最高位。


        ④表示“停止信号”,完成数据读写后,时钟 SCL 保持高电平,当数据 SDA 产生一个由低电平转为高电平的上升沿时,产生一个停止信号,IIC 总线跳转回“总线空闲状态”。

 “数据读/写状态”时序如下图:

        在串行时钟线SCL为低电平状态时,SDA允许改变传输的数据位(1 为高电平,0为低电平),在SCL为高电平状态时,SDA要求保持稳定,相当于一个时钟周期传输1bit数据,经过8个时钟周期后,传输了8bit数据,即一个字节。

        第8个时钟周期末,主机释放SDA以使从机应答,在第9个时钟周期,从机将SDA拉低以应答;如果第9个时钟周期,SCL为 高电平时,SDA未被检测到为低电平,视为非应答,表明此次数据传输失败。需要注意数据以8bit即一个字节为单位串行发出,其最先发送的是字节的最高位。 

 1.4 IIC器件地址和存储地址

IIC器件地址:

        每一个IIC器件都有一个器件地址,有的器件地址在出厂时地址就设定好了,用户不可以更改,比如OV7670的地址为0x42。有的器件例如EEPROM,前四个地址已经确定为1010,后三个地址是由硬件链接确定的,所以一IIC总线最多能连8个EEPROM芯片。

        IIC地址:

        我们知道IIC总线是一个支持多设备的总线,所有设备都共享一根数据线SDA。那么当数据线上传输数据时,每个设备如何才能知道这次传输是传给自己的呢?这就需要每个设备都有一个唯一的地址,每个 I2C 设备都具备7位器件地址。

        通常情况下,主机在与从机建立通讯时,主机会将控制命令直接发送到串行数据线 SDA 上,与主机硬件相连的从机设备都会接收到主机发送的控制命令。所有从机设备在接收到 主机发送的控制命令后会与自身器件地址做对比;若两者地址相同,该从机设备会回应一个应答信号告知主机设备,主机设备接收到应答信号后,主从设备建立通讯连接,两者即可开始进行数据通讯。

       除了器件地址位,从机设备还有寄存器地址用于寻址寄存器。在数据传输过程中表明寄存器地址,就可以往特定寄存器写入数据。寄存器地址依据从机寄存器数量分为8位、16位。

"如果主机向从机发送地址,从机怎么知道这个地址就是主机的,这个地址是如何计算"

       严格讲,主机不是向从机发送地址,而是主机往总线上发送地址(这个地址是某个从机的,而不是主机的,所以不存在“从机怎么知道这个地址就是主机的”的问题),所有的从机都能接收到主机发出的地址,然后每个从机都将主机发出的地址与自己的地址比较,如果匹配上了,这个从机就会向主机发出一个响应信号。主机收到响应信号后,开始向总线上发送数据,与这个从机的通讯就建立起来了。如果主机没有收到响应信号,则表示寻址失败。

主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。

1)如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;
2)如果主机要接收从器件的数据,首先由主器件寻址从器件,然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下,主机负责产生定时时钟和终止数据传送。这也就是主器件对于从器件的两种操作,即写操作和读操作。

1.5 IIC读写操作

(1)数据写操作

单字节数据写操作

Start: IIC开始信号,表示开始传输。
DEVICE_ADDRESS:从设备地址,就是7位从机地址
R/W: W(write)为写,R(read)为读
ACK: 应答信号
WORD_ADDRESS:从机中对应的寄存器地址 比方说访问 OLED中的 某个寄存器
DATA: 发送的数据
STOP: 停止信号。结束IIC

标准流程为:

        Master发起START
        Master发送I2C addr(7bit)和w操作0(1bit),等待ACK
        Slave发送ACK
        Master发送reg addr(8bit),等待ACK
        Slave发送ACK
        Master发送data(8bit),即要写入寄存器中的数据,等待ACK
        Slave发送ACK
        第6步和第7步可以重复多次,即顺序写多个寄存器
        Master发起STOP

        主机写数据到从机(传输的方向不会改变,即若要改变传输方向必须先发送stop条件)

传输的具体细节:

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

   2.主机控制SDA,依次设置要寻址的7位从机地址(A6-A0),外加1位数据方向位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应答信号:

每字节发送完毕都需要有一个应答信号。

Master每发送完8bit数据后等待Slave的ACK
即在第9个clock,若Slave发ACK,SDA会被拉低。
若没有ACK,SDA会被置高,这会引起Master发生RESTART或STOP流程。

        每字节发送完毕都需要有一个应答信号,主机接收到应答信号后,向从机发从停止信号。

     单字节写操作中,主机一次向从机中写入单字节数据;页写操作中,主机一次可向从机写入多字节数据(适合大批量数据写入,省时)。       

        需要注意的是,所有 I2C 设备均支持单字节数据写入操作,但只有部分 I2C 设备支持页写操作; 且支持页写操作的设备,一次页写操作写入的字节数不能超过设备单页包含的存储单元数。

页写过程如下:

        (1) 主机产生并发送起始信号到从机,将控制命令写入从机设备,读写控制位设置为低电平,表示对从机进行数据写操作,控制命令的写入高位在前低位在后;

        (2) 从机接收到控制指令后,回传应答信号,主机接收到应答信号后开始存储地址的写 入。若为 2 字节地址,顺序执行操作;若为单字节地址跳转到步骤(5);

        (3) 先向从机写入高 8 位地址,且高位在前低位在后;

        (4) 待接收到从机回传的应答信号,再写入低 8 位地址,且高位在前低位在后,若为 2 字节地址,跳转到步骤(6);

        (5) 按高位在前低位在后的顺序写入单字节存储地址;

        (6) 地址写入完成,主机接收到从机回传的应答信号后,开始第一个单字节数据的写入;

        (7) 数据写入完成,主机接收到应答信号后,开始下一个单字节数据的写入;

        (8) 数据写入完成,主机接收到应答信号。若所有数据均写入完成,顺序执行操作 程;若数据尚未完成写入,跳回到步骤(7);

        (9) 主机向从机发送停止信号,页写操作完成。

(2)数据读操作

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

  1. 主机向从机发送控制命令,读写控制位设置为高电平,表示对从机进行数据读操作;
  2. 主机接收到从机回传的应答信号后,开始接收从机传回的单字节数据;
  3. 数据接收完成后,主机产生一个时钟的高电平无应答信号;
  4. 主机向从机发送停止信号,单字节读操作完成。

随机读操作:

         上图为单字节地址,下图为2字节地址。

        主机读取从机中的数据 (传输的方向可以改变,即若要改变传输方向前无需发送stop条件) 

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

        Slave发送ACK
        Master发送reg addr(8bit),等待ACK
        Slave发送ACK
        Master发起START
        Master发送I2C addr(7bit)和r(读)操作1(1bit),等待ACK
        Slave发送ACK
        Slave发送data(8bit),即寄存器里的值
        Master发送ACK
        第7步和第8步可以重复多次,即顺序读多个寄存器

传输的具体细节:

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

   2.主机控制SDA,依次设置要寻址的7位从机地址(A6-A0),外加1位的R/W(置为0),表明是向从机写命令;

   3.从机控制SDA,如果可以回应就发送ACK位(拉低SDA), 否则发送NACK(拉高SDA);

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

   5.从机控制SDA, 如果可以回应就发送ACK位(拉低SDA), 否则发送NACK(拉高SDA);

   6.当主机收到应答信号后,主机要改变通信模式(主机将由发送变为接收,从机将由接收变为发送)所以主机重新发送一个开始start信号,然后紧跟着发送一个从机地址,注意此时该地址的第8位为1,表明将主机设 置成接收模式开始读取数据,

   7. 从机控制SDA, 如果可以回应就发送ACK位(拉低SDA), 否则发送NACK(拉高SDA);

   8.从机控制SDA,  发送字节数据,当主机收到应答信号时,就可以接收1个字节的数据,当接收完成后,主机发送非应答信号,表示不在接收数据;

   9.主机控制SDA, 如果可以回应就发送ACK位(拉低SDA), 否则发送NACK(拉高SDA);如果要发送STOP条件,必须将最后一个字节的响应设置为NACK(拉高SDA)。

顺序读操作:

        与随机读操作相比,读取的数据量要多。  IIC 顺序读操作就是对寄存器或存储单元数据的顺序读取。假如要读取 n 字节连续数 据,只需写入要读取第一个字节数据的存储地址,就可以实现连续 n 字节数据的顺序读取。

顺序读操作过程如下:

        (1) 主机产生并发送起始信号到从机,将控制命令写入从机设备,读写控制位设置为低电平,表示对从机进行数据写操作,控制命令的写入高位在前低位在后;

        (2) 从机接收到控制指令后,回传应答信号,主机接收到应答信号后开始存储地址的写 入。若为 2 字节地址,顺序执行操作;若为单字节地址跳转到步骤(5);

        (3) 先向从机写入高 8 位地址,且高位在前低位在后;

        (4) 待接收到从机回传的应答信号,再写入低 8 位地址,且高位在前低位在后,若为 2 字节地址,跳转到步骤(6);

        (5) 按高位在前低位在后的顺序写入单字节存储地址;

        (6) 地址写入完成,主机接收到从机回传的应答信号后,主机再次向从机发送一个起始信号;

        (7) 主机向从机发送控制命令,读写控制位设置为高电平,表示对从机进行数据读操作;

        (8) 主机接收到从机回传的应答信号后,开始接收从机传回的第一个单字节数据;

        (9) 数据接收完成后,主机产生应答信号回传给从机,从机接收到应答信号开始下一字节数据的传输,若数据接收完成,执行下一操作步骤;若数据接收未完成,在此执行步骤(9);

        (10) 主机产生一个时钟的高电平无应答信号;

        (11) 主机向从机发送停止信号,顺序读操作完成。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通信协议(三)——IIC协议 的相关文章

  • 基于RS485通信的Modbus通信协议

    通信可以分为两个方面 xff1a 硬件层 xff1a RS485解决的是数据传输问题 xff0c 也就是说如何将一个 0 或 1 传输到另外一端 xff08 保证了数据可以转移到另一端 xff09 软件层 xff1a modbus是在硬件基
  • wifi和服务器之间通信协议,安卓和wifi通信协议

    安卓和wifi通信协议 内容精选 换一换 MindX DL API的调用使用REST Representational State Transfer 风格API xff0c Volcano使用k8s apiserver的url地址 xff0
  • 对IIC总线时序的一点理解以及ACK和NACK(NAK)

    参考自 xff1a http blog chinaunix net uid 16100003 id 3059814 html 关于IIC的响应问题 xff1a 对于每一个接收设备 xff08 从设备 xff0c slaver xff09 x
  • STM32 HAL库 STM32CubeMX -- I2C(IIC)

    文章目录 一 I2C 协议简介I2C 物理层I2C协议层I2C架构通讯过程 二 STM32Cube MX配置三 I2C HAL库函数 一 I2C 协议简介 I2C 通讯协议 Inter xff0d Integrated Circuit 也就
  • 通信协议

    首先我是在嵌入式软件工程师的招聘要求里面看到上面总线协议基本都是必写的 常看到的有 xff1a USB IIC SPI UART CAN SDIO 458 232 这个可以看我的博文 xff1a https blog csdn net si
  • 试想面试官让你讲讲UART IIC SPI你能讲多少。

    试想面试官让你讲讲UART IIC SPI你能讲多少
  • STM32基于IIC协议的OLED模块的使用

    前言 一 项目涉及的内容 项目简介 二 模块实操 1 IIC模块 1 1 IIC协议格式 1 2 开始信号与停止信号 1 3 写数据 1 3 1 硬件IIC代码编写 1 3 2 软件模拟IIC代码编写 2 OLED板块 前言 本篇文章对使用
  • OLED显示屏驱动:8080并口,IIC,SPI三种驱动方式

    本文介绍了对OLED的几种驱动方式 xff0c 8080并口 xff0c IIC xff0c SPI三种驱动方式 xff0c 采用的单片机是STM32F407 文章目录 一 OLED驱动原理介绍二 8080并口驱动方式三 IIC驱动方式四
  • IIC通讯详解笔记

    IIC概述 IIC总线是一种串行半双工两线总线 一根是双向的数据线SDA xff0c 另一根是时钟线SCL 所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上 xff0c 各设备的时钟线SCL接到总线的SCL上 硬件拓扑如下图所示
  • STM32F1 TCA9548A 驱动多个IIC器件

    TCA9548A的用途就是IIC扩展 xff0c 每个TCA9548A可以扩展出8路IIC TCA9548A芯片带有地址选择引脚A0 A1 A2 xff0c 根据高低电平不同 xff0c 从MCU的一路IIC最多可以接入8个TCA9548A
  • 【通信协议】IIC通信协议详解

    IIC的基本介绍 IIC总线的发展 xff1a 芯片间总线 xff08 Inter Interface Circuit xff0c IIC xff09 xff0c 是应用广泛的芯片间串行扩展总线 目前世界上采用的IIC总线一共有两个规范 x
  • 2.Modbus通信协议-软件调试4个工具软件(推荐)

    Modbus通信协议 软件调试的4个工具软件 1 Launch Virtual Serial Port Driver 2 Modbus Poll 3 Modbus Slave 4 UartAssist 软件下载 以下为官网下载链接 xff1
  • STM32——硬件IIC从机通信

    前言 xff1a 根据网上的资料 xff0c 大部分网友表示STM32自带的硬件IIC存在bug xff0c 读写时很容易卡死 自己在调试的时候也出现卡死的情况 xff0c 最后一点一点调试 xff0c 也还是调通了 本文将记录自己调试ST
  • 12.RTT-IIC设备-AHT10温湿度传感器

    本系列博客更新结束啦 xff01 完结啦 xff01 xff01 xff01 撒花 xff01 xff01 xff01 关于RTT的设备和驱动专题更新完毕啦 xff0c 本期是最后一期 一段学习旅途的结束意味着下一段学习冒险的开始 虽然本系
  • 通信 / 网络地址转换(NAT)过程

    一 英文全称 Network Address Translation 二 诞生原因 解决因为可用 IP 过少导致有些设备无法连入网络的问题 该技术的核心思想是多个私有网络 ip 通过一个公共 ip 连入网络 三 过程说明 为了实现上述思想
  • 集线器、交换机和路由器(图解)

    一 物理层 使用 MAC 解决设备的身份证问题 1 通信的原始时代 很久很久之前 你不与任何其他电脑相连接 孤苦伶仃 直到有一天 你希望与另一台电脑 B 建立通信 于是你们各开了一个网口 用一根网线连接了起来 用一根网线连接起来怎么就能 通
  • 【总线】I2C 通信协议

    目录 I2C 总线协议概述 参数总结 I2C 的工作原理 寻址 读 写位 数据帧 I2C数据传输的步骤 具有多个从机的单个主机 具有多个从机的多个主机 I2C的优缺点 优点 缺点 文章参考 I2C 总线协议概述 I2C 总线广泛应用在 OL
  • RS485通信(Modbus)丢包解决经验(基于ARM/Linux和STM32平台)

    1 RS485通信属于半双工通信 即发送和接收不能同时进行 需要切换 一般定义一根GPIO做RTS切换 2 ARM Linux平台有Linux底层驱动做自动切换 比如应用程序发送完成后 一般会在底层驱动自动切换接收 3 但是STM32平台基
  • usart和uart的主要区别

    USART 通用同步和异步收发器UART 通用异步收发器 当进行异步通信时 这两者是没有区别的 区别在于USART比UART多了同步通信功能 这个同步通信功能可以把USART当做SPI来用 比如用USART来驱动SPI设备 同步是指 发送方
  • I2C与SPI通信总线协议

    仅以寄存器地址为8Bit的器件为例 例如MPU6500 LSM6DS3 I2C通信协议 I2C 的要点是了解I2C通信帧的组成部分 START起始位 STOP停止位 ACK NACK信号 从机器件地址 从机寄存器地址 I2C读的时序比较繁琐

随机推荐