STM32——I2C协议

一、什么是 IIC

1. 通俗理解

IIC(也写做 I2C)是一种低速、近距离、两根线 的串行通信协议。作用:单片机 和 各种外设通信常见 IIC 外设:

  • OLED 显示屏
  • AT24C02 存储芯片
  • MPU6050 陀螺仪
  • 温湿度传感器、光照传感器

2. 核心特点

  1. 只需要 两根线 就能通信
  2. 支持 一主多从:一个单片机可以挂很多个 IIC 设备
  3. 半双工:同一时间只能发 或者 只能收
  4. 速率低:常用 100K / 400K
  5. 引脚可以 开漏输出,支持线与

3. 两根核心线

  • SCL:时钟线 ------ 由主机产生时钟,控制通信节奏
  • SDA:数据线 ------ 收发数据都靠这根线

所有 IIC 设备共用 SCL、SDA,靠设备地址区分谁跟谁说话。

二、IIC 物理硬件结构

硬件连接特点

  1. SCL、SDA 都需要上拉电阻(一般 4.7K)到 3.3V/5V
  2. 芯片引脚内部是 开漏输出
  3. 空闲时:两根线都是高电平
  4. 拉低电平靠芯片内部导通,拉高靠上拉电阻

为什么要上拉电阻?

开漏引脚 只能拉低、不能主动拉高空闲时靠电阻把电平拉回高电平。

三、IIC 标准时序

1. 起始信号 Start

SCL 高电平期间,SDA 由高 → 低含义:告诉所有从机,我要开始发数据了。

2. 停止信号 Stop

SCL 高电平期间,SDA 由低 → 高含义:本次通信结束。

3. 发送字节时序

  1. SCL 拉低 → 改变 SDA 电平
  2. SCL 拉高 → 从机读取当前 SDA 电平
  3. 高位先发,一个字节 8bit
  4. 发完 8bit 后,等待从机应答

4. 应答信号 ACK / NACK

  • ACK 应答:从机把 SDA 拉低,表示收到数据
  • NACK 不应答:SDA 保持高电平,表示没收到 / 结束通信

四、IIC 外设内部框图

复制代码
IIC外设整体结构:
1. 引脚部分        SCL引脚  SDA引脚
2. 寄存器部分      数据寄存器、地址寄存器、控制寄存器、状态寄存器
3. 移位寄存器      把并行数据转串行逐位发
4. 时钟控制单元    产生标准100K/400K通信时钟
5. 仲裁单元        多主机冲突检测
6. 控制逻辑单元    管理起始、停止、应答、收发时序

各部分作用

  1. 时钟控制单元:自动产生 SCL 时钟,不用你软件模拟延时
  2. 移位寄存器:硬件自动逐位发 8 个 bit,不用自己写循环发位
  3. 状态寄存器:告诉程序是否发送完成、是否收到应答
  4. 地址寄存器:存放从机地址,硬件自动匹配

一句话总结:硬件 IIC 把所有时序、时钟、移位、应答 都做在硬件里,代码只需要写 "发字节、收字节" 即可。

五、硬件 IIC 与 软件 IIC 区别

1. 软件 IIC

原理 :随便用两个普通 GPIO 引脚(比如 PB6 PB7)用代码延时 模拟 SCL、SDA 高低电平,手动拼出 起始、停止、应答、发字节时序。

优点

  1. 随便选引脚,不受硬件 IIC 引脚限制
  2. 几乎所有单片机都能跑
  3. 不占用片上硬件外设资源
  4. 兼容性极强,极少出奇怪 bug

缺点

  1. 靠 delay 延时模拟时序,占用 CPU
  2. 速率慢、定时不准容易时序出错
  3. 不能用中断、DMA

2. 硬件 IIC

原理 :使用 STM32 自带 IIC1/IIC2 专用引脚,外设硬件自动生成时序、时钟、收发 bit,不需要自己模拟高低电平。

优点

  1. 硬件自动时序,不占用 CPU
  2. 速度快、时序精准
  3. 支持中断、DMA
  4. 代码极简

缺点

  1. 引脚固定,不能随便换 IO
  2. STM3F103 硬件 IIC 有经典 BUG,容易卡死、时序异常
  3. 配置比软件复杂

