qq603599910 发表于 2024-6-11 11:12:45

终于解决IAP_EEPROM连续写入多个数据读取异常问题



在这里先感谢各位前辈在原帖的回帖,事情原委是这样(链接原帖): https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7584&page=1&extra=#pid69680 ,因为附加其他验证代码和异常表现不稳定一直没有找到准确原因.

STC8H2K08U在ISP的范例程序把EEPROM基本操作代码复制到验证模块发现EEPROM连续读写一直出现最后一位数据读到了第一位,如下:
异常输出:

发送:@
接收:801234567       //最后一位数据(8)读到了第一位
发送:@
接收:801234567
发送:@
接收:801234567


EERROM循环写入外部代码:

    Flash_Erase(0x0400);
    for(i = 0 ; i < 9 ; i ++)
    {
      Flash_Program(0x0400 + i, i);
      delay_ms(10);                                    //加延时没有解决异常


    }



理论输出:

发送:@
接收:012345678
发送:@
接收:012345678
发送:@
接收:012345678


然后前辈建议我试试加" _nop_(); " 延时,我开始没有理解正确位置把延时加在每次连续读取的外部,异常依旧,如下代码:


for(i = 0 ; i < 9 ; i ++)
{
    Uart1_sendbyte(Flash_Read(0x0400 + i) + 0x30);
    delay_ms(10);                                    //加延时没有解决异常
}


一直在昨天论坛看到一位使用STC32的朋友也出现一样问题,帖子有提到_nop_()加到3个,我猛然想到是否函数内部延时不够,今天上班立即验证抓到了规律,"Flash_Read(int addr)" 函数内读IAP之前原一个延时增加到3个延时立即读写稳定.

char Flash_Read(int addr)
{
    char dat;
    EA = 0;   //禁止中断
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 1;                              //设置IAP读命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();    ------------------------------------------------------------ //在这里加延时异常跟着解除
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    dat = IAP_DATA;                           //读IAP数据
    Flash_Idle();                                  //关闭IAP功能
    EA = 1;   //重新允许中断
    return dat;
}


确定Flash_Read函数是问题关键,尝试加2个延时读写依旧会不稳定,最后为了稳定加了5个延时,顺便另两个Flash函数也在由原来的1个延时增加到3个延时,后来验证终于输出一直正常 .
最后感谢所有前辈,我原是模电专业后来模电开发实在难于维继才开始转MCU开发,这方面底子太薄我还是个小学生.谢谢!




soma 发表于 2024-6-11 13:21:13

还是要给单片机点反应时间啊。
页: [1]
查看完整版本: 终于解决IAP_EEPROM连续写入多个数据读取异常问题