前言
这几天在使用E2PROM时出现了一些小问题,导致E2PROM不工作,历经9981难终于解决了问题,现记录如下:
问题
一、未正确编写E2PROM读写代码
这个问题只能通过多阅读理解EEPROM读写时序图来解决。
E2PROM写操作:
void E2prom_write(uint8_t addr,uint8_t data)//写代码
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CSendByte(data);
I2CWaitAck();
I2CStop();
}
I2C读操作:
uint8_t E2prom_read(uint8_t addr)
{
uint8_t data =0;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
data = I2CReceiveByte();
I2CStop();
return data;
}
二、忘记初始化
在使用I2C总线时,需要先进行初始化,即执行:
I2CInit();
三、未初始化时钟
I2C的使用理论上来说是不需要我们在CubeMX中进行配置的,只需要包括头文件,然后初始化使用即可,但是通过阅读初始化代码可知:
![](https://i-blog.csdnimg.cn/blog_migrate/1ea9e2650f4952f4bab0a326a3472732.png)
初始化代码并未使能时钟,如果没有使用GPIOB的情况下CubeMX并不会使能GPIOB的时钟,因此需要注意GPIO初始化中是否有使能时钟,如果没有的话需要添加:
__HAL_RCC_GPIOB_CLK_ENABLE();
四、读取间隔太短
![](https://i-blog.csdnimg.cn/blog_migrate/22c5ad8b0cbd1391b86ba5f8535921ed.png)
相邻两次的读写操作的间隔应该在5ms以上,以保证数据正确。
五、错误使用HAL_DELAY
前面提到,相邻两次读写操作的间隔应该在5ms以上,因此可以使用延时的方法保证时间。我们延时一般采用HAL库的Delay函数,或者使用for循环进行,当读写操作在中断中进行时,如果使用HAL_Delay函数,会造成程序卡死的现象。