1.之前有同学说发现I2C_EE_BufferWrite执行后,总线就被拉低了,使得后来的start位发不出去
这是因为每个I2C_EE_BufferWrite都是以I2C_EE_WaitEepromStandbyState结尾的,而这个函数里并未发送stop位来释放总线
所以第一个需要修改的地方就是在I2C_EE_WaitEepromStandbyState结尾加上I2C_GenerateSTOP(I2C1, ENABLE);
2.很多同学还发现在I2C_EE_BufferWrite接下来的I2C_EE_BufferRead中,死在了check EV6。
正因为第一点,有了stop位后,马上来start位,肯定不行;因为从e2prom的datasheet中有专门一个参数限制了Time between Stop condition and next Start condition。这个值typically 1.3us minimum。
所以代码中需要保证这个延迟。
3.附件中提供了修改后的代码,在各个I2C-speed(100K/200K/300K/400K)和各种MCU频率(PLL *6/*7/*8/*9),各种组合都可以运行正确了。 代码是跑在万利的EK-STM32F103板子上的。 相关链接:https://bbs.21ic.com/upfiles/img/200710/2007101316746703.zip |