I2C通信
I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线,实现单片机读写外部模块寄存器的功能。
两根通信线:SCL(Serial Clock)、SDA(Serial Data)
同步,半双工 :同步时序可以极大程度降低对硬件电路的依赖。
带数据应答
支持总线挂载多设备(一主多从、多主多从)
硬件电路
所有I2C设备的SCL连在一起,SDA连在一起
设备的SCL和SDA均要配置成开漏输出模式
SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
空闲状态下,主机可以主动发起对SDA的控制;只有在从机发送数据和从机应答的时候,主机才会转交SDA的控制权给从机。
主机对SCL线完全控制,任何时候从机不允许控制SCL线。
禁止所有设备输出强上拉的高电平,采用外置弱上拉电阻加开漏输出模式。
从机设备地址,在I2C协议标准里分为7位地址和10位地址,目前只讲7位地址。出厂时候,厂商会分配一个地址。
I2C时序基本单元
起始条件:SCL高电平期间,SDA从高电平切换到低电平
终止条件:SCL高电平期间,SDA从低电平切换到高电平
当主机需要进行数据收发时,首先要打破总线的宁静,产生一个起始条件:SCL高电平不去动它,把SDA拽下来,产生一个下降沿。从机捕获到SCL高电平,SDA下降沿,就会进行自身的复位,等待主机召唤。下降沿之后,主机要把SCL也拽下来:一方面是占用这个总线,另一方面也是为了方便我们这些基本单元的拼接。
起始和中止均由主机产生。
发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后主机释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
低电平变换数据,高电平读取数据。
实线部分数主机控制的电平,虚线部分表示从机控制的电平。
发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
I2C时序
指定地址写
对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)
Slave Address:主机地址7位 读写位1位 0读1写
当前地址读
对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)
从机中,所有寄存器被分配到了一个线性区域中,并且会有一个单独的指针变量,指示这其中一个寄存器,上电默认0地址。每写入、读出一个字节后,指针自增1.
指定地址读
对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)
为什么有了USART串口通信还需要I2C通讯?
在STM32微控制器中,USART(通用同步/异步收发器)串口通信和I2C(Inter-Integrated Circuit)通信是两种不同的通信方式,它们各自具有独特的优势和应用场景,因此即使有了USART串口通信,也需要I2C通信。以下是两者之间的主要区别和为什么需要两者共存的原因:
USART串口通信
- 全双工通信:USART是一种全双工通信方式,允许数据在同一时刻双向传输(即同时发送和接收数据)。
- 异步通信:USART是异步通信方式,它不需要时钟信号来同步发送和接收双方的数据传输,而是通过起始位、数据位、校验位和停止位等组成的帧格式来同步。
- 多参数配置:USART支持多种参数配置,如波特率、数据位长度、校验位和停止位等,使得USART能够灵活地适应不同的通信需求。
- 应用广泛:USART串口通信在单片机与单片机、单片机与电脑、单片机与其他模块之间的通信中应用广泛,因为它成本低、容易使用且通信线路简单。
I2C通信
- 同步半双工通信:I2C是一种同步半双工通信方式,它通过一根时钟线(SCL)和一根数据线(SDA)实现通信。在同一时刻,只有一个设备可以发送数据,而另一个设备接收数据。
- 多设备挂载:I2C的一个主要优势是可以通过一个总线挂载多个设备,这些设备共享相同的时钟线和数据线,通过设备地址来区分不同的设备。这使得I2C在需要连接多个外设的场景中非常有用。
- 简单高效:I2C通信协议相对简单,且只需要两根线即可实现多个设备之间的通信,这使得系统的布线和设计更加简单高效。
- 硬件和软件支持:STM32等微控制器通常内置了I2C硬件外设,这使得I2C通信的实现更加简单和高效。同时,也可以通过软件模拟I2C通信协议,以适应不同的应用需求。
为什么需要两者共存
- 应用场景不同:USART和I2C通信各有其独特的应用场景。USART适合需要高速、长距离或大量数据传输的场合,如单片机与电脑之间的通信;而I2C则适合需要连接多个外设、布线简单的场合,如传感器网络、智能家居等。
- 功能互补:USART和I2C通信在功能上具有一定的互补性。USART的全双工和异步通信特性使得它在某些应用场合中更加灵活和高效;而I2C的多设备挂载和简单高效的通信方式则使得它在其他应用场合中更加受欢迎。
- 系统设计需求:在实际的系统设计中,可能需要同时用到USART和I2C通信。例如,一个微控制器可能需要通过USART与电脑进行通信以传输大量数据,同时还需要通过I2C连接多个传感器以收集数据。因此,在STM32等微控制器中同时支持USART和I2C通信是非常必要的。