登录/注册

STM32设置I2C初始值

STM32设置I2C初始值

更多

在STM32中配置I2C初始值通常涉及以下步骤(以STM32Cube HAL库为例):

1. 配置GPIO引脚

// 配置SCL和SDA引脚为复用开漏模式(例:PB6=SCL, PB7=SDA)
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;        // 复用开漏输出
GPIO_InitStruct.Pull = GPIO_PULLUP;            // 内部上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;  // 高速模式
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;     // I2C复用功能
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

2. 设置I2C参数

I2C_HandleTypeDef hi2c1;
hi2c1.Instance = I2C1;  // 选择I2C外设
hi2c1.Init.ClockSpeed = 400000;          // 时钟频率(标准模式100000,快速模式400000)
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;  // 占空比(快速模式可选:I2C_DUTYCYCLE_16_9 或 I2C_DUTYCYCLE_2)
hi2c1.Init.OwnAddress1 = 0x00;           // 主机地址(主机模式通常设为0)
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; // 7位地址模式
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; // 禁用双地址
hi2c1.Init.OwnAddress2 = 0;              // 第二地址(未使用时设为0)
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; // 禁用广播呼叫
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;    // 时钟拉伸使能

3. 初始化I2C外设

if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
  Error_Handler(); // 初始化失败处理
}

4. 可选:配置时钟源

// 在System Clock配置中确保I2C时钟源已使能
__HAL_RCC_I2C1_CLK_ENABLE();

关键参数说明:

参数 可选值
ClockSpeed 100000(标准模式), 400000(快速模式)等
DutyCycle I2C_DUTYCYCLE_2(Tlow/Thigh = 2)
I2C_DUTYCYCLE_16_9(Tlow/Thigh = 16/9)
AddressingMode I2C_ADDRESSINGMODE_7BIT(常用)
I2C_ADDRESSINGMODE_10BIT
NoStretchMode I2C_NOSTRETCH_DISABLE(从机可拉低时钟)
I2C_NOSTRETCH_ENABLE(禁用拉伸)

⚠️ 注意

  • 实际时钟频率受APB总线时钟限制(需满足 I2C时钟 ≤ APB时钟/4)。
  • 标准模式最高100kHz,快速模式最高400kHz。
  • 建议使用STM32CubeMX工具生成初始化代码,自动计算分频值。

示例完整代码结构:

void MX_I2C1_Init(void) {
  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

  if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
    Error_Handler();
  }
}

I2C总线设备地址设置方法

通常是一个7位或10位的数字,用于标识总线上的每个设备。在7位寻址模式下,地址范围是0x00到0x7F,而在10位寻址模式下,地址范围是0x000到0x3FF。I2C地址的最低位(LSB)通常用于指示读/写操作。 硬件地址设置

2025-01-17 15:17:07

在MCU编程中局部变量赋初始值的重要性

在MCU编程中局部变量赋初始值的重要性

2023-10-16 18:29:03

I2C控制器驱动介绍

适配器与 I2C 设备进行通信的方法。 I2C 总线驱动,或者说 I2C 适配器驱动的主要工作就是

2023-07-22 15:38:35

STM32 I2C存取实验资料

STM32 I2C存取实验资料

资料下载 郑兵 2021-12-30 10:36:41

I2C接口配置ES7243录音芯片,MCU(STM32)收不到I2C ACK的问题

I2C接口配置ES7243录音芯片,MCU(STM32)收不到I2C ACK的问题

资料下载 生龙活虎3 2021-12-08 16:36:07

stm32使用MPU6050读取温度验证I2C

stm32使用MPU6050读取温度值验证I2C

资料下载 好名字 2021-12-06 12:06:06

STM32 通用GPIO模拟I2C实现

STM32 模拟I2C实现#通用GPIO模拟I2C通信实现样例1 GPIO初始

资料下载 山中老虎 2021-11-29 15:21:08

由RAM上电后初始值引起的问题

本篇LAT的内容简介了一个由RAM上电后初始值引起的问题。

资料下载 姚小熊27 2021-04-28 15:36:05

I2C debug出现问题怎么解决

_transfer 返回值为 -6? 返回值为 -6 表示为 NACK 错误,即对方设备无应答响应,这种情况一般为外设的问题,常见的有以下几种情况: I2C

2023-07-22 15:00:27

stm32f469i_Discovery中的i2c初始化问题如何解决?

它正在使用 stm32f469i_Discovery 开发产品。stm32f469i_Discovery 板旨在与 DS3231 一起使用。它连接到 I2C

2023-01-06 07:16:46

如何去使用STM32的硬件I2C

前言网上有些人说STM32的硬件I2C使用起来有问题,我用起来一点问题都没有,下面大致说一下最近做这个的心得CubeMX设置软件采用最新的Cub

2021-08-11 08:33:04

教你们怎么去设定寄存器的初始值

对于寄存器,如果没有明确指定其初始值,Vivado会根据其类型(FDCE/FDRE/FDPE/FDRE)设定合适的初始值。有些工程师喜欢使用复位信号,对所有的寄存器进行上电复位,使其在处理数据之前达到期望

2021-04-01 10:27:23

STM32 I2C硬件的结构

我们可以看见STM32的硬件I2C有两个和数据有关的寄存器“数据寄存器(Data register)”(DR)和“数据移位寄存器(Data shift register)”(DSR),我们的软件写入的是DR, DSR

2020-04-30 15:00:29

STM32 HAL库 I2C 学习

static void MX_I2C1_Init(void) { hi2c1.Instance = I2C1; \\

2020-04-26 15:09:23

具有灵活I2c从地址的I2c引导加载程序该如何初始化?

你好,我使用的I2C引导装载器工作得很好。直到现在,我还在I2C组件设置中设置

2019-09-02 14:01:23
7天热门专题 换一换
相关标签