I2C通信(跟着江协科技学I2C)

通过通信线和I2C协议,实现单片机读取外部模块寄存器的功能

(1)在指定位置读寄存器,获取状态

(2)在指定位置写寄存器,控制输入

1、I2C通信协议简介

       (1) I2C总线,是由Philips公司开发的一种通用数据总线;

       (2) 两根通信线:SCL(clock)、SDA(data)

         (3)   同步半双工模式

      (4) 带数据应答

      (5)支持总线挂载多设备(一主多从、多主多从)

2、硬件电路

          一主多从模型

        单片机作为总线的主机,主机的权力很大,任何时候,都是主机完全掌控SCL线,此外,在空闲状态下,主机可以主动发起对SDA的控制。只有在从机发送数据和从机应答的时候,主机才会转交SDA的控制权给从机;

        挂载在I2C总线上的从机可以是姿态传感器(MPU6050)、OLED、存储器、时钟模块等;相对于主机来说,从机的权利比较小。对于SCL时钟线,从机在任何时刻都只能被动的读取,从机不允许控制SCL线。对于SDA数据线,从机不允许主动发起对SDA的控制,只有在主机发送读取从机的命令后或从机应答的时候,从机才能短暂地获取SDA的控制权(发送数据到SDA线上)。

        硬件接线:

                1、所有I2C设备的SCL连在一起,SDA连在一起;

                2、设备的SCL和SDA都要配置成开漏输出模式

                3、SCL和SDL各添加一个上拉电阻,阻值一般为4.7Ω左右

3、I2C时序基本单元

        起始条件:

                SCL高电平期间,SDA从高电平切换到低电平;

        终止条件:

                SCL高电平期间,SDA从低电平切换到高电平;

        在I2C总线处于空闲状态时,SCL和SDA都处于高电平状态,即没有任何一个设备去碰SCL和SDA,此时,SCL和SDA由外挂的上拉电阻拉高至高电平,总线处于平静的高电平状态;

        当主机需要进行数据收发时,首先就要打破总线的宁静,产生一个起始条件,这个起始条件就是,SCL处于高电平不去动它,然后把SDA拽下来,产生一个下降沿。当从机捕获到这个SCL高电平,SDA下降沿信号时,就会进行自身的复位,等待主机的召唤。在SDA下降沿之后,主机要再把SCL拽下来(一方面是占用SCL总线,另一方面是方便基本单元的拼接)

        SCL先放手,回弹到高电平,SDA再放手,回弹到高电平,产生一个上升沿,该上升沿触发终止条件,同时,终止条件之后,SCL和SDA都是高电平,总线回归到最初的平静状态。

        一个完整的数据帧,总是以起始条件开始,终止条件结束。此外,起始和终止条件,都是由主机产生的,从机不允许产生起始和终止条件。

        所以在一主多从模式下,总线空闲状态下,从机必须始终双手放开,不许主动跳出来,去碰总线。多主机模型(即多主多从模式)下,从机可以这样实现。

发送一个字节(主机发送,从机接收)

        SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节。具体过程如下:

        起始条件之后,第一个字节,也必须是主机发送的。即,最开始,SCL低电平,主机如果想发送0,就拉低SDA到低电平。如果想发送1,就放手,SDA回弹到高电平。在SCL低电平期间,允许改变SDA的电平。当这一位放好之后,主机松手时钟线,SCL回弹到高电平。在高电平期间,是从机读取SDA的时候,所以高电平期间,SDA不允许变化,SCL处于高电平之后,从机需要尽快地读取SDA,一般都是在SCL上升沿这个时刻,从机就已经读取完成了。主机在放手SCL一段时间后,就可以继续拉低SCL,传输下一位了。主机也需要在SCL下降沿之后尽快将数据放到SDA上,但主机有时钟的主导权,只需要在低电平的任意时刻把数据放在SDA上就行了。

        高位先行的发送策略,发送的第一位是一个字节的最高位B7,依次到最低位B0。(串口时序是低位先行)

        由于有时钟线进行同步,若主机一个字节发送一半,突然进中断了,不操作SCL和SDA了,则时序就会在中断的位置不断拉长,SCL和SDA电平都暂停变化,传输也完全暂停。等中断结束后,主机回来继续操作,传输仍然不会出问题,这就是同步时序的好处。

        由于整个时序是主机发送一个字节,所以在这个单元里,SCL和SDL全程都由主机掌握,从机只能被动读取。(实线表示主机操作)

