精华内容
下载资源
问答
  • iic通信原理

    万次阅读 多人点赞 2018-10-20 21:16:22
    每个设备都有自己的一个地址,当主机要与多个外围设备中的一个设备通信时,首先要发送要通信的器件地址以确定通信目标。 2.iic空闲信号,起始信号和终止信号 空闲信号:SCL和SDA都为高电平期间。 起始信号:SCL为...

    1.iic总线顾名思义只有2根线:SDA数据线,SCL时钟线。

    主设备与各个从设备都是挂载在这两根线上如图:

    每个设备都有自己的一个地址,当主机要与多个外围设备中的一个设备通信时,首先要发送要通信的器件地址以确定通信目标。

    2.iic空闲信号,起始信号和终止信号

    空闲信号:SCL和SDA都为高电平期间。

    起始信号:SCL为高电平期间,SDA产生一个下降沿。

    终止信号:SCL为高电平期间,SDA产生一个上升沿。

    注:起始信号和终止信号都是通过边沿触发而非电平触发

    如图:

    3.数据发送

    如图:

     

    在给一个起始信号后开始传送一字节的数据(一字节为8位)。

    而每一位的传送就是在SCL的一个周期期间完成(对应时序图中SCL的1就是一个周期),而在一个SCL周期内当SCL为高电平期间SDA数据不能变的保持原数据,而只有在SCL为低电平期间SDA的数据才能变(注:如果SDA的新数据=原数据那么在SCL为0期间SDA波形不变即是数据没变)传送一个字节的数据需要8个周期的SCL。

    如图:

    注意:SDA中间交叉部分代表两种情况即:SDA为1,SDA为0的情况。

    4.应答信号

    如图:

    在一个字节的数据发送完毕后也就是SCL8个周期之后会产生一个等待应答信号就是图中SCL的第9个周期,在等待应答期间SDA和SCL都会被拉高,如果数据接收正确那么接收设备就会产生一个正确应答(ACK):在SCL第9 个周期的低电平期间将SDA拉低在SCL的高电平期间保持。如果数据没有接收正确那么接收设备就会产生一个非正确应答(NACK):在SCL的第9个周期期间SDA一直未高电平。

    注:接收设备的正确应答是硬件拉低SDA非软件,而如果单片机为接收设备那么就要程序控制应答信号。

    5.单片机与外围设备iic通信过程:

    在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。

    每次数据传送总是由主机产生的终止信号来结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。(注:若再次发起起始信号那么第一字节数据为地址数据后面的才是要发送的数据)

    在总线的一次数据传输中,可以有一下几种组合方式:

     (1)、主机向从机发送数据,数据传送方向在整个传递过程中不变:

    (2)、主机在第一个字节后,立即从从机读数据(传输方向不变):

    (3)、在传送过程中,当需要改变传递方向时,起始信号和从机地址都被重复一次产生一次,但两次读/写方向位正好相反

    注:主机做的都是编程控制,从机做的都是自主控制,也可以说是硬件控制,如主机给应答信号是编程控制,但是从机给应答信号是硬件控制,我们只需要检查在SDA为高期间,SCL保持低电平一些时间,即可判定从机给了主机应答信号。

    展开全文
  • IIC通信原理

    2021-02-18 20:46:15
    IIC通信原理 常用的串行总线协议 目前常用的微机与外设之间进行数据传输的串行总线主要有UART、 1-wire、IIC和SPI总线 UART:是以异步方式进行通信(一条数据输入线,一条数据输出线)。 1-wire:即单线总线,又叫单...

    IIC通信原理

    常用的串行总线协议

    目前常用的微机与外设之间进行数据传输的串行总线主要有UART、 1-wire、IIC和SPI总线

    UART:是以异步方式进行通信(一条数据输入线,一条数据输出线)。
    1-wire:即单线总线,又叫单总线(只有一条线)
    IIC:同步串行2线方式进行通信(一条时钟线,一条数据线)。
    SPI:同步串行3线进行通信(一条时钟线,一条数据输入线,一条数据输出线)。

    IIC串行总线的组成及工作原理

    • IIC总线是PHILIPS公司推出的一种串行总线,它只有两根双向信号线,一根是数据线SDA(serial data I/O),另一根是时钟线SCL(serial clock)可发送和接收数据。在 CPU (单片机)与IIC模块之间、IIC模块与IIC模块之间进行双向传送。

    • 如下图所示,IIC总线上可以挂多个器件,而每个器件都有唯一的地址。这样可以表示通信目标。数据的通信的方式采取主从防暑,主机负责联系从机,而从机则被动回应数据。在这里插入图片描述

    • 在多主机系统中,可能同时有几个主机企图启动总线传送数据,为了避免混乱,IIC总线要通过总线仲裁,以决定由哪一台主机控制总线。(在8051单片机应用系统的串行总线扩展中,我们经常遇到的是以80C51单片机为主机,其他接口器件为从机的单主机情况)

    • IIC总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任意器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。在这里插入图片描述

    IIC总线传输协议

    数据位的有效性规定

    SCL为高电平期间,数据线上的数据必须保持稳定,只有SCL信号为低电平期间,SDA状态才允许变化。
    在这里插入图片描述

    IIC的起始和终止信号

    SCL为高电平期间,SDA由高电平向低电平的变化表示为起始信号;SCL为高电平期间,SDA由低电平向高电平的变化表示终止信号。起始信号和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。在这里插入图片描述
    接收器收到一个完整的数据字节后,有可能需要完成一些其他工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态直到接收器件准备好接收下一个字节时,再释放SCL线使之为高电平,从而使数据传送可以继续进行。

    IIC字节的传送与应答

    每一个字节必须保证是八位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有九位)在这里插入图片描述

    应答位的作用

    主机在发送数据时,每次发送一字节数据,都需要读取从机应答位,当从机空闲可以接收该字节数据时,从机会发出应答(一帧数据的第九位为“0”),当从机正忙于其他工作处理来不及接收主机发送的数据时,从机会发出非应答(一帧数据第九位为“1”)主机则应发出终止信号以结束数据的继续传送,主机通过从机发出的应答位来判断从机是否成功接收数据。
    当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是由对从机的“非应答”来实现的。然后,从机释放SDA线,以允许主机产生终止信号。

    数据帧格式

    IIC总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号
    在起始信号后必须传送一个从机的地址(七位),第八位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”白哦是主机接收数据(R)。每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。

    总线数据传送的组合方式

    在总线的一次数据传送过程中,可以有以下几种组合方式:

    主机向从机发送数据,数据传送方向在整个传送过程中不变:


    **注:**阴影部分表示数据由主机向从机传送,无阴影部分表示数据由从机向主机传送.
    A表示应答,非A表示非应答(高电平).S表示起始信号,P表示终止信号.

    主机在一个字节后,立即从从机读取数据

    在这里插入图片描述

    在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好相反.

    在这里插入图片描述

    总线的寻址

    IIC总线协议有明确的规定:采用七位的寻址字节(寻址字节是起始信号后的第一个字节).

    寻址字节的位定义

    在这里插入图片描述
    D7-D1位组成从机的地址,D0位是据据传送方向位,为"0"时表示主机向从机写数据,为"1"时表示主机由从机读数据

    主机发送地址

    主机发送地址时,总线上的每个从机都将这七位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/T位将自己确定为发送器或接收器.

    从机的地址

    从机的地址由固定部分和可编程部分组成.在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目.如一个从机的七位寻址位有四位是固定位,三位是可编程位,这时仅能寻址八个同样的器件,即可有八个同样的器件接入到该IIC总线系统中.

    80C51单片机IIC串行总线器件的接口

    主机可以采用不带IIC总线接口的单片机,如80C51,STC89C52等单片机,利用软件实现IIC总线的数据传送,即软件与硬件结合的信号模拟.

    软件模拟IIC通信时序

    在这里插入图片描述

    IIC起始信号时序

    void I2CStart()
    {
    	SCL = 1;
    	SDA = 1;
    	delay5us();
    	SDA = 0;
    	delay5us();
    }
    

    IIC终止信号程序

    void I2CStop()
    {
    	SCL = 0;
    	SDA = 0;
    	SDA = 1;
    	delay5us();
    	SDA = 1;
    	delay5us();
    }
    

    IIC主机读从机应答

    bit ReadACK()
    {
    	SCL = 1;
    	delay5us();
    	if(SDA)
    	{
    		SCL = 0;
    		return(1);
    	}
    	else
    	{
    		SCL = 0;
    		return(0);
    	}
    }
    

    IIC主机发送应答

    void SendACK(bit i)
    {
    	SCL = 0;
    	if(i)
    		SDA = 1;
    	else
    		SDA = 0;
    	SCL = 1;
    	delay5us();
    	SCL = 0;//拉低时钟总线
    	SDA = 1;//释放数据总线
    }
    
    展开全文
  • IIC 的一些特征: 两条总线:串行数据总线(SDA)和串行时钟总线(SCL)真正的多主机总线连接到相同总线的ic数量只受到总线的最大电容400pF限制。串行8位双向数据在标准模式下可达100K bit/s快速模式400K bit/s,高速模式...

    IIC 的一些特征:

    两条总线:串行数据总线(SDA)和串行时钟总线(SCL)
    真正的多主机总线
    连接到相同总线的ic数量只受到总线的最大电容400pF限制。
    串行8位双向数据在标准模式下可达100K bit/s
    快速模式400K bit/s,高速模式下3.4Mbit/s.数据有效性规定:
    IIC总线在进行数据传输时,SCL在高电平区间,SDA上的电平必须保持稳定
    SDA的数据的高或者低电平状态只有在SCL线的时钟信号是低电平时才能改变。起始和停止条件:
    起始:SCL高电平时,SDA由高电平向低电平切换。
    停止:SCL高电平时,SDA由低电平向高电平切换。模拟时序如下:
    起始与终止:

    ebdae46a0b689b58ed4329fc769441b8.png


    应答与非应答:

    b8b50fb35c82c5ffbdb568ff291f17df.png


    总线上进行一次数据传输的通信格式:

    3060d0bf5c7ecc68bf0b4689dae30ca2.png


    相关模拟时序的驱动函数:包括(start,stop,respons,write_byte,read_byte)
    -----------------------------------------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------------------------------------
    //SCL高电平区间,SDA一个下降沿启动信号
    void Start()
    {
    SDA=1;
    delay();
    SCL=1;
    delay();
    SDA=0;
    delay();
    }
    -----------------------------------------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------------------------------------
    //SCL在高电平区间,SDA一个上升沿停止信号
    void Stop()
    {
    SDA=0;
    delay();
    SCL=1;
    delay();
    SDA=1;
    delay();
    }
    -----------------------------------------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------------------------------------
    //SCL在高电平区间,SDA被从设备拉低表示应答,
    //(SDA==1)&&(i<255)表示如果一段时间未收到从期间
    //的应答则默认从期间已经收到而不再等待应答信号
    void Respons()
    {
    uchari=0;
    SCL=1;
    delay();
    while((SDA==1)&&(i<255))
    i++;
    SCL=0;
    delay();
    }
    -----------------------------------------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------------------------------------
    //CY 为PSW寄存器中的CY位
    //先移位,然互使用SCL控制发出去
    void Write_Byte(uchar date)
    {
    uchari,temp;
    temp=tada;
    for(i=0;i<8;i++)
    {
    temp=temp<<1;
    SCL=0;
    delay();
    SDA=CY;
    delay();
    SCL=1;
    delay();
    }
    SCL=0;
    delay();
    SDA=1;
    delay();
    }
    -----------------------------------------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------------------------------------
    //定义临时变量K,K左移一位后与SDA进行或运算,
    //依次把8个独立地位放入一个字节中来接受完成
    void Read_Byte()
    {
    uchari,k;
    SCL=0;
    delay();
    SDA=1;
    for(i=0;i<8;i++)
    {
    SCL=1;
    delay();
    k=(k<<1)|SDA;
    SCL=0;
    delay();
    }
    delay();
    returnk;
    }
    -----------------------------------------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------------------------------------
    底层驱动完成以后,我们需要对实际的芯片使用通讯协议来进行操作。
    目前大多的情况下一般比较受欢迎的是AT24cxx 系列。
    AT24Cxx系列主要有: 以下系列:

    15f81a7008cb3dac46fc32b095e4e99c.png

    以下仅以AT24C02为例来进行说明:
    AT24C02芯片地址为:1010,其控制字格式如下:

    8ea0fb3a1e5d00a8d7f9ac249bcd1f09.png


    其中A2,A1,A0为可编程选择地址,此处A2,A1,A0均接地,即000,
    因此发送写信号的寻址字节为:10100000,即0XA0,
    因此发送读信号的寻址字节为:10100001,即0XA1,


    下图为写一个字节的数据格式,有图可知道:向AT24C02中写入一个字节的时候,需要:
    先发一个起始信号,再发一个字节的控制字,
    在发送一个字节的控制字地址,都得到应答信号后,
    再发送要存入的数据,最后发一个停止信号!
    So,一个字节的数据已经写入AT24C02中,OK!下面是数据格式,如图:

    5505b2d8860cf9c9ff4a57c7115ccf6a.png


    程序如下:
    -----------------------------------------------------------------------------------------------------------------------
    //任意地址,写入数据
    void Write_Add(uchar address,uchar date)
    {
    Start();
    Write_Byte(0xA0);
    Respons();
    Write_Byte(address);
    Respons();
    Write_Byte(date);
    Respons();
    Stop
    }
    -----------------------------------------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------------------------------------
    下图为读一个字节的数据格式,其读取一个字节的数据和写入时候差不多,此处不再累赘,读一字节数据格式如图:

    32cbd2f098b1da14ac3659fe029eebfb.png

    程序如下:
    -----------------------------------------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------------------------------------
    //任意地址,读出数据
    void Read_Add(uchar address)
    {
    uchardate;
    Start();
    Write_Byte(0XA0);
    Respons();
    Write_Byte(address);
    Respons();
    Start();
    Write_Byte(0XA1);
    Respons();
    date=Read_Byte();
    Stop();
    returnbyte;
    }

    展开全文
  • 玩单片机的朋友都知道IIC通信这个工具,但好多人只是会用,内部的原理不求甚解,或是想要了解其原理,但却对抽象的时序描述一头雾水。本文将从实测的IIC波形入手,带你看到真实的IIC样子,进而去理解IIC的通信原理。...

    26d9f462352db4f7936bd4dfb04fe42e.png

    玩单片机的朋友都知道IIC通信这个工具,但好多人只是会用,内部的原理不求甚解,或是想要了解其原理,但却对抽象的时序描述一头雾水。本文将从实测的IIC波形入手,带你看到真实的IIC样子,进而去理解IIC的通信原理。

    1 IIC基础知识

    首先复习一下IIC基础知识,这部分看不懂的请先带着疑问,然后我们通过分析IIC的真实波形,这些疑问可能就豁然开朗了~

    1.1 IIC是什么

    IIC(Inter Integrated Circuit,集成电路总线)是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU (单片机)与IIC模块之间、IIC模块与IIC模块之间进行双向传送。

    IIC的一些特点:

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

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

    1.2 IIC物理连接

    使用IIC通信的IIC器件有很多,比如陀螺仪加速度计MPU6050,EEPROM存储芯片AT24C02等,通过IIC总线,可以与单片机之间进行数据传输。

    • IIC通信线只有只有两根,数据线SDA的高低电平传输2进制的数据,时钟线SCL通过方波信号提供时钟节拍
    • 多个IIC器件可以并联在IIC总线上,每个器件有特定的地址,分时共享IIC总线
    • 实际使用IIC当然还要连接电源以及共地哦

    14bdf1a7a6f31da0167bab4e9f431f3e.png

    1.3 IIC时序

    网上查找IIC的基础知识,可能会搜到这样的时序图:

    202a10a5dd6f5a891856e03e2f0a2b59.png

    看起来好复杂的样子,这时可能一部分人就放弃思考了。

    1.3.1 IIC起始结束信号

    好吧,换个简单点的图,你也可能会搜到这样的图:

    6feadc3e57ccd49a739816c2110873ea.png

    这张图看起来更简单一些,描述了IIC的起始和停止条件:

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

    注:SDA和SCL同时为高时,为IIC总线的空闲状态

    1.3.2 IIC应答

    再来看下面这张图:

    b380850dec57350f0c1b4a81e626bcd8.png

    这表示IIC的应答机制

    • 下面的波形:SCL,主机产生的时钟脉冲
    • 上面的波形:SDA,主机发送的8位数据
    • 中间的波形:SDA,从机在第9个时钟信号进行拉低回应,表示收到了主机发来的数据,拉高则表示不应答

    注:实际上,上面和中间是同样的SDA线,这里只是分开示意。因为IIC应答是一种相互关系,单片机发数据给IIC器件,IIC器件要进行应答,表示收到了数据,同样,单片机接收IIC器件的数据后,也要给IIC器件一个应答。

    既然发送完都需要对方回应,那什么时候使用不应答呢?就是在读取到本次数据后,如果不需要继续读取,则发送非应答,对方以为你没收到这次数据,则就不会继续发送了。

    1.3.3 IIC完整传输时序

    fc620ce001d82b7b82179477f1f24403.png
    • 开始标志(S)发出后,主设备会传送一个7 位的Slave 地址,并且后面跟着一个第8位,称为Read/Write 位。
    • R/W 位表示主设备是在接受从设备的数据还是在向其写数据。
    • 然后,主设备释放SDA 线,等待从设备的应答信号(ACK)。每个字节的传输都要跟随有一个应答位。
    • 应答产生时,从设备将SDA 线拉低并且在SCL 为高电平时保持低。
    • 数据传输以停止标志(P)结束,然后释放总线。但主设备也可以产生重复的开始信号去操作另一台从设备,而不发出结束标志。
    • 所有的SDA 信号变化都要在SCL 时钟为低电平时进行,除了开始和结束标志

    1.4 常用的数据收发方式(时序)

    上面1.3小节是IIC的基础时序,在实际使用中,一般是对某个IIC器件的某个寄存器进行读写操作,因此,对于寄存器的读写操作,还要遵循下面的组合时序逻辑。

    1.4.1 写一个字节

    用于对IIC器件某个寄存器的配置,如对MPU6050的某些参数进行设置。

    1c84d1f898aa1e2811739ac26bf06c26.png
    • 写寄存器时,主设备除了发出开始标志和地址位,还要加一个R/W 位,0 为写,1 为读
    • 在第9 个时钟周期(高电平时),MPU6050 产生应答信号
    • 主设备开始传送寄存器地址,并接到应答
    • 然后开始传送寄存器数据,仍然要有应答信号
    • 最后主设备发送停止信号。

    1.4.2 连续写多个字节

    对连续地址的写入,这个用的较少。

    b36bd35a05ba186fde26301159d2216b.png

    通信时序与上面的“写一个字节”类似,上面是写一个字节后就停止了,若要连续写,则继续写即可,只要可以收到从机Ack。

    1.4.3 读一个字节

    用于读取IIC器件某个寄存器的数值。

    d93e5b07cf07fbd0757d4cbe2ee9016b.png
    • 首先由主设备产生开始信号,然后发送从设备地址位和一个写数据位,等待应答
    • 然后发送寄存器地址,才能开始读寄存器
    • 收到应答信号后,主设备再发一个开始信号,然后发送从设备地址位和一个读数据位
    • 然后,作为从设备的MPU6050 产生应答信号并开始发送寄存器中的数据
    • 通信以主设备产生的拒绝应答信号(nACK)和结束标志(Stop)结束
    • 拒绝应答信号(nACK)产生定义为SDA 数据在第9 个时钟周期一直为高

    1.4.4 连续读多个字节

    也是用于读取IIC器件某个寄存器的数值,当某些数据一位字节不够表示,或有一组连续的数据需要读时,可以使用该模式。

    22879e7ec69a5b73441ad7065543f194.png

    通信时序与上面的“读一个字节”类似,上面是读一个字节后就nAck叫停,若要连续写,则发送Ack,直到不需要继续读时再回复nAck。

    复习了这么多,之前对IIC懵懵懂懂的是否依然犯迷糊,好了,现在从理论进入实践,看看真实的IIC是什么样子。

    2 初识IIC真实波形

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

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

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

    dcad6f86db558c5df0f7de67d8ca5fe8.png

    现在对IIC波形有没有多了一些直观的认识?下面再进入编程阶段,看看程序是怎么控制这两根线的。

    3 编写IIC通信函数

    IIC通信可以使用单片机自带的硬件IIC,它提供了固定的引脚接口和函数库。也可以自己通过软件编写来实现IIC时序,这时就可以任选引脚,也方便其它硬件平台的移植。

    下面通过软件IIC的编写,从软件角度理解IIC通信逻辑。

    以下函数都是单片机在执行,即主机发出的动作,所以一定要从单片机的角度思考哦~

    另外,不要看到程序就匆匆掠过,为帮助理解,我对代码进行了一定的注解,仔细分析每条代码,想想与IIC的逻辑如何对应起来,IIC逻辑还没懂的,读完本篇,分析过真实的IIC波形后,再来看看代码,会有不一样的体会。

    3.1 起始IIC_Start()

    //==================================
    

    最后一句SCL拉低,然后就准备产生时钟信号,发送数据了。

    3.2 停止IIC_Stop()

    //==================================
    

    停止前也要确保SCL是拉低的状态。

    最后SDA和SCL都为高,即释放IIC总线,IIC总线进入空闲状态。

    3.3 等待应答IIC_wait_Ack()

    //==================================
    

    在一定是时间内检测SDA是否被从机拉低,被拉低则说明从机收到了数据。

    3.4 产生应答IIC_Ack()

    //==================================
    

    单片机在接收器件数据后,进行回应,表示接收到了器件的数据。

    该函数用在连续读取多个字节时,每读完一个字节(8位),产生回应,表示还要进行读,这时器件就可以继续发数据了。

    当单片机不需要继续读,如连续读的最后一个字节,或只读一个字节,单片机发送非应答信号,这时器件以为单片机没有收到数据,接下来就不会再发数据了。

    非应答函数如下,就是拉高SDA:

    3.5 不产生应答IIC_nAck()

    //==================================
    

    3.6 IIC发送一个字节

    //==================================
    

    发送一个字节,就是分8次循环,产生8个时钟信号,并将SDA赋值为0或1。

    3.7 IIC读取一个字节

    //==================================
    

    读取一个字节,也是分8次循环,产生8个时钟信号,并读取SDA的高低电平信号,最后,根据要不要继续读下一个字节,发送第9位的Ack或nACK。

    4.1 真实IIC波形详细分析

    4.1.1 读取从机数据(单字节读)

    这张图展示IIC读某个器件的寄存器的一个字节的真实波形(注:实际是读了2个不同寄存器的值,每个寄存器读了1个字节,所以,可以先只看前半部分哦~),我已对波形进行了详细的注解。

    对照着图,再来温习一下各个信号的特点:

    • 起始信号:时钟线SCL为高时,数据线SDA由高到低
    • 停止信号:时钟线SCL为高时,数据线SDA由低到高
    • 数据信号:连续的8位,每一个SCL脉冲时钟对应的SDA,高电平为数据1,低电平为数据0
    • 应答信号:第9位(数据信号后),由对方产生的回应,0为产生回应,1为不产生回应

    这幅图中,单片机先产生起始信号,然后发送7位器件地址+1位写标志(绿色的0),并等待从机回应(从机拉低SDA表示收到数据),接着发送8位寄存器地址,并等待从机回应。然后,单片机先再次产生起始信号,发送7位器件地址+1位读标志(绿色的1),并等待从机回应。从机收到读的信号后,从机开始发送8位数据,主机接收到数据后,主机发送nAck不应答信号(图中的Ack(1),主机将SDA拉高,从机则认为主机刚才没有收到它发送的数据,从机将不再继续发送),接着主机发送结束信号,读取完成。

    此图后半部分是以相同方式读了另一个寄存器的值。

    9cc18a71d805c6f0ad94885b4ddefe4f.png

    上图中,SCL信号都是由单片机产生,SDA信号由单片机和IIC器件(从机)共同产生,当需要对IIC器件的寄存器写时,单片机产生SDA数据,当需要读取IIC器件的寄存器数据时,改变传输方向,IIC器件产生SDA数据。

    对于主机和从机什么时候控制SDA,还可以参考这个图帮助理解:

    01acc28bc57aebf0242b4ffd7039c7c9.png

    4.1.2 读取从机数据(多字节读)

    上面是单字节读的波形,再来看看多字节的波形,前面的写器件地址写寄存器地址1与单字节读一样,这张图只显示了后面不一样的部分,主要区别在于单片机接收到数据1后,产生低电平的应答,从而可以继续读取数据2。

    (注意,因为传感器这次测得的数据不一样,所以读出的数据也不一样哦~)

    f051f681f82ad2bde10e30549ad01add.png

    注:以上的IIC真实波形,是使用是硬件IIC,自己编写的软件IIC测得的波形,可能在两个信号的前后延时时间上稍有差别,但整体的时序逻辑肯定是一样的。

    4.1.3 配置从机寄存器(单字节写与多字节写)

    对于寄存器的配置,也就是IIC的写寄存器操作,我就不放图了,参考上面的“常用的数据收发方式(时序)”以及上面的IIC读寄存器的真实波形,IIC的写寄存器的真实波形,应该可以脑补出哦,哈哈~

    最后

    通过真实的IIC波形分析,对IIC通信逻辑有没有更加直观的认识呢?

    原创不易,觉得有用请多多关注支持~

    展开全文
  • IIC通信原理到使用 —— MPU6050

    千次阅读 2020-01-16 17:59:48
    关于IIC通信原理的理解,再加上MPU6050的使用,最后将数据在LCD1602打印出来,希望此篇学习记录对大家的学习有帮助。
  • 第七章-- IIC通信协议模拟注释:ICC模拟的优点:因为不管是哪一型号的开发板IIC通信协议是只要用IO口模拟出ICC协议就可以很方便的在不同开发板间移植。数据传输每次传输8位,从高位开始传输每一个时钟脉冲传输一位...
  • 单片机通信协议本期我们想介绍一下单片机的通信协议。什么是通信协议呢?通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。通过通信信道和设备互连起来的多个不同地理位置的数据通信系统,要使其能协同...
  • 它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。I2C 总线只有两根双向信号线。一根是数据线 SDA,另一根是时钟线 SCL。由于其管脚少,硬件实现简单,可扩展性...
  • F28355的IIC通信所困扰,然而,我猜最大的困难就是DSP系列的F28377&F28355的相关资料太少了,甚至放眼全网,相关内容讨论的就很少,这样就很不利于大家的学习,所以我在这里主要记录一下我学习的历程,希望能给...
  • IIC定义IIC总线是由Philips公司开发的一种简单、双向二线制同步串行总线,IIC只需要两根线进行通信,SDA和SCL,SDA叫串行数据线,SCL为串行时钟线。2. IIC基本知识点❝SDA传输高位先传(MSB),每次传输8bit(1个字节)...
  • 现今,在低端数字通信应用领域,我们随处可见IIC(Inter-Integrated Circuit)和 SPI(Serial Peripheral Interface)的身影。原因是这两种通信协议非常适合近距离低速芯片间通信。Philips(for IIC)和Motorola(for SPI)...
  • IIC vs SPI现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是这两种通信协议非常适合近距离低速芯片间通信。Philips(for IIC)和...
  • 资料下载请点我(第3次更新) 赠送大家资料,复制并在后台回复以下关键词即可领取电源文档85套关于今日推文IIC通信协议IIC协议正确, 但是一直读取失败推挽输出和开漏输出推挽输出:输出逻辑0,则N-MOS激活;输出逻辑1,...
  • 工程师,在研发设计电路项目,可能会使用不同标准协议的通信方式;...IIC通信,如EEPROM存储芯片的接口是采用IIC通信;RS485通信,如工业电机控制器的接口是采用RS485通信;CAN通信,如数字PLC的接口是采...
  • 各内存大小的EEPROM的IIC通信原理

    千次阅读 2019-07-29 15:11:42
    知识点一:时序就是一种mcu与硬件之间的通信协议决定的拥有变化占空比的模拟信号(简单的说就是用高低电平变化来表达他们之间的通信方式或者通俗的说就是他们自己的“方言”交流)。时序的读写步骤看下面两个图,看...
  • 其实像这种通信协议的要求是很精确的,一点点不对都可能导致在实际工程中无法读取数据。我就是被一个应答位耽误了好久,还好最后被我发现了。虽然程序不长,但是每一句话都是值得我们认真学习的,下面是我自己结合...
  • IICvs SPI现今,在低端数字通信应用领域,我们随处可见 IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是这两种通信协议非常适合近距离低速芯片间通信。Philips(for IIC)和 ...
  • 一.简介MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块(芯片)。它集成了一个660nm红光LED、880nm...MAX30102采用一个1.8V电源和一个独立的3.3V用于内部LED的电源,标准的I2C兼容的通信接口。市面很...
  • STM32(五)IIC通信原理及IO口软件模拟编程

    万次阅读 多人点赞 2018-03-03 20:06:53
    一、IIC概述 I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。 它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。... IIC是半双工通信方式。 ...
  • 最小系统为单片机工作的最低要求,不含外设控制,原理简单,分析最小系统是嵌入式入门的基础。1 最小系统原理图最小系统主要有电源,时钟,调试,复位,以及控制芯片五大部分组成。2 电源系统由LDO(Low Dropout ...
  • 文章首发于同名微信公众号:DigCore欢迎关注同名微信公众号:DigCore,及时获取最新技术博文。原文链接:https://mp.weixin.qq.com/s/W7QPHS4i6jkvCEYjnuUJlA(说明...《嵌入式硬件通信接口协议-UART(一)协议基础》...
  • 气压传感器选用MS5611芯片,其中集成了温度传感器和气压传感器,采用IIC总线与主控板通信。 01 PID控制 :双闭环PID控制 当四轴飞行器正常飞行时,突遇外力(风等)或磁场干扰,使加速度传感器或磁力传感器采集数据...
  • 一、原理:1、这里只用到了MPU6050的加速度计,没有用到陀螺仪,为什么不用陀螺仪,是...2、通信我们一般使用IIC,程序通过《MPU-6000 & MPU-6050产品说明书(中文版).pdf》里面的IIC时序编写,(大概在第8页,...
  • IIC通信协议原理总结

    2019-07-09 14:50:42
    1.位传输:由于连接到 IIC 总线的器件有不同种类的工艺 (CMOS NMOS 双极性) 逻辑‘ 0 ’(低) 和 ‘1’(高 )的电平不是固定的 它由 VDD 的相关电平决定;每传输一个数据位就产生一个时钟脉冲 2.数据有效性:...
  • IIC总线原理详细解析

    2020-10-31 11:47:36
    IIC总线原理概述 IIC的基本特性 IIC是一种串行,半双工的总线,主要用于“近距离,...IIC通信原理 下图为由“主机”与“从机”连接而成的通信网络: 何为从机?何为主机? 其实主机是动作的发出者,从机是.
  • IIC通信

    2018-12-12 16:58:55
    今天花了好长时间看了硬件IIC的原理以及寄存器配置,同时还比较了模拟IIC。有以下收获: 1.硬件IIC比模拟IIC速度快,但是引脚固定,不如模拟...3.区别一下IIC通信和EEPROM: (1)IIC是一种通信总线,而EEPROM是拥有IIC...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 315
精华内容 126
关键字:

iic通信原理