You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F103C8T6的I2C始终无法生成起始条件问题求助

问题排查与解决方案

1. 核心代码笔误

你的i2c_write函数中触发起始条件的代码存在明显错误:

I2C1 -> CR1 |= (1<8); // 此处逻辑运算错误,实际应为左移操作

正确写法是:

I2C1 -> CR1 |= (1 << 8); // 置位CR1寄存器的START位(第8位)

这个笔误会导致你根本没有触发I2C的起始条件,SB位自然永远不会置位,这是当前最关键的问题。

2. 总线硬件与电平检查

修复笔误后,仍需确认以下硬件相关项:

  • 上拉电阻:I2C总线必须在SDA和SCL引脚外接4.7kΩ左右的上拉电阻到VCC。你的GPIO配置为开漏输出,若没有上拉,总线无法维持高电平,I2C控制器无法检测到起始条件。
  • GPIO复用有效性:确认gpio_init函数是否正确将PB6/PB7配置为复用开漏输出,确保引脚确实绑定到I2C1的外设功能,而非普通GPIO输出。

3. 额外配置验证

  • 核对RCC时钟使能位:针对STM32F1系列,RCC->APB1ENR的第21位确实是I2C1时钟使能位,若使用其他系列需对照寄存器手册确认。
  • 延长复位等待时间:I2C复位后建议等待5ms左右,确保外设完全复位完成后再进行后续配置。
  • 起始前检查总线状态:在触发起始条件前,可先确认总线处于空闲状态:
    while(I2C1->SR2 & (1 << 1)); // 等待BUSY位清零,确保总线空闲
    

内容的提问来源于stack exchange,提问作者ALI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:25:02