接收一个字节:(从机发送,主机接收)

        SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),SCL高电平期间然后释放SCL,主机将在读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA,放权给从机操作)

        

         主机在接收之前要释放SDA,然后这时从机取得了SDA的控制权,从机需要发送0,就把SDA拉低,从机需要发送1,就放手,SDA回弹高电平。SCL低电平时变换数据,SCL高电平时读取数据。上图中的实线部分表示主机控制的电平,虚线部分表示从机控制的电平,SCL全程由主机控制

        因为SCL时钟是由主机控制的,所以从机的数据变换基本上都是贴着SCL下降沿进行的,主机可以在SCL高电平的任意时刻读取。

发送应答:

        主机在接收完一个字节之后,在下一个时钟发送一位数据,判断主机是否应答,数据0表示应答,数据1表示非应答。

接收应答:

        主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA,因为接收应答需要从机操作SDA)

        在调用发送一个字节时序之后,就要紧跟着调用接收应答的时序,用来判断从机有没有接收到主机刚才发给它的数据。在应答位这里,主机释放SDA的时候,从机就应该立刻把SDA拉下来,然后在SCL高电平期间,主机读取应答位,如果应答位为0,就说明从机确实收到了发送的数据。

        在接收一个字节之后,也要给从机发送一个应答位,发送应答位的目的是告诉从机,是不是还要继续发送,如果从机发送一个数据后,得到了主机的应答,那从机还会继续发送,若从机没有得到主机的应答,这时候从机就会乖乖地释放SDA,交出SDA的控制权,防止干扰主机之后的操作。

        一主多从模型下,主机可以访问总线上的任何一个设备。首先,把每个从设备都确定一个唯一的设备地址,从机设备地址就相当于每个设备的名字。主机在起始条件之后,要先发送一个字节叫一下从机名字,所有从机都会收到第一个字节,和自己的名字进行比较,如果不一样,就认为主机没有叫我;如果一样,就说明主机现在在叫我,就响应之后主机的读写操作。

     在同一条I2C总线里,挂载的每个设备地址必须不一样。从机设备地址,在I2C协议标准里,分为7位地址和10位地址,本文只总结了7位地址的模式。(7位地址比较简单而且应用范围最广)

        在每个I2C设备出厂时,厂商都会给它分配一个7位的地址,可以在芯片手册里找到给分配的设备地址。一般不同型号的芯片地址都是不同的,相同型号的芯片地址都是一样的。在相同的芯片挂载在同一条总线时,这时候用到地址中的可变部分来区分相同型号的不同设备。(一般器件地址的最后几位是可以在电路中改变的,例如MPU6050地址的最后一位,就可以由这个板子上的AD0引脚确定,接高低电平时,对应为1和0;又如AT24C02的最后三位,都可以由这个板子上的A0、A1、A2引脚确定)

        一般I2C的从机设备地址,高位都是厂商确定的,低位可以由引脚来灵活切换。在相同型号的I2C从设备挂载在同一条I2C总线上时,可以通过切换地址的地位,来保证每个设备的地址都不一样。

I2C时序

1、指定地址写

        对于指定设备(slave address-从机地址),在指定地址(reg address-寄存器地址)下,写入指定数据(data)。

高7位表示从机地址位,最低位表示读写位(0表示,之后的时序主机要进行写入操作,1表示,之后的时序主机要进行读出操作)

        上图中,起始条件后,主机调用发送一个字节,来进行从机的寻址和指定读写标志位。如上图所示,表示本次寻址的目标是1101000的设备,读写标志为0,表示主机接下来想要写入数据。然后,接收应答为0,即表示从机接收到主机发送字节。然后主机发送第二个字节,该字节为0x19(该地址会保存在当前地址指针上),即指定设备寄存器地址为0x19,然后再发送一个字节的数据内容到该地址上。

从机设备可以自己定义第二个字节和后续字节的用途。(在0x19的位置,写入0xAA)

2、当前地址读

        对于指定设备(slave address-从机地址),在当前地址指示的地址下,读取从机数据(data)。

         最开始,SCL高电平期间,拉低SDA,产生起始条件。起始条件开始后,主机必须首先调用发送一个字节,来进行从机的寻址和指定读写标志位。如上图所示,表示本次寻址的目标是1101000的设备,读写标志为1,表示主机接下来想要读取数据。紧跟着发送一个字节之后,接收一下从机应答位。从机应答0,代表从机收到了第一个字节。从机应答之后,数据传输方向反过来了,因为刚才主机发出了读的指令,所以这之后,主机就不能继续发送了,要把SDA的控制权交给从机,主机调用接收一个字节的时序,进行接收操作,然后从机在SCL期间写入SDA,主机在SCL高电平期间读取SDA,依次读取8位。

        在读的时序中,主机进行寻址时,一旦读写标志位给1了,下一个字节立马转为读的时序,所以主机还来不及指定,我要读哪个寄存器,就得开始接收了,所以这里没有指定地址这个环节。

        那主机并没有指定寄存器的地址,从机到底该发哪个寄存器的数据呢,这就需要用到当前地址指针了。

        在从机中,所有的寄存器都被分配到了一个线性区域中,并且会有一个单独的指针变量,指向其中一个寄存器,这个指针上电默认,一般指向0地址。并且每写入一个字节和读出一个字节后,这个指针就会自动自增一次,移动到下一个位置。

        在调用当前地址读的时序时,主机没有指定要读哪个地址,从机就会返回当前指针指向的寄存器的值。

