软件:STM32-F1系列-I2C协议(2026/7/8)
目录一I2C协议介绍1. I2C是什么2. I2C和UART最大的区别3. I2C只有两根线SDASCL4. I2C为什么需要时钟5. I2C通信角色①主机 Master②从机 Slave6. 为什么多个设备不会冲突7. I2C为什么采用开漏输出和外接上拉电阻二I2C协议层的完整时序介绍1.空闲状态 SDA/SCL是什么电平2.START和STOP怎么产生START起始信号STOP停止信号3I2C中的逻辑0和逻辑14I2C中一个完整数据帧1起始位 (S)2设备地址 (7位)3读/写位 (R/W)4应答信号 (ACK)5寄存器地址 (8位)6要写入的数据 (8位)7停止位 (P)5读数据帧和写数据帧总结写数据帧读数据帧一I2C协议介绍高位先行1. I2C是什么是一种由 Philips飞利浦后来半导体部门成为 NXP Semiconductors提出的同步串行通信协议。主要用于MCU ↔ 传感器MCU ↔ EEPROMMCU ↔ RTC时钟芯片MCU ↔ OLED屏幕MCU ↔ 电源管理芯片典型设备温湿度传感器加速度计陀螺仪外部存储器实时时钟2. I2C和UART最大的区别UART特点点对点两根线没有时钟线异步通信MCU 芯片TX ---------- RXRX ---------- TX如果有多个设备UART很麻烦因为每个设备需要独立TX/RX。而I2C设计思想一根总线上挂很多设备通过地址区分设备。3. I2C只有两根线SDASerial Data串行数据线负责数据发送和数据接收SCLSerial Clock串行时钟线负责提供时钟4. I2C为什么需要时钟因为I2C是同步通信 而串口USART是异步通信以什么波特率发送以对应波特率接收即可I2C有一根专门时钟线SCL: __|‾|__|‾|__|‾|__SDA: 1 0 1 1 0 0 15. I2C通信角色①主机 Master一般是MCU负责产生时钟发起通信控制过程例如STM32②从机 Slave一般是传感器例如MPU6050它等待主机命令。6. 为什么多个设备不会冲突核心每个I2C设备有自己的地址主机发送从机寻址只有对应上地址时对应的从机应答其余不应答。7. I2C为什么采用开漏输出和外接上拉电阻核心原因要实现线与 防短路因为I2C 总线允许多个器件挂在 SDA/SCL 上任意两个都可能同时想驱动同一根线推挽的输出级是 PMOS NMOS一个拉高PMOS 导通到 VCC一个拉低NMOS 导通到 GND。如果两个器件一个想发 1 一个想发 0——一个 PMOS 上拉、一个 NMOS 下拉VCC 直接对 GND 短路IO 烧掉。开漏的输出级只有 NMOS输出 0 → NMOS 导通引脚直接对地短路 → 线被拉到 GND低输出 1 → NMOS 关断引脚内部啥也没接相当于浮空那这根浮空的线凭什么变高靠的是 SDA/SCL 外部或 MCU 内部可配置那颗 上拉电阻 接到 VCCNMOS 关断后上拉电阻把线慢慢拽回 VCC你就读到 1 了只要有任何一个器件 NMOS 导通拉低整条线就是 0因为弱上拉比不过强下拉直接到地GND的。二I2C协议层的完整时序介绍1.空闲状态 SDA/SCL是什么电平I2C采用开漏输出 上拉电阻因此当总线上没有通信时 SCL 1 SDA 1也就是 SCL ─────────────SDA ───────────── 均为弱上拉逻辑电平12.START和STOP怎么产生START起始信号START是通信开始标志正常空闲SCL1SDA1产生START要求SCL保持高电平SDA从1下降到0产生一个下降沿空闲 START:SCL ───────── 高电平 SCL ─────────SDA ───────── 高电平 SDA ─────\_____ 1→0STOP停止信号产生条件 SCL保持高电平SDA从0上升到1产生一个上升沿空闲 STOP :SCL ───────── 高电平 SCL ─────────SDA ───────── 低电平 SDA _____/──── 0→1通信结束总线释放。3I2C中的逻辑0和逻辑1本质在时钟线处于高电平期间数据线处于高电平则代表逻辑1处于低电平则代表逻辑04I2C中一个完整数据帧1起始位 (S)协议的开头标志着一次传输的开始。2设备地址 (7位)图中绿色部分1010000即 0x50。7位和读写位1位一起发送给从机刚好一个字节3读/写位 (R/W)紧跟在地址后的黄色位。0代表写操作Write。1代表读操作Read。4应答信号 (ACK)紧随每个字节8位之后的灰色位。由接收方拉低 SDA 来产生表示“我已成功收到上一字节”。5寄存器地址 (8位)主机告知从机接下来要操作其内部哪个寄存器。图中全为0。6要写入的数据 (8位)图中00001111即 0x0F。7停止位 (P)协议的结尾标志着本次传输的结束。5读数据帧和写数据帧I2C本身只负责“字节传输”并不知道你想读哪个数据。很多芯片内部有大量寄存器所以读取前必须先告诉从机我要读哪个寄存器。所以读操作经常会包含一个“写寄存器地址”的阶段。仔细看读数据帧的图在中间有一个红色的S起始位。这在 I2C 协议中被称为“重复起始Repeated Start”或“组合指令”。假设你有一个传感器你想读取它的温度。我们第一步是先写入它的地址和指令读给它这一步的操作是“写操作”然后马上让它把温度发给你这是读操作。如果不加中间的S主机发送完第一个字节写命令后必须发一个 STOP (P) 结束通信然后再重新发 START (S) 开启下一次通信来读取。总结写数据帧直来直去。告诉从机地址 - 告诉它写 - 把数据塞给它。完事。读数据帧先探路再拿货。告诉从机地址 - 告诉它我要看哪页书写地址 -重新喊话 - 告诉它我要背给你听读 - 它背诵数据给你6如何根据时序进行读数据和写数据I2C 协议规定SCL 高电平期间SDA 必须保持稳定SCL 低电平期间SDA 才允许变化。写数据阶段一换人SCL 低电平期间当 SCL 处于低电平时即 SCL 下降沿之后此时主机可以随意改变 SDA 的高低电平主机需要在 SCL 下降沿之后尽快把数据放在 SDA 上”说的就是这个准备动作。阶段二验票SCL 高电平期间当 SCL 从低变高产生上升沿时“门”关上了SDA 线上的电平被锁死。此时数据必须保持稳定不能变动。从机就在 SCL 的这个高电平期间盯着 SDA 线读取当前的电平状态是高1还是低0。读数据读取过程主机接收数据打卡原理阶段一等待SCL 低电平期间SCL 为低时从机正在内部“翻牌子”准备下一个要发出的数据。此时 SDA 线可能会有波动由从机控制。阶段二打卡SCL 高电平期间当 SCL 产生上升沿从机把 SDA 线固定住拉高或拉低代表真正的 bit 数据。主机必须在 SCL 高电平期间读取 SDA 的状态。一旦 SCL 变低从机可能就要准备下一位数据了此时读到的可能就是错误的中间态。总结SCL 为低时 → SDA 可以变发送方在准备下一个 bit改电平SCL 升为高时 → SDA 不许动接收方在这一拍把 SDA 读进来当成 1 或 0