野火STM32_HAL库版课程笔记-I2C介绍

本节内容为理论内容

I2C 协议简介

I2C 物理层

I2C 协议层

I2C 基本读写过程

1. 主机写操作

最上面的时序图,描述了主机向从机写入数据的过程。

  • S:起始信号。表示通信开始。
  • SLAVE ADDRESS:从机地址。主机发送要通信的从设备地址。
  • R/W :读写位。此处为 '0' ,表示写操作
  • A:应答信号。从机收到地址和读写位后,拉低总线表示应答。
  • DATA:数据。主机发送数据字节。
  • A / A̅:应答/非应答。每发送一个字节数据,接收方都需要发送一个应答位。最后一个字节传输完后,可以是应答也可以是非应答。
  • P:停止信号。表示通信结束。

总结流程: 起始 -> 发送从机地址(写) -> 等待应答 -> 发送数据(n字节) -> 等待应答 -> 停止。

2. 主机读操作

中间的时序图,描述了主机从从机读取数据的过程。

  • S:起始信号。
  • SLAVE ADDRESS:从机地址。
  • R/W :读写位。此处为 '1' ,表示读操作
  • A:应答信号。从机收到地址和读命令后应答。
  • DATA:数据。此时数据方向是从从机到主机。
  • A:应答信号。主机接收到数据后,通常需要发送应答(除了最后一个字节)。
  • P:停止信号。

总结流程: 起始 -> 发送从机地址(读) -> 等待应答 -> 接收数据(n字节) -> 发送应答 -> 停止。

3. 复合模式

最下面的长时序图,也称为"复合格式"或"重复启动模式"。这通常用于先写后读的场景,例如:先向传感器写入要读取的寄存器地址,然后再读取该寄存器的数据。

  • 第一阶段(写)
    • S:起始信号。
    • SLAVE ADDRESS + R/W̅:发送从机地址,R/W位为写(0)。
    • DATA (n字节 + ack):发送控制数据(通常是寄存器地址)。
  • Sr重复起始信号。注意这里没有发送停止信号(P),而是直接再次发送起始信号。这保证了总线的占用权不释放,防止其他主机干扰。
  • 第二阶段(读/写)
    • SLAVE ADDRESS + R/W̅:再次发送从机地址,此时R/W位根据需求决定(通常是切换为读 '1')。
    • DATA (n字节 + ack):进行数据的读取或写入。
  • P:停止信号。通信彻底结束。

通讯的起始和停止信号

数据有效性

地址和数据方向

响应

STM32 的 I2C 架构

1. 物理接口层 (橙色部分)

这是 STM32 芯片与外部世界连接的物理引脚。

  • SDA (Serial Data):串行数据线,用于双向传输数据。
  • SCL (Serial Clock):串行时钟线,由主机产生时钟信号。
  • SMBA (SMBus Alert):SMBus 警报线。SMBus 是基于 I2C 的一种总线标准,这个引脚用于特定的警报功能,在普通 I2C 通信中不常用。

2. 时钟控制模块 (紫色部分)

这部分负责生成和管理 I2C 通信所需的时钟信号。

  • 时钟控制:负责根据设定的速度(标准模式 100kHz 或快速模式 400kHz)来分频产生 SCL 时钟。
  • 时钟控制寄存器 (CCR):用户可以通过编程这个寄存器来配置 I2C 的通信速率(波特率)。

3. 数据处理与移位模块 (绿色部分)

这是 I2C 通信的核心数据通路,负责数据的串并转换和过滤。

  • 数据寄存器 (DR):这是 CPU 与 I2C 外设交换数据的地方。
    • 发送时:CPU 把数据写入 DR。
    • 接收时:CPU 从 DR 读取收到的数据。
  • 数据移位寄存器:负责将并行数据转换为串行数据(发送时),或将串行数据转换为并行数据(接收时)。它直接连接到 SDA 线进行位传输。
  • 比较器:用于从机模式。当主机发送地址时,硬件会将总线上的地址与"自身地址寄存器"里的值进行比较,如果匹配,则选中该从机。
  • 自身地址寄存器 / 双地址寄存器:存储 STM32 作为从机时的地址。
  • PEC 计算 / PEC 寄存器:用于数据包错误校验(Packet Error Checking),这是 SMBus 协议特有的功能,用于验证数据完整性。

4. 控制逻辑与状态模块 (黄色部分)

这部分是 I2C 外设的"大脑",负责协调各个模块的工作,并向 CPU 报告状态。

  • 控制寄存器 (CR1 和 CR2):用户通过写这些寄存器来开启 I2C、配置应答使能、启动/停止传输等。
  • 状态寄存器 (SR1 和 SR2):反映当前的通信状态(例如:发送寄存器为空、接收寄存器非空、地址已发送、总线忙等)。CPU 通过读取这些寄存器来判断下一步该做什么。
  • 控制逻辑:根据 CR 寄存器的设置和当前的通信状态,自动控制时序的产生(如产生起始信号、停止信号、应答信号)。
  • 中断 / DMA 请求:当特定事件发生(如数据接收完成)时,硬件会自动向 CPU 发送中断请求或 DMA 请求,从而减少 CPU 的负担,提高传输效率。
相关推荐
LinXunFeng19 小时前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
✎ ﹏梦醒͜ღ҉繁华落℘5 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
闪闪发亮的小星星5 天前
高斯光以及高斯光公式解释
笔记
zd8451015005 天前
RS485 总线详解
单片机·嵌入式硬件
cqbzcsq5 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息
牛根生同志5 天前
SPI数据收发的时候 TXE与RXNE标志位置位的时机
stm32·spi·transfer
阿米亚波5 天前
【Windows】QEMU 启动 openEuler aarch64/arm64 架构系统 + 离线软件源
linux·windows·经验分享·笔记·架构·arm
自传.5 天前
尚硅谷 Vibe Coding|第三章(1) Claude Code深度使用与进阶技巧 学习笔记
笔记·学习·尚硅谷·vibecoding
.千余5 天前
【C++】模板进阶全解:非类型参数|全特化|偏特化|分离编译完全指南
开发语言·c++·笔记·学习·其他
自传.5 天前
尚硅谷 Vibe Coding|第二章 AI编程工具生态 学习笔记
笔记·学习·ai编程·尚硅谷·vibe coding