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
相关产品推荐
相关产品推荐

