news 2026/3/18 11:26:13

STM32_I2C

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32_I2C
简介

I2C(Inter-Integrated Circuit,集成电路间)是一种同步串行通信总线,由飞利浦公司开发,广泛应用于单片机与外设之间的短距离通信。I2C总线仅需两根线(SCL时钟线和SDA数据线)即可实现多设备之间的通信,具有接口简单、占用引脚少、通信可靠等优点。STM32F407 系列芯片提供了多达 3 个 I2C 接口,支持标准模式(100kHz)、快速模式(400kHz)和高速模式(1MHz),可连接各种 I2C 设备,如传感器、EEPROM、LCD 等。本文从 I2C 的基本原理出发,详细讲解 STM32F407 I2C 的配置方法、代码实现、通信协议以及实际应用案例,帮助你快速掌握 I2C 通信技术。

一、I2C核心概念与分类
1.1 基本概念

I2C 是一种两线式串行总线,用于连接微控制器及其外围设备,其主要特点包括:

  • 两根通信线:SCL(Serial Clock,串行时钟线)和SDA(Serial Data,串行数据线)
  • 多主从架构:支持多个主设备和多个从设备
  • 从设备地址:每个从设备都有唯一的7位或10位地址
  • 同步通信:主设备提供时钟信号,所有设备在时钟的同步下进行通信
  • 双向通信:SDA线是双向的,可实现主设备与从设备之间的数据传输

关键参数

  • 通信速率:标准模式(100kHz)、快速模式(400kHz)、高速模式(1MHz)
  • 从设备地址:7位地址范围为0-127,10位地址范围为0-1023
  • 数据传输格式:每个字节为8位,后跟1位应答位
  • 总线仲裁:当多个主设备同时发送数据时,通过仲裁机制决定总线控制权
1.2 STM32F407 的 I2C 资源

STM32F407 系列芯片提供了 3 个 I2C 接口(I2C1、I2C2、I2C3):

I2C引脚最大通信速率适用场景
I2C1PB6(SCL), PB7(SDA) 或 PF1(SCL), PF0(SDA)1MHz主要I2C接口,支持高速模式
I2C2PB10(SCL), PB11(SDA) 或 PH4(SCL), PH5(SDA)1MHz辅助I2C接口
I2C3PA8(SCL), PC9(SDA) 或 PH7(SCL), PH8(SDA)1MHz辅助I2C接口

关键特性

  • 支持 7 位和 10 位从设备地址
  • 支持标准模式、快速模式和高速模式
  • 支持 DMA 传输
  • 支持多主模式和从模式
  • 内置噪声滤波器和错误检测功能
二、I2C通信协议
2.1 基本通信流程

I2C 通信的基本流程包括:

  1. 起始条件:SCL 高电平时,SDA 从高电平跳变到低电平
  2. 发送从设备地址:主设备发送7位从设备地址和1位读写方向位(0为写,1为读)
  3. 等待应答:从设备收到地址后,发送应答位
  4. 数据传输:主设备和从设备之间传输数据,每次传输8位,后跟1位应答位
  5. 停止条件:SCL 高电平时,SDA 从低电平跳变到高电平
2.2 信号时序

起始条件

  • SCL 保持高电平
  • SDA 从高电平跳变到低电平

停止条件

  • SCL 保持高电平
  • SDA 从低电平跳变到高电平

数据传输

  • SCL 为低电平时,SDA 可以改变状态
  • SCL 为高电平时,SDA 必须保持稳定,此时从设备采样数据

应答位

  • 发送方发送8位数据后,在第9个时钟周期释放SDA线
  • 接收方在第9个时钟周期将SDA线拉低,表示应答
  • 接收方在第9个时钟周期保持SDA线高电平,表示非应答
2.3 通信模式

I2C 支持两种主要的通信模式:

主发送模式:主设备向从设备发送数据

  1. 主设备发送起始条件
  2. 主设备发送从设备地址(写方向)
  3. 从设备发送应答位
  4. 主设备发送数据字节
  5. 从设备发送应答位
  6. 重复步骤4-5,发送多个数据字节
  7. 主设备发送停止条件

