IIC通信协议详解(一篇文章搞懂I2C原理、时序与读写流程) 一、前言在嵌入式开发过程中单片机经常需要和各种外部设备进行数据交互。例如STM32读取MPU6050传感器数据STM32驱动OLED显示屏EEPROM保存设备参数温湿度传感器采集环境数据这些设备之间想要通信就需要一种“交流语言”这就是通信协议。常见的嵌入式通信协议有UARTSPIIICI2CCANRS485其中IIC是一种非常经典的板级通信协议在传感器、显示屏、存储芯片中应用非常广泛。很多刚学习嵌入式的小伙伴第一次接触IIC时会遇到几个问题SCL是什么SDA是什么为什么IIC只有两根线为什么需要上拉电阻ACK到底有什么作用IIC读写流程是什么本文将从硬件结构、通信时序以及实际读写流程三个方面带大家完整理解IIC。二、什么是IICIIC全称Inter-Integrated Circuit中文叫集成电路间通信总线。IIC最早由飞利浦公司提出现在已经成为嵌入式开发中非常常见的一种通信方式。IIC最大的特点使用两根线完成通信分别是名称英文作用SCLSerial Clock时钟线SDASerial Data数据线1. SCL时钟线SCL负责产生时钟信号。IIC属于同步通信。所谓同步就是通信双方按照统一的时间节奏进行数据传输。这个节奏由SCL提供。可以理解为SCL就是通信中的“节拍器”。2. SDA数据线SDA负责数据传输。例如设备地址寄存器地址实际数据全部通过SDA进行传输。三、IIC通信结构IIC采用一主多从结构也就是说一个主机可以连接多个从设备。例如STM32作为主机主机STM32从设备OLEDMPU6050EEPROM所有设备共享同一组SCL线SDA线那么问题来了多个设备连接在一起STM32如何知道当前要和哪个设备通信答案设备地址每一个IIC设备都有自己的地址。例如OLED0x3CMPU60500x68EEPROM0x50通信时STM32首先发送目标设备地址。只有地址匹配的设备才会响应。四、IIC硬件组成一个完整的IIC通信需要三个重要部分。1. SCL时钟线SCL由主机产生。例如STM32作为主机时STM32输出时钟信号。作用控制数据传输节奏。2. SDA数据线SDA是一根双向数据线。发送数据MCU → 外设读取数据外设 → MCU所以SDA既可以发送也可以接收。3. 上拉电阻这是IIC中非常重要的一个知识点。为什么IIC需要上拉电阻因为IIC使用开漏输出结构。设备只能主动拉低电平。但是无法主动输出高电平。因此需要外部上拉电阻将信号拉到高电平。常见上拉电阻4.7KΩ作用保证总线空闲状态保持高电平。如果没有上拉电阻可能出现通信失败波形异常设备无法识别五、IIC通信时序一次完整的IIC通信过程如下START↓发送设备地址↓ACK应答↓数据传输↓ACK应答↓STOP下面详细分析每一步。六、START起始信号通信开始之前主机需要发送START信号。START产生条件当SCL保持高电平时SDA由高电平变为低电平。也就是SDA1 → 0表示开始一次IIC通信。七、发送设备地址START之后主机发送设备地址。IIC通常采用7位地址 1位读写位格式设备地址 R/W其中W0表示写操作。例如STM32配置MPU6050寄存器。R1表示读操作。例如读取传感器数据。八、ACK应答IIC通信中每发送8bit数据后需要等待设备回应。这个回应就是ACK。例如发送8位数据第9个时钟设备返回ACK。如果设备正常收到SDA拉低。表示ACK成功。如果没有响应就是NACK。常见原因地址错误设备未上电接线错误没有上拉九、数据传输地址确认之后开始传输真正的数据。例如STM32向MPU6050写数据通信流程START↓MPU6050地址 W↓ACK↓寄存器地址↓ACK↓数据↓ACK↓STOP十、STOP结束信号通信完成后主机发送STOP。STOP条件SCL保持高电平SDA由低变高。表示本次通信结束。十一、IIC写数据流程写数据是最常见的操作。例如初始化传感器。流程START↓设备地址 W↓ACK↓寄存器地址↓ACK↓写入数据↓ACK↓STOP实际开发中很多传感器初始化代码本质上就是不断向寄存器写入配置。十二、IIC读数据流程读取数据相比写操作复杂一些。例如读取MPU6050的数据。通常需要两步。第一步告诉设备读取哪个寄存器。流程START↓设备地址 W↓寄存器地址第二步重新开始读取。流程ReSTART↓设备地址 R↓读取数据↓NACK↓STOP完整流程START↓地址W↓寄存器地址↓ReSTART↓地址R↓数据↓NACK↓STOP十三、IIC和SPI区别项目IICSPI通信线2根4根以上速度较慢较快通信方式半双工全双工设备选择设备地址CS片选优势节省IO高速通信简单理解IIC省线适合传感器。SPI速度快适合高速设备。十四、IIC常见问题1. 为什么扫描不到设备常见原因① 地址错误② SDA/SCL接反③ 没有共地④ 没有上拉电阻⑤ 设备没有供电2. 为什么一直没有ACK检查设备地址是否正确硬件连接是否正确电源是否正常通信频率是否过高十五、总结IIC核心知识可以总结为1. 两根线SCL负责时钟SDA负责数据2. 一个主机多个从机设备通过地址区分。3. 通信流程START↓地址↓ACK↓数据↓ACK↓STOP4. 读写区别写地址W↓寄存器↓数据读地址W↓寄存器↓ReSTART↓地址R↓数据IIC看似复杂其实核心就是通过SCL提供时钟通过SDA传输数据再利用设备地址找到目标设备。掌握IIC之后后续学习STM32驱动OLED、MPU6050、EEPROM等外设都会轻松很多。