找回密码
 立即注册
查看: 447|回复: 1

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-05-02 21:48:56

6

主题

48

回帖

614

积分

高级会员

积分
614
发表于 2024-6-11 11:12:45 | 显示全部楼层 |阅读模式


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

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

[10:15:41.630]发送:@
[10:15:41.643]接收:801234567       //最后一位数据(8)读到了第一位
[10:15:42.758]发送:@
[10:15:42.764]接收:801234567
[10:15:43.765]发送:@
[10:15:43.774]接收:801234567


EERROM循环写入外部代码:

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


    }



理论输出:

[10:16:08.328]发送:@
[10:16:08.341]接收:012345678
[10:16:09.470]发送:@
[10:16:09.488]接收:012345678
[10:16:10.574]发送:@
[10:16:10.580]接收: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开发,这方面底子太薄我还是个小学生.谢谢!




回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

积分
4866
发表于 2024-6-11 13:21:13 来自手机 | 显示全部楼层
还是要给单片机点反应时间啊。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 06:54 , Processed in 0.142855 second(s), 53 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表