STM32:I²C通信原理概要

一、IIC通信原理

IIC通信和串口通信有一定的相似之处,都有一根共地线和两根数据线。但是传递外部信息,串口有两根数据线可以进行双向通信,也就是全双工通信。而在IIC通信下,其中一条数据线是用于提供同步时钟脉冲的时钟线(SCL),只有一根数据线(SDA)能够用于传递外部信息。因此,虽然IIC可以进行双向通信,但是不能够同时进行,也就是半双工通信。

IIC采用主从模式,支持多设备通信。即一台被当作主机,剩下的当作从机。由主机率先发起通信,从机才能根据主机的指令回复相应的信息。

像这种支持多个设备进行通信的通信协议我们称之为总线协议。在IIC总线上,每个从机都有其唯一的设备地址。例如AHT20的设备地址是0x70,OLED设备地址是0x7A。当主机需要与AHT20进行通信时,在通信开始时主机就会发送AHT20设备地址。当从机收到主机发来是自己的设备地址后就会向主机发送响应数据(ACK)。如果不是自己的设备地址就把信息抛弃。

在串口中,通信的双方首先约定通信的速度,即比特率。然后双方按照这一速度在合适的时机去设置/读取数据线上的高低电平,这种模式称之为异步模式。这种的优点就是通信便捷,但是缺点就是要保证双方各自的时钟系统是精确的。

但是有很多小型传感器并没有精确的晶振提供时钟基准,因此IIC选择了同步通信方式。由主机通过SCL发送固定频率的时钟脉冲信号来作为IIC总线上的统一时钟源。

二、IIC通信步骤

主机负责提供同步的脉冲信号与从机进行时间同步。具体就是当时钟线处于低电平时,数据发送方有权设置数据线的电平;当时钟线为高电平时,无数据线控制权的设备读取数据线电平。

首先,IIC数据线与时钟线上往往有一个上拉电阻进行上拉。所以在未开始通信时,数据线和时钟线都处于高电平。在通信开始时,数据线的控制权在主机上,从机负责在时钟线在高电平时读取数据。在时钟线依旧是高电平时,将数据线提前下拉。所有从机就读取到一个低电平,意味着开始接收主机指令。而后时钟线提供一个恒定频率的时钟脉冲信号,主从机根据这个时钟信号开始通信操作。例如主机要发送0x71(0111001)数据。

在时钟线低电平时,数据线为高电平,说明主机发送的数据是1,数据线为低电平时,数据发送的就是0;在时钟线高电平时,数据线为高电平,说明从机读取到的数据是1,数据线为低电平时,从机读取到的就是0..

将0x71发送完后,从机AHT20收到主机与自身建立通信的信息,返回一个ACK信号,并获得数据线控制权。在物理上的表现就是,**时钟线处于低电平时,从机将数据线电平拉低。**而后,就与之前的方式相反了。主机负责在时钟线在高电平时读取数据,从机在时钟线低电平时写数据。如此反复直到AHT20返回所有数据。而后在时钟线为高电平时,主机将数据线拉高,表示IIC通信结束。

也就是说当时钟线为高电平时,主机拉低数据线就代表通信开始,时钟线为高电平的期间, 拉高数据线, 就表示本次通讯结束。

相关推荐
fai厅的秃头姐!3 小时前
C语言03
c语言·数据结构·算法
life_time_3 小时前
C语言(22)
c语言·开发语言
sinat_360704825 小时前
STM32 看门狗
stm32·单片机·嵌入式硬件
亿道电子Emdoor5 小时前
【ARM】MDK如何生成指定大小的bin文件,并指定空区域的填充数据
arm开发·stm32·单片机
mftang5 小时前
STM32 CAN过滤器配置和应用方法介绍
stm32·单片机·嵌入式硬件
鱼嘻6 小时前
Linux自学day23-进程和线程
linux·服务器·c语言·进程和线程
楼台的春风6 小时前
【详细讲解在STM32的UART通信中使用DMA机制】
stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式·信息与通信
BUG 劝退师6 小时前
C语言预处理学习笔记
c语言·笔记·学习
Chambor_mak7 小时前
stm32单片机个人学习笔记16(SPI通信协议)
stm32·单片机·学习
小立爱学习7 小时前
Linux 内核自旋锁spinlock(四)--- queued spinlock
linux·c语言