EEPROM读写失败案例

最近大佬们开发新平台bootload的时候出了点小问题,EE读写不太正常,于是乎,我!小兵登场!


-------------------------更新------------------------------------

今天发现不是接口使用问题,归根于EE进行读操作后,在并没有写完数据时就有其他操作访问了EE,所以一直体现出写失败。在写EE过程中增加100us延时后解决

一、问题描述

    EE读写不正常,由于大佬们比较忙,没时间去具体看,所以先让我找下原因

二、排查过程

    小登指定是没有透过现象看本质的本事,直接跟着代码往下走,看看现象先。

直接在Eep下手,代码如下:

uint8 i = 0;
uint8 Tmp[8u] = 0;
void Eep_W_R_Test(void)
{
    Eep_Read("地址","数据指针","长度")
    Eep_MainFunction();
    for ( i = 0; i < 8u; i++)
    {
        Tmp[i] = 1;
    }
    Eep_Write("地址","数据指针","长度");
    Eep_MainFunction();
}

在Eep_Read/Eep_Write函数中会经过处理,将读写标志位置位,然后进入Eep_MainFunction函数中进行读写操作。在这时候我发现,程序跑进Eep_MainFunc之后,无论是从Read进的还是Write进的,都执行的是读操作,也就是说,写操作是没有生效的。而写操作的前置条件是目标块空闲。

其实进行到这任务就已经结束了,懂得人已经明白什么意思了,读/写操作没有完成,自然无法进行下一个操作,但是小登不懂啊,小登在读操作流程完成之后,手动让目标块空闲,你别说,还真行了。但是这样直接修改底层接口的方法容易破坏整体的调度,可以试但不能成为一种方法。于是小登去查了相关技术手册,找到了Nvm模块中的读写函数接口。

从这开始做无用功,对照技术手册的用法,改代码,但是忽略的局部变量与全局变量的区别,本来是全局变量全被我放到函数体中变成了局部变量,导致函数中对这些变量的各种处理变成了一次性的操作,随着一次一次的debug,小登发现了规律,当从第一次写操作进行结束之后,在进行3个循环,结束后,目标块状态变为了空闲。多次尝试后确定了当前现象,由于我是小登,对这方面了解确实没有,强行逮住大佬问了一下,大佬说【四次在预期内,可能是EE换页,有标志位的话等一下再看看。】

好,几天白干,就是这个原因,也就是说什么问题都没有,只是原来的测试程序没有等操作执行结束导致队列占满。然后写了个测试函数:

/****************************************************************************
 * Function Name :Test
 * 
 * 
 * 
 * 
*****************************************************************************/
uint16 Test_Flag = 0U;
uint8 jobResult = 0U;
uint8 readBufBoot[8] = {0};
uint8 writeBufBoot[8] = {1,0,1,0,1,0,1,0};
void Test(void)
{

    switch (Test_Flag)
    {
        case 0:
            WriteBlock(BLOCKID, writeBufBoot);
            Test_Flag = 1U;
            break;
        case 1:
            GetErrorStatus(BLOCKID, & jobResult);
            if( REQ_OK == jobResult )
            {
                ReadBlockBLOCKID, &readBufBoot[BOOT_ZERO]);
                Test_Flag = 2U;
            }
            break;
        case 2:
            GetErrorStatus(BLOCKID, & jobResult);
            if( REQ_OK == jobResult )
            {
                Test_Flag = 0U;
            }
            break;
        default:
            Test_Flag = 1U;
            break;
    }
}

总结

总的来说,只是一个接口使用问题,硬生生占用了我一周的时间,主要原因还是经验不足,对一个完全陌生的模块还是有点慌乱。

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值