初中生
最后登录1970-1-1
在线时间 小时
注册时间2017-2-27
|
本帖最后由 国际哥 于 2017-4-25 09:40 编辑
在做作业“比较页写入和字节写入速度 ”时发现的问题——资料盘里固件库例程的程序应该是比视频中打的更为完善,然而在“等待 EEPROM 内部处理”的 I2C_EE_WaitEepromStandbyState() 函数上,固件库例程却比视频程序里同样功能的 Wait_for_EEPROM() 函数少了最后一句等待总线空闲的 while(I2C_GetFlagStatus(EEPROM_I2C,I2C_FLAG_BUSY) == SET),直接导致连续调用 I2C_EE_ByteWrite 和 I2C_EE_WaitEepromStandbyState 函数连续写字节时只能写入一次,后面所有写操作都超时的错误。
- // mian 函数中连续调用 I2C_EE_ByteWrite 函数写数据
- for (i = 0; i < 256; i++) // 逐字节写入
- {
- I2C_EE_ByteWrite(&I2c_Buf_Write[i], EEP_Firstpage+i);
- I2C_EE_WaitEepromStandbyState();
- }
复制代码
- // bsp_i2c_ee.c
- void I2C_EE_WaitEepromStandbyState(void)
- {
- vu16 SR1_Tmp = 0;
- do
- {
- /* Send START condition */
- I2C_GenerateSTART(EEPROM_I2C, ENABLE);
- /* Read EEPROM_I2C SR1 register */
- SR1_Tmp = I2C_ReadRegister(EEPROM_I2C, I2C_Register_SR1);
- /* Send EEPROM address for write */
- I2C_Send7bitAddress(EEPROM_I2C, EEPROM_ADDRESS, I2C_Direction_Transmitter);
- }while(!(I2C_ReadRegister(EEPROM_I2C, I2C_Register_SR1) & 0x0002));
- /* Clear AF flag */
- I2C_ClearFlag(EEPROM_I2C, I2C_FLAG_AF);
- /* STOP condition */
- I2C_GenerateSTOP(EEPROM_I2C, ENABLE);
- while(I2C_GetFlagStatus(EEPROM_I2C,I2C_FLAG_BUSY) == SET); //一定要加!!!总线空闲,执行下面的语句
- }
复制代码
而只要在 I2C_EE_WaitEepromStandbyState 函数最后加上 while 循环等待总线空闲即可解决。
把 I2C_EE_WaitEepromStandbyState 函数放在 I2C_EE_ByteWrite 函数体最前面即可实现外部循环调用 I2C_EE_ByteWrite 函数连续写字节。
- uint32_t I2C_EE_ByteWrite(u8* pBuffer, u8 WriteAddr)
- {
- I2C_EE_WaitEepromStandbyState();
- // 原来的代码
- ...
- }
复制代码
- main 函数中直接循环调用 I2C_EE_ByteWrite 函数连续写字节
- for (i = 0; i < 256; i++)
- {
- I2C_EE_ByteWrite(&I2c_Buf_Write[i], EEP_Firstpage+i);
- //I2C_EE_WaitEepromStandbyState();
- }
复制代码
其实视频里的程序都是好的,或许是精简考虑,固件库例程删减了看似不必要其实很重要的代码吧。
|
|