精华内容
下载资源
问答
  • iic通信协议
    2022-07-19 17:26:43

    IIC通信协议

    • Fang XS.
    • 1452512966@qq.com
    • 记录学习,方便复习。
    • 如果有错误,希望被指出,学习技术的路难免会磕磕绊绊

    简介

    • IIC通信是一种半双工,串行,同步通信协议。
    • IIC适用于近距离,低速设备间通信。
    • 硬件只有2跟线:
      • SDA 用于数据传递。
      • SCL 用于时钟同步。
      • 一般2跟数据线都会接上拉电阻,器件内部一般设置为高阻态防止干扰其他器件。
    • 总线上可以挂载多个主机,多个从机,主机有权发起和结束一次通信,从机只能被主机呼叫。
    • 当多个主机同时启用总线,IIC具备冲突检测和总线仲裁的功能。
    • 每个IIC器件都有一个唯一的7位地址。
    • 每个器件都可以作为主机或从机,但是每一时刻只有一个主机。
    • 总线上增加,删除器件不影响其他器件。

    IIC起始与终止信号

    • 空闲信号:
      • SDA为高电平,SCL为高电平。
    • 同步信号:
      • SCL为高电平时采样,接收器读数据,要求数据稳定。
      • SCL为低电平,发送器往总线发送数据,允许电平变化。
    1. 起始信号

      • SCL为高电平时,SDA从高变低。
    2. 终止信号

      • SCL为高电平时,SDA从低变高。

    字节传送与应答信号

    • 主机发送第一字节地址和数据传递方向,指明从机发送还是接收。
      • 当主机指明从机发送时,从机为发送器,主机为接收器。
      • 当主机指明从机接收时,从机为接收器,主机为发送器。
    • IIC通信时,每个字节是8位,数据传送先发高位后发低位,发送器发送一字节,接收器须发送一位应答,来回应发送器。
    • 应答信号是低电平,没接收到数据或不应答保持高电平。
    • IIC数据传送一帧为9位,8位数据,1位应答信号。

    IIC通信过程

    1. 主机发送起始信号启动总线。启动总线后,总线处于占用状态
    2. 主机发送一个字节指明从机地址和数据传送方向。
      • 高七位表示从机地址.
      • 最后一位表示字节传送方向。
        • 主机读 为 1
        • 主机写 为 0
    3. 被寻址的主机应答,回应主机。
    4. 发送器发送一字节数据。
    5. 接收器应答,回应发送器。
    6. 重复步骤4,步骤5…
    7. 通信完毕,主机发送停止信号结束通信。结束通信后,总线处于空闲状态

    IIC寻址方式

    • SDA传送的包括数据和地址。
    • 数据传送方向由主机决定。
    • 总线上所有的从机在接收主机发送的一字节数据后,都会跟自己的地址进行比较,如果跟自己的地址相同则认为是被主机呼叫。再通过第8位数据确定自己是发送器还是接收器。
    更多相关内容
  • IIC通信协议详解

    2021-01-19 21:28:39
     起始信号:在无数据通信时,IIC总线的SCL和SDA都是高电平;当主机要发送数据时,SDA在SCL为高电平时拉低发送起始信号  从机地址:而后,主机在SDA上发出从机的7位地址(高位在前、低位在后)。这里只是以7位地址...
  • iic通信协议

    千次阅读 2022-07-06 18:52:45
    介绍IIC通信

    iic通信协议

    一.iic通信原理

    在这里插入图片描述

    IIC通信协议采用2条信号线,1条时钟线(SCL)和1条数据线(SDA),属于串行半双工通信。标准模式的传输速率为100Kb/s,快速模式为400Kb/s。总线上可以接多个从设备,从设备的地址必须不同。也可也接多个主设备,但同一时刻只能有一个主设备控制总线。最大设备数量受总线的最大负载电容400pf限制。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。
    在这里插入图片描述

    IIC总线上有两种状态,一种是MOS管导通总线被拉低,另外一种是MOS关断总线被上拉电阻拉高,如下图所示

    在这里插入图片描述

    IIC的一些特点:

    • IIC是半双工,而不是全双工
    • IIC是真正的多主机总线,(对比SPI在每次通信前都需要把主机定死,而IIC可以在通讯过程中,改变主机),如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏
    • 起始和终止信号都是由主机发出的,连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号
    • 起始信号后必须发送一个7位从机地址+1位方向位,用“0”表示主机发送数据**,**“1”表示主机接收数据。
    • 每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据
    • 起始信号是必需的,结束信号和应答信号,都可以不要

    :实际使用中,一般是单片机作为主机,其它器件作为从机,单片机先向器件发送信息表示要读取数据,之后转变传输方向,器件发送数据到单片机。

    在这里插入图片描述

    在这里插入图片描述

    • 起始:时钟线SCL为高时,数据线SDA由高到低

    • 停止:时钟线SCL为高时,数据线SDA由低到高

    • 开始标志(S)发出后,主设备会传送一个7 位的地址,并且后面跟着一个第8位,称为Read/Write 位。

    • R/W 位表示主设备是在接受从设备的数据还是在向其写数据。

    • 然后,主设备释放SDA 线,等待从设备的应答信号(ACK)。每个字节的传输都要跟随有一个应答位。

    • 应答产生时,从设备将SDA 线拉低并且在SCL 为高电平时保持低。

    • 数据传输以停止标志(P)结束,然后释放总线。但主设备也可以产生重复的开始信号去操作另一台从设备,而不发出结束标志。

    • 所有的SDA 信号变化都要在SCL 时钟为低电平时进行,除了开始和结束标志

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    下面这张图是通过示波器抓取的IIC波形,可以看到:

    • 时钟线SCL是一种间歇性的方波(需要通信时才产生方波)
    • 数据线SDA根据SCL提供的节拍,高电平代表数据1,低电平代表数据0
    • 没有数据传输时,SDA和SCL均为高电平状态
    • 起始信号后,数据是9个一组,包括8位的数据和另一方的1位回应

    图中红色数字表示单片机发送的8位数据,黄色数字表示IIC器件回应的信号,低电平0表示器件收到了单片机发来的数据。

    总的来说,iic通信协议是一种串行半双工的通信协议,它有两根总线,一根数据线,一根时钟线。

    iic通信

    1. 先由主机发送一个起始信号启用总线(时钟线为高电平,数据线由高到低)。
    2. 然后主机发送一个地址(7位),指明要通信的从机,然后发送一个方向位(1位),用“0”表示主机发送数据**,**“1”表示主机接收数据。从机发送应答信号(1位)。(时钟线为低电平时是主机向总线上写数据,时钟线为高时是从机从总线上读数据,通常情况下iic一次发送9位,起始状态下是7位地址+1位方向+应答,发送数据状态下是8位数据+1位应答,有时从机不应答,就意味着通信结束)。
    3. 通信结束,发送停止信号,释放总线(时钟线为高电平,数据线由低到高)。

    在这里插入图片描述

    展开全文
  • IIC头文件(可以直接使用,不需要C文件)
  • 刚刚花了几天时间把 IIC 总算搞懂了一些,查了很多资料,也纠结过于很多细节,不过只要耐着性子,一点点的去理解,去尝试,终会得到你想要的结果,人生不也是吗,嘿嘿~,不闲扯了,下面就写写我的理解以及方法,算是...
  • IIC 通信协议

    千次阅读 2020-12-21 16:15:09
    一、IIC 通信协议介绍 IC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。 如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个...

    一、IIC 通信协议介绍

    IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。

    如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。IIC数据传输速率有标准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps),另外一些变种实现了低速模式(10 kbps)和快速+模式(1 Mbps)。

    下图是一个嵌入式系统中处理器仅通过2根线的IIC总线控制多个IIC外设的典型应用图

    img

    与UART通信一样,I2C仅使用两根信号线在设备之间传输数据:一根是双向的数据线 SDA ,另一根是时钟线 SCL 。

    SDA(Serial Data,串行数据)–主设备和从设备发送和接收数据的信号线。

    SCL(Serial Clock,串行时钟)–传送时钟信号的信号线。

    其时钟信号是由主控器件产生。所有接到 IIC 总线设备上的串行数据 SDA 都接到总线的 SDA 上,各设备的时钟线 SCL 接到总线的 SCL 上。对于并联在一条总线上的每个 IIC 都有唯一的地址。

    img

    I2C是串行通信协议,因此数据沿着单根信号线(SDA线)一比特一比特地传输。与SPI一样,I2C是同步的,因此比特位输出通过主设备和从设备之间共享的时钟信号同步到比特位采样。时钟信号始终由主设备控制。

    IIC 总线在传输数据的过程中一共有三种类型信号,分别为:开始信号结束信号应答信号。这些信号中,起始信号是必需的,结束信号和应答信号,都可以不需要。同时还有空闲状态、数据的有效性、数据传输。

    空闲状态

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

    应答信号

    发送器每发送一个字节( 8个bit ),就在时钟脉冲 9 期间释放数据线,由接收器反馈一个应答信号。

    • 应答信号为低电平时,规定为有效应答位( ACK ,简称应答位),表示接收器已经成功地接收了该字节;
    • 应答信号为高电平时,规定为非应答位( NACK ),一般表示接收器接收该字节没有成功。

    二、I2C 工作原理

    使用I2C通信协议,数据是以消息的形式传输。消息被分解为数据帧。每条消息都有一个包含从设备的二进制地址的地址帧,以及一个或多个包含正在发送的数据的数据帧。该消息还包括每个数据帧之间的开始和停止条件,读/写位和ACK / NACK位

    image.png

    地址帧:每个从设备唯一的7位或10位序列,用于在主设备要与之通信时标识该从设备。

    读/写位:1比特,指定主机是向从机发送数据(低电压电平)还是从从机请求数据(高电压电平)。

    ACK / NACK位:消息中的每个帧后都有一个确认/否确认位。如果成功接收到地址帧或数据帧,则会从接收设备向发送方返回一个ACK位。

    编址

    I2C没有像SPI那样的从设备选择信号线,因此它需要另一种方式来使从设备知道主设备正在向其发送数据,而不是另一个从设备。它通过寻址来实现。地址帧始终是新消息中起始位之后的第一帧。

    主设备将要与之通信的从设备的地址发送给与其连接的每个从设备。然后,每个从设备将从主设备发送的地址与其自己的地址进行比较。如果地址匹配,它将向主机发送一个低电压ACK位。如果地址不匹配,则从设备不执行任何操作,并且SDA线保持高电平。

    读/写位

    地址帧的末尾包含一个位,该位通知从设备,主设备是否要向其写入数据或从中接收数据。如果主设备要向从设备发送数据,则读/写位为低电压电平。如果主设备正在向从设备请求数据,则该位为高电压电平。

    数据帧

    主设备检测到从设备的ACK位后,就可以发送第一个数据帧了。

    数据帧长度始终为8比特,并以最高有效位优先发送。每个数据帧后紧跟一个ACK / NACK位,以验证是否已成功接收到该帧。在发送下一个数据帧之前,主设备或从设备必须接收ACK位(取决于谁发送数据)。

    发送完所有数据帧后,主设备可以向从设备发送停止条件以停止传输。停止条件是SDA信号线完成电平由低至高的转换后,SCL信号线紧接着完成电平由低到高的转换,而SCL信号线保持高电平。

    三、I2C数据传输步骤

    ​ A.所有联入I2C中的器件均需具有开漏或集电极开路输出

    ​ B.通信标准:开始信号——从机地址发送—— 数据传输——停止信号

    ​ C.每个器件有唯一的识别地址,每个器件都可以发送/接收

    ​ D.SCL拉低时才可改变数据,每个数据字节8位,第9位是应答位,是接收器件在第9个时钟周期拉底SDA所得,完整的数据传输需要9个时钟脉冲。

    ​ E.若从器件未在第9位应答,则SDA保持高,解释为传输失败;若第9位应答,则解释为传输完成。分别产生重复START信号或STOP信号释放总线。

    1.在将SCL信号线从高电平切换到低电平之前,设备通过将SDA信号线从高电平切换到低电平来每个连接的设备发送启动条件

    image.png

    启动(START)条件与停止(STOP)条件的时序图如下:

    起始信号:当时钟线SCL为高期间,数据线SDA由高到低的跳变。

    停止信号:当时钟线SCL为高期间,数据线SDA由低到高的跳变。

    在这里插入图片描述

    2.主设备向每个从设备发送要与之通信的从设备的7位或10位地址,以及读/写位:

    image.png

    3.每个从设备将主设备发来的地址与其自己的地址进行比较。如果地址匹配,则从设备通过将SDA信号线拉低一位来返回ACK位。如果主设备的地址与从设备的地址不匹配,则从设备将SDA线拉高。

    image.png

    4.主设备发送或接收数据帧:

    image.png

    5.传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧:

    image.png

    I2C的优缺点

    与其他协议相比,I2C很可能听起来有些复杂,但是有一些充分的理由让您愿意或拒绝使用I2C连接到特定设备:

    优点

    • 仅使用两根信号线
    • 支持多个主设备和多个从设备
    • ACK / NACK位用于确认每个帧都已成功传输
    • 硬件不如使用UART复杂

    缺点

    • 数据传输速率比SPI慢
    • 数据帧的大小限制为8位
    • 比SPI更复杂的硬件实现

    参考:https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol

    http://blog.eetop.cn/blog-1561828-6945166.html

    https://www.cnblogs.com/liujinggang/p/9656358.html

    展开全文
  • 【通信协议】IIC通信协议详解

    千次阅读 2022-05-16 23:48:01
    IIC的基本介绍 IIC总线的发展: 芯片间总线(Inter Interface Circuit,IIC),是应用广泛的芯片间串行扩展总线。目前世界上采用的IIC总线一共有两个规范,分别由荷兰飞利浦公司和日本索尼公司提出的,现在基本...

    IIC的基本介绍

    IIC总线的发展:

           芯片间总线(Inter Interface Circuit,IIC),是应用广泛的芯片间串行扩展总线。目前世界上采用的IIC总线一共有两个规范,分别由荷兰飞利浦公司和日本索尼公司提出的,现在基本采用荷兰飞利浦的IIC总线的技术规范。

    IIC总线的优点:

            1、IIC总线优点中最主要的优点是其简单性(IIC只有两条信号线)和有效性(根据SCL线上的时钟线来判断)。带有IIC总线的接口的单片机都可直接与具有IIC总线接口的各种扩展器件(如存储器、I/O芯片、A/D、D/A、键盘、显示器、时钟、日历等)连接。由于IIC总线采用纯软件的寻址方法,无须片选线的连接,这样就大大的简化了总线的数量。

            2、IIC总线的另一个优点是允许多主器件任何能够进行发送和接收的设备都可以成为主总线一个主控能够控制信号的传输和时钟频率,在任何时间点上只能有一个主控。在实际应用中,经常遇到的是以单一单片机为主器件,其他外围接口期间为从器件的情况。

    IIC总线的缺点:

            在标准的IIC普通模式下,数据的传输速率为100kbit/s,高速模式下可以达到400kbit/s。

            IIC所接的外围器件的数量并不是无穷多的,总线上的扩展的期间数量是由限制的。总线上的扩展的期间数量并不是由电流负载决定的,而是由电容负载决定的。IIC总线上的每个器件的接口都有一定的等效电容,器件越多(扩展外围器件可以看作是并联在主器件的总线上的),电容值就越大,就会造成信号传输的延迟。

            总线上允许接的器件数量以器件的电容量不能超过400pF(可以通过其他的方法增加总线的电容量),据此可以算出总线的长度扩展外围器件的数量

    IIC的总线系统的基本结构:

            IIC总线总共只有两条信号线,一条是双向的串行数据线SDA,另一条是串行时钟线SCL。SDA和SCL都是双向的,IIC总线上的各器件的数据线都接到SDA线上,IIC总线上的各器件的时钟线都接到SCL线上。

            每个连接到IIC总线上的器件都有一个唯一的地址,扩展期间时要受到器件地址数量的限制。IIC的总线系统的基本结构如图所示。

     

    IIC的总线物理拓扑结构:

            当IIC总线空闲时,SDA和SCL两条线均为高电平。由于连接到总线上的器件输出级必须是漏极开路或者集电极开路的,因此只要有一个器件任意时刻输出低电平,都将总线上的信号变低,即各器件的SDA和SCL都是“线与“的关系。

            由于各器件输出端为漏极开路,则SCL和SDA线必须通过上拉电阻接正电源,以保证SDA和SCL在空闲状态被上拉到高电平。IIC总线的拓扑结构如图所示。

     

    IIC协议介绍

    IIC总线的起始信号与终止信号:

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

            开始信号:在SCL 串行时钟线为高电平期间,SDA 线由高电平向低电平的变化表示起始信号,只有在起始信号以后,其他命令才有效。

            结束信号:在SCL 串行时钟线为高电平期间,SDA 线由低电平向高电平的变化表示终止信号,随着终止信号的出现,所有外部操作就结束。

     

    IIC总线上数据传送的应答信号:

            应答信号:IIC总线进行数据传送时,传送的字节数并没有限制,但是每个字节长必须为8位长。数据传送过程中,先传送最高位(MSB),每一个被传送的字节后面都必须跟随着1位应答位(即一帧共有9位长)。

            1、应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节;

            2、应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

            对于反馈有效应答位ACK的要求是:接收器在第9个时钟脉冲之前的低电平期间将数据线SDA拉低,并且确保在该时钟的高电平期间为稳定的低电平。 如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放数据线SDA,以便主控接收器发送一个停止信号P。

     

    IIC总线上数据有效性:

            IIC总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定;只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。 

            即:SDA线上的数据在SCL时钟“高”期间必须是稳定的,只有当SCL线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。

     

     IIC总线上数据帧格式:

     

    IIC总线上传送的数据信号不仅包括真正的数据信号,并且包括地址信号。

           IIC总线规定,在起始信号后面必须传送一个从器件的地址(7位),第8位是数据传送的方向位(R/`W),用“0”来表示主器件发送(`W),“1”表示主器件接受数据(R)。每次数据传送总是由主器件产生终止信号而结束。但是,如果主器件希望继续占用总线进行新的数据传送,则可以不产生终止信号,而马上再次发出起始信号对另一从器件进行寻址操作。因此,在总线一次数据传送过程中,可以由以下几种组合方式。

           (1)、主器件向从器件发送N个字节的数据。

            数据传送方向在整个传送的方向过程并没有变化,数据传送的格式如图所示。

     

           其中N个字节是由主机写入从器件的N个字节的数据。淡蓝色部分表示数据由主机向从机传送,粉红色部分则表示数据由从机向主机传送。

            上述的从设备地址为7位,紧接其后的读/写标志位决定了主器件的读写方向写用“0” (低电平)来表示,读用“1” (高电平)来表示。

     

            1、主机首先产生START信号;

            2、然后紧跟着发送一个从机地址,这个地址共有7位,紧接着的第8位是数据方向位(R/`W),“0”表示主机发送数据(写),“1”表示主机接收数据(读);

            3、主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,若相同,则认为自己正在被主机寻址,根据R/T位将自己确定为发送器和接收器;

            4、这时候主机等待从机的应答信号(A);

            5、当主机收到应答信号时,发送要访问从机的那个地址, 继续等待从机的应答信号;

            6、当主机收到应答信号时,发送N个字节的数据,继续等待从机的N次应答信号;

            7、主机产生停止信号,结束传送过程。

           (2)、主器件读来自从机的N字节。

            除第一个寻址字节由主机发送,N个字节都是由从器件发送,主器件接收,数据传送的格式如图所示。

     

            在从机产生响应时,主机从发送变成接收,从机从接收变成发送。之后,数据由从机发送,主机接收,每个应答由主机产生,时钟信号仍由主机产生。若主机要终止本次传输,则发送一个非应答信号,紧接着主机产生停止条件。

     

            1、主机首先产生START信号;

            2、然后紧跟着发送一个从机地址,注意此时该地址的第8位为0,表明是向从机写命令;

            3、这时候主机等待从机的应答信号(ACK);

            4、当主机收到应答信号时,发送要访问的地址,继续等待从机的应答信号;

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

            6、这时候主机等待从机的应答信号,当主机收到应答信号时,就可以接收1个字节的数据,当接收完成后,主机发送非应答信号,表示不再接收数据;

            7、主机进而产生停止信号,结束传送过程。

    (3)、主器件的读、写操作。

            在一次数据传送过程中,主器件先发送一个字节的数据,然后再接收一个字节的数据,此时起始信号和从器件地址都要被重新产生一次,但两次读写的方向位刚好相反,数据传送的格式如图所示。

     

            图中的“RS”表示重新产生的起始信号,后面一个从设备地址表示重新产生的从器件地址

            由上可知,无论哪种形式,起始信号、终止信号和从器件地址均由主器件发送,数据字节的传送方向则由主器件发出的寻址字节中的方向位决定,每个字节的传送都必须有应答位(A或者`A)相随。

          

    IIC总线上的寻址字节:

            在上面介绍的数据帧格式中,均有7位从器件地址和紧随其后的1位读/写方向位,即寻址字节。IIC总线的寻址采用软件寻址,主器件在发送完起始信号后,立即发送寻址字节来寻址被控的从器件,寻址字节格式如图所示。

     

           7位从器件地址为“1010”(AT24C02芯片的固定地址)和“A2A1A0”,其中前四位为器件地址,即器件固有的地址编码,器件出厂时就已经给定。“A2A1A0”为引脚地址,由器件引脚“A2A1A0”在电路中接高电平或接地决定,

           数据方向位(R/`W)规定了总线上的单片机(主器件)与从器件的数据传送方向位。R/`W=1,表示主器件接收(读),R/`W=0,表示主器件发送(写)。

    IIC总线上数据传送格式:

            IIC总线上每传送一位数据都与一个时钟脉冲相对应,传送的每一帧数据均为一个字节。但启动IIC总线后传送的字节数并没有限制,只要求每传送一个字节后,对方回应一个应答位即可。

           IIC总线数据传送必须遵循规定的数据传送格式。根据总线协议规范,起始信号表明一次数据传送的开始,其后为寻址字节。在寻址字节后是按指定读写的数据字节与应答位。在数据传送完成后主器件都必须发送终止信号。在起始信号与终止信号之间的传输的数据字节数由主器件(单片机)决定,理论上讲没有字节数量的限制。

           由上述的数据传送格式可知:

           (1)、无论何种数据传送格式,寻址字节都有主器件发出,数据字节的传送方向则由寻址字节中的方向位来决定。

           (2)、寻址字节只表明了从器件的地址和数据传送方向。从器件内部的N个数据地址,由器件设计者在该器件的IIC总线数据操作格式中,指定第一个数据字节作为器件内部的单元地址指针,并且设置地址自动加减功能,以减少从器件地址的寻址操作。

           (3)、每个字节传送必须有应答信号(A或者`A)相随.

           (4)、从器件在接收到起始信号后都必须释放数据总线,使其处于高电平,以便主器件发送从机地址。

        IIC总线底层程序

    IIC总线引脚与函数定义:

            采用PB6PB7来模拟IIC时序, PB6为时钟线(SCL),PB7为数据线(SDA)。

            关于宏定义与函数定义的代码。

    //IO方向设置
     
    #define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
    #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
    
    //IO操作函数	 
    #define IIC_SCL    PBout(6) 			//SCL
    #define IIC_SDA    PBout(7) 			//SDA	 
    #define READ_SDA   PBin(7)  		    //输入SDA 
    
    //IIC所有操作函数
    void IIC_Init(void);                	//初始化IIC的IO口				 
    void IIC_Start(void);					//发送IIC开始信号
    void IIC_Stop(void);	  				//发送IIC停止信号
    void IIC_Send_Byte(u8 txd);			    //IIC发送一个字节
    u8 IIC_Read_Byte(unsigned char ack);	//IIC读取一个字节
    u8 IIC_Wait_Ack(void); 				    //IIC等待ACK信号
    void IIC_Ack(void);					    //IIC发送ACK信号
    void IIC_NAck(void);					//IIC不发送ACK信号
    

            由于IIC是半双工通信方式

            (1)、数据线SDA可能会数据输入,也可能是数据输出,需要定义IIC_SDA来进行输出、READ_SDA来进行输入,与此同时就要对IO口进行模式配置:SDA_IN()SDA_OUT()

            (2)、时钟线SCL一直是输出的,所以不用区分时钟线的输入和输出。

    IIC总线典型信号以及字节收发的模拟子程序:

    (1)总线初始化函数

            初始化函数的功能是将SCL和SDA总线拉高以释放总线。

    子程序代码如下:

    void IIC_Init(void)								        //初始化IIC
    {					     
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );  //使能GPIOB时钟
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;  		//推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); 				//PB6,PB7 输出高
    }
    

    (2)起始信号S函数

            起始信号S,要求一个新的起始信号前总线的空闲时间必须大于4.7us,而对于一个重复的起始信号,要求建立事件也必须大于4.7us,如下图所示,起始信号的时序波形在SCL高电平器件SDA发生负跳变。起始信号S到第一个时钟脉冲负跳变沿的时间间隔应大于4us.

     子程序代码如下:

    void IIC_Start(void)	 //产生IIC起始信号
    {
    	SDA_OUT();           //sda线输出
    	IIC_SDA=1;	  	  
    	IIC_SCL=1;
    	delay_us(4);
     	IIC_SDA=0;		    //START:when CLK is high,DATA change form high to low 
    	delay_us(4);
    	IIC_SCL=0;		    //钳住I2C总线,准备发送或接收数据 
    }
    

    3)终止信号P函数

            终止信号:在SCL高电平期间SDA的一个上升沿产生终止信号。如下图所示。

     

    子程序代码如下: 

    void IIC_Stop(void)		//产生IIC停止信号
    {
    	SDA_OUT();			//sda线输出
    	IIC_SCL=0;
    	IIC_SDA=0;			//STOP:when CLK is high DATA change form low to high
     	delay_us(4);
    	IIC_SCL=1; 
    	IIC_SDA=1;			//发送I2C总线结束信号
    	delay_us(4);							   	
    }
    

    (4)应答位/数据“0”函数

            发送接收应答位与发送数据“0”相同,即在SDA低电平期间SCL发生一个高电平,如下图所示。

    子程序代码如下:

    //产生ACK应答
    void IIC_Ack(void)
    {
    	IIC_SCL=0;
    	SDA_OUT();
    	IIC_SDA=0;
    	delay_us(2);
    	IIC_SCL=1;
    	delay_us(2);
    	IIC_SCL=0;
    }
    

     

            SCL在高电平期间,SDA被从器件被拉为低电平表示应答。

    (5)非应答位/数据“1”函数

            发送非应答位与发送数据“1”相同,即在SDA高电平期间SCL发生一个正脉冲,如下图所示。

    子程序代码如下:

    //不产生ACK应答		    
    void IIC_NAck(void)
    {
    	IIC_SCL=0;
    	SDA_OUT();
    	IIC_SDA=1;
    	delay_us(2);
    	IIC_SCL=1;
    	delay_us(2);
    	IIC_SCL=0;
    }
    

     

    (6)字节收发子程序函数

            除了上述的典型信号的模拟外,在IIC总线的数据传送过程中,经常使用单字节数据的发送和接收。

           1、发送1字节数据子程序。下面是模拟IIC的数据线由SDA发送1字节的数据(可以是地址,也可以是数据),发送完后等待应答,并对状态位ACK进行操作,即应答或非应答都使ACK=0,发送数据正常ACK=1,从器件无应答或损坏,则ACK=0。发送一字节数据参考程序如下。

    子程序代码如下:

    //IIC发送一个字节
    //返回从机有无应答
    //1,有应答
    //0,无应答			  
    void IIC_Send_Byte(u8 txd)
    {                        
        u8 t;   
    	SDA_OUT(); 	    
        IIC_SCL=0;					//拉低时钟开始数据传输
        for(t=0;t<8;t++)
        {              
            IIC_SDA=(txd&0x80)>>7;
            txd<<=1; 	  
    		delay_us(2);   			//对TEA5767这三个延时都是必须的
    		IIC_SCL=1;
    		delay_us(2); 
    		IIC_SCL=0;	
    		delay_us(2);
        }	 
    } 	
    //IIC_SDA=txd&0x80;   
    //获取最高位
    //获取数据的最高位,然后右移7位,假设为 1000 0000 右移7位为 0000 0001 
    // 假设为 0000 0000 右移7位为 0000 0000 
    //如果某位为1,则SDA为1,否则相反
    
    

     

            发送串行1字节时,” IIC_SDA=(txd&0x80)>>7;”中,txd和0x80进行与运算后再右移七位,则把运算出来的结果赋给数据线(IIC_SDA),并发送出去,紧接着txd左移一位,把次高位移到最高位,再进行下一次循环即可。这样进行8次,就能把1字节的数据都发送出去就可以达到发送一个字节的目的。

    1、接收1字节数据子程序。

            下面是模拟从IIC的数据线SDA接收从器件传来的1字节数据的子程序。

    子程序代码如下:

    //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
    u8 IIC_Read_Byte(unsigned char ack)
    {
        unsigned char i,receive=0;
        SDA_IN();						    //SDA设置为输入
        for(i=0;i<8;i++ )
        {
            IIC_SCL=0; 
            delay_us(2);
    	    IIC_SCL=1;
            receive<<=1;
            if(READ_SDA)
                receive++;   
    	    delay_us(1); 
        }					 
        if (!ack)
            IIC_NAck();				    //发送nACK
        else
            IIC_Ack(); 				    //发送ACK   
        return receive;
    }
    

             同理,串行接收1字节的数据时,需将八位的数据一位一位地接收,然后在组合成1字节。“receive<<=1;     if(READ_SDA)       receive++;”这三行代码可以理解为在SCL为高电平时,接收READ_SDA的高低电平状态,如果READ_SDA的电平为高时,receive加1,相当于低位赋1;如果READ_SDA的电平为低时,receive不进行,相当于低位赋0。这样循环八次,receive就相当于存储了一字节的数据,在判断这亿字节数据后面的应答信号是应答位还是非应答位,进行判断,最终把接收到一个字节数据的变量传出去即可。

    利用IIC总线扩展EEPROM AT24C02的IC卡设计:

            通用存储器的IC卡是由通用存储器芯片封装而成,由于其结构与功能简单、成本低、使用方便,所以在各个领域都得到了广泛的应用。目前用于IC卡的通用存储器芯片多为EEPROM,且应用于IIC总线接口,典型器件为ATMEL公司的IIC接口的AT24Cxx系列。该系列具有AT24C01/02/04/08/16等型号,它们的封装形式,引脚功能以及内部结构类似,只是容量不同,分别为128B/256B/512B/1KB/2KB。下面以AT24C02为例,介绍单片机如何通过IIC总线对AT24C02进行读写。

    (1)封装与引脚。

            AT24C02的封装形式由双列直插(DIP)8只引脚和贴片(SOP)8只引脚两种,无论哪种封装,其引脚功能都是一样的。AT24C02的引脚如图所示。

     

    1、A0,A1,A2:硬件地址引脚。

    2、WP:写保护引脚,接高电平只读,接地允许读和写。

    3SCL和SDA:IIC总线。

    4、GND,VCC为电源引脚。

     AT24C02引脚功能如表所示。

     

    (2)存储单元的寻址。

    AT24C02的存储容量为256B,分为32页,每页8B.对片内单元访问操作,需要先对芯片寻址然后在进行片内子地址寻址。

           1、芯片寻址。

    AT24C02芯片地址固定为1010,它是IIC总线器件的特征编码,其地址控制字节的格式为1010 A2 A1 A0 R/非W。A2,A1,A0引脚接高、低电平后得到确定的3为编码,与1010形成7位编码,即为该器件的地址码。由于A2\A1\A0共有八种组合,故系统最多可外接8片AT24C02,R/非W是对芯片的读/写控制位。

           2、片内子地址寻址。

    在确定了AT24C02芯片的7位地址码后,片内的存储空间可用1字节的地址码进行寻址,寻址字节位00H~FFH,即可对片内的256个单元进行读/写操作。

    (3) 初始化AT24CXX。

    子程序代码如下:

    //初始化IIC接口
    void AT24CXX_Init(void)
    {
        IIC_Init();
    }
    
    

     (4) 检查检查AT24CXX是否正常。

    (4) 检查检查AT24CXX是否正常。
    
    子程序代码如下:
    //检查AT24CXX是否正常
    //这里用了24XX的最后一个地址(255)来存储标志字.
    //如果用其他24C系列,这个地址要修改
    //返回1:检测失败
    //返回0:检测成功
    u8 AT24CXX_Check(void)
    {
    	u8 temp;
    	temp=AT24CXX_ReadOneByte(255);		        //避免每次开机都写AT24CXX			   
    	if(temp==0X55)
    return 0;		   
    	else										//排除第一次初始化的情况
    	{
    		AT24CXX_WriteOneByte(255,0X55);
    	    temp=AT24CXX_ReadOneByte(255);	  
    		if(temp==0X55)
    return 0;
    	}
    	return 1;											  
    }
    

     

    (5) 向AT24C02中写数据。

    AT24C02有两种写入方式,即字节写入方式页写入方式

           1、字节写入方式

    单片机(主器件)先发送启动信号和1字节的控制字,从器件发出应答信号后,单片机再发送1字节的存储单元子地址(AT24C02芯片内部单元的地址码),单片机收到AT24C02的应答后,再发送八位数据和一位终止信号。

           2、页写入方式

    单片机先发送启动信号和1字节的控制字,再发送1字节的存储器起始单元地址,上述几个字节都将得到AT24C02的应答后,就可以发送最多一页的数据,并顺序存放在已指定的起始地址开始的相继的单元中,最终以终止信号结束。

           1、MCU先发送一个开始信号(START)启动总线;

            2、接着跟上首字节,发送器件写操作地址(DEVICE ADDRESS)+写数据(0xA0);

            3、等待应答信号(ACK);

            4、发送数据的存储地址。24C02一共有256个字节的存储空间,地址从0x00~0xFF,想把数据存储>在哪个位置,此刻写的就是哪个地址;

            5、发送要存储的数据第一字节、第二字节、…注意在写数据的过程中,E2PROM每个字节都会>回应一个“应答位0”,老告诉我们写E2PROM数据成功,如果没有回应答位,说明写入不成功;

            6、发送结束信号(STOP)停止总线。

    子程序代码如下:

    //在AT24CXX指定地址写入一个数据
    //WriteAddr  :写入数据的目的地址    
    //DataToWrite:要写入的数据
    void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
    {				   	  	    																 
        IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
    	    IIC_Send_Byte(0XA0);	    					 //发送写命令
    	    IIC_Wait_Ack();
    	    IIC_Send_Byte(WriteAddr>>8);					 //发送高地址
         }
        else
        {
    	    IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));	     //发送器件地址0XA0,写数据 
        }	 
        IIC_Wait_Ack();	   
        IIC_Send_Byte(WriteAddr%256);   					 //发送低地址
        IIC_Wait_Ack(); 	 										  		   
        IIC_Send_Byte(DataToWrite);     					 //发送字节				   
        IIC_Wait_Ack();  		    	   
        IIC_Stop();										     //产生一个停止条件 
        delay_ms(10);	 
    }
    
    
    
    //在AT24CXX里面的指定地址开始写入长度为Len的数据
    //该函数用于写入16bit或者32bit的数据.
    //WriteAddr  :开始写入的地址  
    //DataToWrite:数据数组首地址
    //Len        :要写入数据的长度2,4
    void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
    {  	
        u8 t;
        for(t=0;t<Len;t++)
        {
    	    AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
        }												    
    }
        
    
    //在AT24CXX里面的指定地址开始写入指定个数的数据
    //WriteAddr :开始写入的地址 对24c02为0~255
    //pBuffer   :数据数组首地址
    //NumToWrite:要写入数据的个数
    void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
    {
        while(NumToWrite--)
        {
    	    AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
    	    WriteAddr++;
    	    pBuffer++;
        }
    }
    

     

            温馨提示:在写数据的过程中,每成功写入一个字节,E2PROM存储空间的地址就会自动加1,当加到0xFF后,再写一个字节,地址就会溢出又变成0x00

           (6) 向AT24C02中读数据。

           AT24C02的读操作页由两种方式,即指定地址读方式指定地址连续读方式

           1、指定地址读方式

    单片机发送启动信号后,先发送含有芯片地址的写操作控制字,AT24C02应答后,单片机再发送1字节的指定单元的地址,AT24C02应答后再发送1个含有芯片地址的读操作控制字,此时如果AT24C02做出应答,被访问单元的数据就会按照SCL信号同步出现在SDA线上,以供单片机读取。

           2、指定地址连续读方式。

    指定地址连续读方式是单片机收到每个字节数据都要做出应答,只要AT24C02检测到应答信号,其内部的地址寄存器就自动加一指向下一个单元,并顺序将指向单元的数据送到SDA线上。当需要结束读操作时,单片机接收到数据后,在需要应答的时刻发送一个非应答信号,紧接着再发送一个终止信号即可。

            1、MCU先发送一个开始信号(START)启动总线;

            2、接着跟上首字节,发送器件写操作地址(DEVICE ADDRESS)+写数据(0xA0);

    (注意:这里写操作是为了要把所要读的数据的存储地址先写进去,告诉E2PROM要读取哪个地址的数据)

            3、发送要读取内存的地址(WORD ADDRESS),通知E2PROM读取要哪个地址的信息;

            4、重新发送开始信号(START);

            5、发送设备读操作地址(DEVICE ADDRESS)对E2PROM进行读操作 (0xA1);

            6、E2PROM会自动向主机发送数据,主机读取从器件发回的数据,在读一个字节后,MCU会回应一个应答信号(ACK)后,E2PROM会继续传输下一个地址的数据,MCU不断回应应答信号可以不断读取内存的数据;

            7、如果不想读了,告诉E2PROM不想要数据了,就发送一个“非应答位NAK(1)”。发送结束信号(STOP)停止总线。

    子程序代码如下:

    //在AT24CXX指定地址读出一个数据
    //ReadAddr:开始读数的地址  
    //返回值  :读到的数据
    u8 AT24CXX_ReadOneByte(u16 ReadAddr)
    {				  
        u8 temp=0;		  	    												 
        IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
    	    IIC_Send_Byte(0XA0);	   						 //发送写命令
    	    IIC_Wait_Ack();
    	    IIC_Send_Byte(ReadAddr>>8);					 //发送高地址
    	    IIC_Wait_Ack();		 
        }
        else 
            IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));	 //发送器件地址0XA0,写数据 
        IIC_Wait_Ack(); 
        IIC_Send_Byte(ReadAddr%256);   				 //发送低地址
        IIC_Wait_Ack();	    
        IIC_Start();  	 	   
        IIC_Send_Byte(0XA1);           				 //进入接收模式			   
        IIC_Wait_Ack();	 
        temp=IIC_Read_Byte(0);		   
        IIC_Stop();									 //产生一个停止条件	    
        return temp;
    }
    
    
    //在AT24CXX里面的指定地址开始读出长度为Len的数据
    //该函数用于读出16bit或者32bit的数据.
    //ReadAddr   :开始读出的地址 
    //返回值     :数据
    //Len        :要读出数据的长度2,4
    u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)
    {  	
        u8 t;
        u32 temp=0;
        for(t=0;t<Len;t++)
        {
    	    temp<<=8;
    	    temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1); 	 				   
        }
        return temp;												    
    }
    
    //在AT24CXX里面的指定地址开始读出指定个数的数据
    //ReadAddr :开始读出的地址 对24c02为0~255
    //pBuffer  :数据数组首地址
    //NumToRead:要读出数据的个数
    void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
    {
        while(NumToRead)
        {
    	    *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);	
    	    NumToRead--;
        }
    }
    

     

    IIC总线通信方式总结:

            1、进行数据传送时,在SCL为高电平期间,SDA线上电平必须保持稳定,只有SCL为低时,才允许SDA线上电平改变状态。并且每个字节传送时都是高位在前;

            2、对于应答信号,ACK=0时为有效应答位,说明从机已经成功接收到该字节,若为1则说明接受不成功;

            3、如果从机需要延迟下一个数据字节开始传送的时间,可以通过把SCL电平拉低并保持来强制主机进入等待状态;

            4、主机完成一次通信后还想继续占用总线在进行一次通信,而又不释放总线,就要利用重启动信号。它既作为前一次数据传输的结束,又作为后一次传输的开始;

            5、总线冲突时,按“低电平优先”的仲裁原则,把总线判给在数据线上先发送低电平的主器件;

            6、在特殊情况下,若需禁止所有发生在I2C总线上的通信,可采用封锁或关闭总线,具体操作为在总线上的任一器件将SCL锁定在低电平即可;

            7、SDA仲裁和SCL时钟同步处理过程没有先后关系,而是同时进行的。

     

     

    展开全文
  • IIC通信协议,搞懂这篇就够了

    千次阅读 2022-04-22 13:13:18
    I2C(IIC)属于两线式串行总线,由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线,属于...IIC通信协议,搞懂这篇就够了https://mp.weixin.qq.com/s?__biz=MzIwNDQwMjIwNQ==&mid=2247484368&a
  • IIC通信协议详解.docx

    2022-01-18 13:22:25
    IIC通信协议详解.docx
  • 三大通信协议(二):IIC通信协议

    千次阅读 2022-02-08 16:10:53
    I²C(Inter-Integrated Circuit),中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,是由飞利浦公司在1980年代初设计的,方便了主板、嵌入式系统或手机与周边设备组件之间的通讯。由于其简单性,它...
  •  首先,IIC通信与UART,还有SPI统称为串行接口通信,不过它们之间还是有区别的,如UART的负电平逻辑,还有UART通信不需要时钟,只需要特定的波特率即可,SPI与IIC都可以有一个主机,多个从机的情况,不过IIC适用于...
  • SPI与IIC通信协议比对篇

    千次阅读 2020-01-30 15:47:52
    目录 一、SPI 与 IIC 通信协议比对: ...三、IIC通信协议: (1)起始条件、停止条件 (2)数据的有效性 (3)主机写数据到从机 (4)应答信号(ACK)与非应答信号(NACK) (5)字节格式 (6)...
  • SPI与IIC通信协议

    2022-02-11 20:08:45
    根据时钟极性(CPOL)及相位(CPHA)不同,SPI有四种工作模式。 时钟极性(CPOL)定义了时钟空闲状态电平: CPOL=0为时钟空闲时为低电平 ...一、IIC 1.I2C总线简介 I2C(Inter-Integrate...
  • IIC 通信协议详解 IIC(Inter-Integrated Circuit BUS) 集成电路总线。 1,物理层: 设备之间连接方式 IIC的物理特性: 1)IIC通信在控制上是一主多从的模式。 2)IIC由sda/scl两条通信线构成。 scl是串行时钟线...
  • IIC(inter-integrated Circuit集成电路总线)总线支持设备之间的短距离通信,用于处理器和一些外围设备之间的接口,它需要两根信号线来完成信息交换。IIC的一个特殊工艺优势是微控制器只需要两个通用I/O引脚和软件...
  • IIC通信协议分析

    2020-05-08 15:17:32
    很多面试官喜欢问IIC通信协议怎么实现,当时我只有在开发板用过IIC来向存储芯片(WQ25128系列)存数据,觉得在设计中没有很大的作用,为什么相比起串口(USART)更喜欢问IIC,当听我说“之前学过一遍,已经总结在...
  • IIC通信协议学习

    2022-04-21 21:30:08
    IIC协议:可以多对多,速度分类:100K 400K 3.4M 5M,传输速度没有SPI快,所以在利用显示屏显示数据时常用SPI通讯协议来提高刷新率。(TFT用SPI,LCD OLED使用IIC协议就可以满足需求。) IIC使用时需要在SDA SCL上...
  • IIC通信协议介绍

    2013-08-01 21:51:10
    IIC通信协议介绍

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,421
精华内容 2,968
关键字:

iic通信协议