总结一句话

  • 初学、做项目、怕翻车 → 一律用 软件 IIC
  • 熟练、高速通信、不用兼容任意引脚 → 用 硬件 IIC

六、软件 IIC 配置逻辑

1. 核心思路

随便选两个普通 GPIO:

  • 定义 SCL_PIN、SDA_PIN
  • 初始化为 推挽输出 / 开漏输出
  • 写四个底层函数:
    1. IIC 起始信号
    2. IIC 停止信号
    3. IIC 发送一个字节
    4. IIC 读取一个字节 + 应答控制

2. 软件 IIC 本质

全程靠代码控制引脚高低电平 + 简单延时完全按照标准 IIC 时序,一步步模拟出来。不用开启硬件 IIC 外设时钟,普通 GPIO 就能搞定。

3. 适用场景

OLED、AT24C02、MPU6050 绝大多数项目,90% 工程师都用软件 IIC。

七、硬件 IIC 配置逻辑

1. 固定引脚(STM32F103)

  • IIC1:PB6(SCL) PB7(SDA)
  • IIC2:PB10(SCL) PB11(SDA)

2. 配置步骤

  1. 开启 GPIO 时钟、开启 IIC 外设时钟、开启 AFIO 复用时钟
  2. 配置引脚为 复用开漏输出
  3. 配置 IIC 工作模式:标准模式 100K / 高速 400K
  4. 配置自身设备地址
  5. 使能 IIC 外设
  6. 调用库函数:发送地址、发送数据、接收数据

3. 硬件 IIC 工作方式

你只需要调用库函数:

  • IIC_SendData()
  • IIC_ReadData ()硬件自动帮你:起始、发地址、发 bit、应答、停止,全程硬件自动完成。

八、怎么选:软件 IIC 还是 硬件 IIC

选 软件 IIC

  • 新手学习
  • 想要随便改引脚
  • 不想踩 STM32 硬件 IIC bug
  • 项目低速够用、追求稳定不翻车
  • 多个 IIC 设备,引脚不够用

选 硬件 IIC

  • 需要高速 400K 通信
  • 需要用 DMA、中断
  • 固定引脚布线,不想用软件延时占用 CPU
  • 做复杂工业设备、大数据传输

九、总结

  1. IIC 两根线:SCL 时钟、SDA 数据,一主多从、靠地址区分设备。
  2. 四大基础时序:起始、停止、发字节、应答。
  3. 软件 IIC:普通 GPIO + 代码模拟时序,简单稳定、引脚随意。
  4. 硬件 IIC:专用引脚 + 外设自动时序,速度快但有 bug、引脚固定。
  5. 初学和普通项目 优先软件 IIC。
相关推荐
SuperByteMaster1 小时前
allegro 布线规则管理器
嵌入式硬件
女神下凡2 小时前
芯参谋(41):DDR2_电路设计指南
arm开发·单片机·嵌入式硬件·设计规范
Zhao136824553914 小时前
国产替代DPE5500百兆以太网控制芯片兼容W5500
嵌入式硬件·物联网
yuehuaxin015 小时前
LP20R100FN 同步整流|3C 认证适配器 CCM 工况倒灌、温升超标样机避坑解析
嵌入式硬件·智能家居·适配器模式·智能硬件
国科安芯5 小时前
商业立方星平台中高集成度抗辐射MCU的功耗优化与批量化应用可行性探讨
单片机·嵌入式硬件·架构·risc-v·抗辐射·as32x601
女神下凡5 小时前
芯参谋(40):UFS 电路设计指南
arm开发·单片机·嵌入式硬件·设计规范
iCxhust6 小时前
CAN信号电平与485信号电平实测
单片机·can·通讯·rs485
深圳市恒锐丰科技杨生7 小时前
EG1125 准谐振原边反馈 CC‑CV 功率开关|屹晶 EGmicro
嵌入式硬件·硬件工程
iCxhust7 小时前
51单片机电力载波应用开发(七)广播通讯
c语言·开发语言·单片机·嵌入式硬件·51单片机
深圳市恒锐丰科技杨生7 小时前
EG4005 微波 / 红外感应信号处理芯片|屹晶 EGmicro
嵌入式硬件·硬件工程