4

我正在尝试对 stm32 进行编程以与我的 i2c EEprom 对话,但似乎每次我说:

I2C_GenerateSTART(I2C1, ENABLE);
while( !(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) );  the code hangs here

我使用了调试器,发现没有设置 SR1 位 0 标志(这是生成的起始位标志),这就是代码挂起的原因。我可以在示波器中看到生成了起始位,这有时会起作用。当我尝试连续进行多次写入时,它通常会中断。我检查了硬件一切看起来都很好我检查了我在 i2c 总线上运行的频率,它在 24lc1025 eeprom 内是 100Khz。

有任何想法吗,

谢谢

4

3 回答 3

6

由于您说这通常会在您连续执行多次写入时中断,因此您可能希望确保您没有违反 STM32 数据表中针对STOPI2C_CR1 控制寄存器中的位的此注释:

注意:当STOP,START或位被设置时,在该位被硬件清除之前PEC,软件不得执行任何写访问。I2C_CR1否则有设置第二个STOPSTART请求PEC的风险。

设置该STOP位后,您需要确保硬件已将其清除,然后再写入下START一位。

于 2010-03-31T23:44:34.113 回答
1

检查您设备的勘误表(从 ST 网站获取)。STM32在I2C实现上有很多bug。勘误表为他们提供了软件解决方法。

于 2012-02-06T21:09:03.013 回答
0

此外,当使用 STM32 平台通常提供的驱动程序源文件时,不要忘记通读标题!它们非常有帮助,尤其是对于不确定从哪里开始的新手(比如我)。

在这种情况下,您将查看stm32f4xx_i2c.c

于 2013-09-08T21:43:20.693 回答