我正在尝试将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。
任何想法,
谢谢
答案 0 :(得分:6)
由于您说连续执行多次写操作时通常会中断,您可能需要确保在ST_32数据表中没有违反I2C_CR1控件中STOP
位的注释寄存器:
注意:设置
STOP
,START
或PEC
位后,软件不得执行任何写操作 在此位被硬件清除之前访问I2C_CR1
。否则就有风险了 设置第二个STOP
,START
或PEC
请求。
设置STOP
位后,需要确保在写下一个START
位之前硬件已清除它。
答案 1 :(得分:1)
检查设备的勘误表(从ST网站获取)。 STM32在I2C实现中存在许多错误。勘误表为他们提供了软件解决方法。
答案 2 :(得分:0)
此外,在使用通常随STM32平台提供的驱动程序源文件时,请不要忘记阅读标题!他们可能非常有帮助,特别是对于那些不知道从哪里开始的新手(比如我)。
在这种情况下,您会看到stm32f4xx_i2c.c