主接收模式:主设备从从设备接收数据

  1. 主设备发送起始条件
  2. 主设备发送从设备地址(读方向)
  3. 从设备发送应答位
  4. 从设备发送数据字节
  5. 主设备发送应答位(继续接收)或非应答位(停止接收)
  6. 重复步骤4-5,接收多个数据字节
  7. 主设备发送停止条件

复合模式:主设备先向从设备发送数据(如寄存器地址),然后从从设备接收数据

  1. 主设备发送起始条件
  2. 主设备发送从设备地址(写方向)
  3. 从设备发送应答位
  4. 主设备发送寄存器地址
  5. 从设备发送应答位
  6. 主设备发送重复起始条件
  7. 主设备发送从设备地址(读方向)
  8. 从设备发送应答位
  9. 从设备发送数据字节
  10. 主设备发送非应答位
  11. 主设备发送停止条件
三、I2C配置与代码实现
3.1 标准库配置步骤

以 I2C1 为例,使用标准库配置 I2C 的基本步骤:

  1. 使能 I2C 时钟和 GPIO 时钟
  2. 配置 GPIO 为复用功能
  3. 配置 I2C 基本参数(时钟频率、地址模式等)
  4. 使能 I2C
  5. 配置中断(可选)
  6. 配置 DMA(可选)
3.2 代码实现(I2C1,400kHz)
#include"stm32f4xx.h"#defineI2C_SPEED400000// I2C通信速率:400kHz/** * @brief 初始化I2C1 * @param 无 * @retval 无 */voidI2C1_Init(void){GPIO_InitTypeDef GPIO_InitStructure;I2C_InitTypeDef I2C_InitStructure;// 1. 使能时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);// 2. 配置GPIOGPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);// 3. 将GPIO引脚连接到I2C1GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_I2C1);// SCLGPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_I2C1);// SDA// 4. 配置I2C1I2C_InitStructure.I2C_ClockSpeed=I2C_SPEED;I2C_InitStructure.I2C_Mode=I2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1=0x00;// 主模式下不需要设置自己的地址I2C_InitStructure.I2C_Ack=I2C_Ack_Enable;I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;I2C_Init(I2C1,&I2C_InitStructure);// 5. 使能I2C1I2C_Cmd(I2C1,ENABLE);}/** * @brief I2C发送起始条件 * @param I2Cx: I2C接口,如I2C1、I2C2等 * @retval 成功返回0,失败返回1 */uint8_tI2C_Start(I2C_TypeDef*I2Cx){uint32_ttimeout=10000;// 发送起始条件I2C_GenerateSTART(I2Cx,ENABLE);// 等待起始条件生成while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT)){if(--timeout==0)return1;}return0;}/** * @brief I2C发送停止条件 * @param I2Cx: I2C接口,如I2C1、I2C2等 * @retval 无 */voidI2C_Stop(I2C_TypeDef*I2Cx){// 发送停止条件I2C_GenerateSTOP(I2Cx,ENABLE);}/** * @brief I2C发送设备地址 * @param I2Cx: I2C接口,如I2C1、I2C2等 * @param address: 设备地址 * @param direction: 方向,0为写,1为读 * @retval 成功返回0,失败返回1 */uint8_tI2C_SendAddress(I2C_TypeDef*I2Cx,uint8_taddress,uint8_tdirection){uint32_ttimeout=10000;// 发送设备地址和方向I2C_Send7bitAddress(I2Cx,address<<1,direction?I2C_Direction_Receiver:I2C_Direction_Transmitter);// 等待地址发送完成if(direction){// 读方向while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)){if(--timeout==0)return1;}}else{// 写方向while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){if(--timeout==0)return1;}}return0;}/** * @brief I2C发送数据 * @param I2Cx: I2C接口,如I2C1、I2C2等 * @param data: 要发送的数据 * @retval 成功返回0,失败返回1 */uint8_tI2C_SendData(I2C_TypeDef*I2Cx,uint8_tdata){uint32_ttimeout=10000;// 发送数据I2C_SendData(I2Cx,data);// 等待数据发送完成while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTED)){if(--timeout==0)return1;}return0;}/** * @brief I2C接收数据 * @param I2Cx: I2C接口,如I2C1、I2C2等 * @param ack: 是否发送应答,0为非应答,1为应答 * @retval 接收到的数据 */uint8_tI2C_ReceiveData(I2C_TypeDef*I2Cx,uint8_tack){// 配置应答if(ack)I2C_AcknowledgeConfig(I2Cx,ENABLE);elseI2C_AcknowledgeConfig(I2Cx,DISABLE);// 等待数据接收while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_RECEIVED));// 返回接收到的数据returnI2C_ReceiveData(I2Cx);}/** * @brief I2C写单个字节 * @param I2Cx: I2C接口,如I2C1、I2C2等 * @param dev_addr: 设备地址 * @param reg_addr: 寄存器地址 * @param data: 要写入的数据 * @retval 成功返回0,失败返回1 */uint8_tI2C_WriteByte(I2C_TypeDef*I2Cx,uint8_tdev_addr,uint8_treg_addr,uint8_tdata){// 发送起始条件if(I2C_Start(I2Cx))return1;// 发送设备地址(写方向)if(I2C_SendAddress(I2Cx,dev_addr,0)){I2C_Stop(I2Cx);return1;}// 发送寄存器地址if(I2C_SendData(I2Cx,reg_addr)){I2C_Stop(I2Cx);return1;}// 发送数据if(I2C_SendData(I2Cx,data)){I2C_Stop(I2Cx);return1;}// 发送停止条件I2C_Stop(I2Cx);return
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 7:36:08

