IIC (I2C)通信
I2C是一种由Philips开发的通用数据总线,采用SCL(时钟线)和SDA(数据线)进行同步半双工通信,支持多设备挂载和硬件应答。STM32内置硬件I2C模块,支持多主机模式、7/10位地址、不同速率(标准100kHz、快速400kHz)及DMA功能。硬件电路需配置开漏输出模式,并连接上拉电阻(通常4.7kΩ),避免短路并实现电平控制。I2C通信通过起始/终止条件、数据收发(高位先行)和应答机制
一、IIC的特点
I2C(Inter IC Bus)又成为(爱方C I2C)是由Philips公司开发的一种通用数据总线
两根通信线:SCL(Serial Clock)、SDA(Serial Data)
同步,半双工
带数据应答
支持总线挂载多设备(一主多从、多主多从)
二、外设硬件
STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担
支持多主机模型
支持7位/10位地址模式
支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)
支持DMA
兼容SMBus协议
STM32F103C8T6 硬件I2C资源:I2C1、I2C2

上图设备都能够支持IIC通信的设备。在通信过程当中,每个设备都有一个相应的地址,比如说第一个MPU6050,地址一般是1101 000,第三个AT24C02的地址一般是101 0000,不同型号的设备的地址都不一样,相同型号的设备可以在拓展口接入1条线来防止地址冲突。例:MPU6050AD0引脚接高电平就是1101 001.
三、硬件电路
所有I2C设备的SCL连在一起,SDA连在一起
设备的SCL和SDA均要配置成开漏输出模式
SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右

首先看上图左侧,IIC主要有两个线组成,SDA和SCL这两根线。SDA是数据线,SCL是时钟线,他们的都是由主机CPU控制,主机CPU具有对SCL(时钟线)的完全控制,而从机只有短暂的控制SDA(数据线)的能力,只有在从机发送数据的时候才能够控制SDA,而且需要主机主动发送接收邀请,从机接收到邀请并且应答,然后主机接收到应答才转交SDA控制权给从机。
由于为了避免电路短路以及引脚电平频繁转换的原因,规定了设备的SCL和SDA均要配置成开漏输出模式 (开漏输出模式当引脚输出高电平的状态为高阻态,输出低电平的时候才是低电平)。上拉电阻的引入让这两条线一直处于弱上拉的状态,只允许设备下拉。
由于只能够下拉,当某一个设备下拉了某条线,这整条线都处于低电平的状态,除非全部设备对这根线都是高阻态(上拉)这条线才是高电平。这样的特性让IIC能够实现多主机时钟同步和总线总裁。
四、时序
起始与结束

起始条件:SCL处于高电平,在此期间SDA从高电平切换到低电平,随后主机将SCL电平。平拉低从机接收到这个信号就开始复位准备接收数据 。
终止条件:主机将SCL放开,SCL回到高电平,在SCL高电平期间,SDA从低电平切换到高电平
接收发送与应答
发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节

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

无论是主机发送还是主机接收,SDA只有在SCL低电平期间才能够改变,这为了在SCL高电平期间读取到的数据稳定可靠。
发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

主机接收前都会释放SDA,当从机拉低了SDA也就是0的时候代表从机应答了,从机并没有拉低SDA,还是1那就表示未应答。
总结
只需两根线:
SDA(Serial Data Line): 串行数据线,用于传输数据。
SCL(Serial Clock Line): 串行时钟线,由主设备产生,用于同步数据。
主从模式:
主设备(Master): 负责发起和终止传输、产生时钟信号。通常由微处理器(如单片机)担任。
从设备(Slave): 响应主设备的命令。每个从设备都有一个唯一的设备地址(7位或10位),主设备通过该地址来选择与哪个从机通信。一个总线上可以挂载多个从设备(由地址空间和总线电容限制)。
多主从支持: 总线可以支持多个主设备(多主模式),通过仲裁机制防止数据冲突。
一次典型的 I2C 通信流程如下:
起始条件(START):
主设备在 SCL 为高电平时,将 SDA 线从高电平拉低。这个下降沿表示一次传输的开始。
发送从机地址:
主设备发送一个7位或10位的从设备地址,后面紧跟一个读写位(R/W#)。
读写位为 0 表示主设备要向从设备写入(Write) 数据。
读写位为 1 表示主设备要向从设备读取(Read) 数据。
这8位数据(7位地址+1位读写)在 SCL 高电平时必须保持稳定。
应答信号(ACK/NACK):
每传输完一个字节(8位)的数据(包括地址字节),接收方(无论是主还是从)必须在第9个时钟脉冲期间发送一个应答(ACK)信号。
ACK: 接收方将 SDA 线拉低,表示成功收到字节。
NACK: 接收方保持 SDA 线为高,通常表示传输结束或接收失败。
数据传输:
写操作: 主设备继续向 SDA 线上发送数据字节,从设备每个字节后回应 ACK。
读操作: 从设备向 SDA 线上发送数据字节,主设备每个字节后回应 ACK(如果需要继续读)或 NACK(表示读取结束)。
停止条件(STOP):
主设备在 SCL 为高电平时,将 SDA 线从低电平拉高。这个上升沿表示本次传输的结束,总线恢复空闲状态。
更多推荐



所有评论(0)