蓝桥杯嵌入式--E2PROM读写异常解决
前言
这几天在使用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中进行配置的,只需要包括头文件,然后初始化使用即可,但是通过阅读初始化代码可知:
初始化代码并未使能时钟,如果没有使用GPIOB的情况下CubeMX并不会使能GPIOB的时钟,因此需要注意GPIO初始化中是否有使能时钟,如果没有的话需要添加:
__HAL_RCC_GPIOB_CLK_ENABLE(); 四、读取间隔太短
相邻两次的读写操作的间隔应该在5ms以上,以保证数据正确。
五、错误使用HAL_DELAY
前面提到,相邻两次读写操作的间隔应该在5ms以上,因此可以使用延时的方法保证时间。我们延时一般采用HAL库的Delay函数,或者使用for循环进行,当读写操作在中断中进行时,如果使用HAL_Delay函数,会造成程序卡死的现象。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