告别手动抢茅台:智能预约的自动化高效管理方案

告别手动抢茅台&#xff1a;智能预约的自动化高效管理方案 【免费下载链接】campus-imaotai i茅台app自动预约&#xff0c;每日自动预约&#xff0c;支持docker一键部署 项目地址: https://gitcode.com/GitHub_Trending/ca/campus-imaotai 你是否曾遇到这样的困扰&#…

作者头像 李华
网站建设 2026/3/15 8:34:31

3分钟解锁钉钉自动打卡:告别早起的智能秘诀

3分钟解锁钉钉自动打卡&#xff1a;告别早起的智能秘诀 【免费下载链接】AutoDingding 钉钉自动打卡 项目地址: https://gitcode.com/gh_mirrors/au/AutoDingding 每天早上被闹钟惊醒&#xff0c;匆匆忙忙洗漱出门&#xff0c;一路狂奔只为赶上9点的打卡&#xff1f;这种…

作者头像 李华
网站建设 2026/3/15 10:49:03

STM32_PWR

简介 PWR(Power Control,电源控制)是 STM32 单片机中用于管理电源模式和电压的外设,支持多种低功耗模式,可显著降低系统功耗。STM32F407 系列芯片配备了功能强大的 PWR 外设,支持睡眠模式、停止模式、待机模式等多种低功耗模式,广泛应用于电池供电、低功耗应用等场景。…

作者头像 李华
网站建设 2026/3/15 7:57:27

阴阳师智能挂机助手:让游戏更轻松的自动化工具

阴阳师智能挂机助手&#xff1a;让游戏更轻松的自动化工具 【免费下载链接】yysScript 阴阳师脚本 支持御魂副本 双开 项目地址: https://gitcode.com/gh_mirrors/yy/yysScript 你是否也曾因为每天重复刷御魂而感到枯燥乏味&#xff1f;是否希望有一款工具能够帮助你自动…

作者头像 李华
网站建设 2026/3/15 7:48:37

如何用代码绘制科研级图形?揭秘LaTeX绘图的隐藏优势

如何用代码绘制科研级图形&#xff1f;揭秘LaTeX绘图的隐藏优势 【免费下载链接】tikz Random collection of standalone TikZ images 项目地址: https://gitcode.com/gh_mirrors/tikz/tikz 在科研论文的创作过程中&#xff0c;可视化元素往往决定了研究成果的传达效率。…

作者头像 李华