蓝桥杯嵌入式--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函数,会造成程序卡死的现象

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值