3、指定地址读

        对于指定设备(slave address-从机地址),在指定地址(reg address-寄存器地址)下,读取指定数据(data)。

        将指定地址写和当前地址读结合起来,实现指定地址读的操作。

         因为我们刚指定了地址,所以再调用当前地址读,两者加在一起,就是指定地址读了。

        首先,最开始,仍然是启动条件,然后发送一个字节进行寻址,这里指定从机地址是1101000,读写标志位是0,代表我们要进行写的操作。经过从机应答之后,再发送一个字节,第二个字节用来指定地址,这个数据就写入到了从机的地址指针里了。也就是说,从机接收到这个数据之后,它的寄存器指针就指向了0x19这个位置。之后,我们要写入的数据,不给它发,而是直接来个起始条件(Sr-重复起始条件,相当于另起一个时序)。

        因为指定读写标志位只能是跟着起始条件的第一个字节,所以如果想切换读写方向,只能再来个起始条件。然后起始条件后,重新寻址并且指定读写标志位,此时,读写标志位是1,代表我要开始读了。接着主机接收一个字节,这个字节就是0x19地址下的数据。(写入的地址会存在地址指针里面,所以这个地址不会因为时序的停止而消失)

        也可以在指定地址写后面加一个停止条件,形成两个完整的时序。即先起始,写入地址,停止,再起始,读当前位置,停止。

        但I2C协议官方规定的复合格式是一整个数据帧,就是先起始,再重复起始,再停止,相当于把两条时序拼接成1条了。其中指定地址写和指定地址读用的比较多。

指定地址读写多个字节的时序

        (写入和读取一个数据后,地址指针会自动加1)

        重复n次写入数据和接收应答,就实现在指定地址开始,连续写入多个字节的操作。

        重复n次读取数据和发送应答,就实现在指定地址或当前地址读取多个字节的操作。

注意:若只想读一个字节就停止的话,在读完一个字节之后,一定要给从机发个非应答,就是该主机应答的时候,主机不把SDA拉低,从机读到SDA为1,就代表主机没有应答,从机收到非应答之后,就知道主机不想继续了,从机就会释放总线,把SDA控制权交给主机。如果主机读完仍然给从机应答了,从机就会认为主机还想要数据,就会继续发送下一个数据。

而这时,主机如果想产生停止条件,SDA可能就会因为被从机拽住了,而不能正常弹回高电平。如果主机想连续读取多字节,就需要在读取的最后一个字节给非应答,而之前的所有字节都要给应答。

从机控制SDA发送一个字节的权利,开始于读写标志位为1,结束于主机给应答位1。

(本博客只用于个人的学习记录)

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C文件传输协议是一种用于在计算机网络中进行文件传输的通信协议。它定义了文件的传输方式、数据格式和通信流程来保证文件可以有效地在网络中传输和接收。 C文件传输协议采用了客户端-服务器模型,在网络中进行文件传输时,需要一个服务端和一个或多个客户端。服务端负责存储文件和提供服务,而客户端则负责请求文件和接收文件。 C文件传输协议的通信流程如下:首先,客户端发送连接请求给服务端;服务端确认连接请求,并建立连接;然后,客户端发送文件请求给服务端,包括文件名、起始位置和文件大小等信息;服务端接收文件请求,并根据请求将文件分成若干个数据包进行传输;客户端接收数据包,并根据数据包的顺序和内容进行重组;最后,客户端通知服务端文件传输完成,连接断开。 C文件传输协议的数据格式包括了文件名、文件大小、数据包序号和实际数据等信息。这些信息可以通过头部来标识和传输,以确保数据的准确传输和正确重组。 C文件传输协议主要通过TCP传输数据,因为TCP具有可靠性、有序性和流控制等特点,可以保证文件的完整传输。同时,C文件传输协议还可以配合文件压缩和加密等技术,提高传输效率和安全性。 总之,C文件传输协议是一种用于计算机网络中文件传输的通信协议,通过定义数据格式和通信流程,保证文件能够有效地在网络中传输和接收。它是现代计算机网络中重要的传输协议之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值