zjyao 发表于 2025-5-28 15:45:48

AI8051U的EEPROM读写出错怎么解决?

我用8051u的列子串口读写EEPROM的读EEPROM一段,写进芯片调试出错,哪位大侠帮看看什么原因。



    P0M1 = 0x00;   P0M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P1M1 = 0x00;   P1M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P2M1 = 0x00;   P2M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P3M1 = 0x00;   P3M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P4M1 = 0x00;   P4M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P5M1 = 0x00;   P5M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P6M1 = 0x00;   P6M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P7M1 = 0x00;   P7M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú

    UART1_config(1);    // Ñ¡Ôñ²¨ÌØÂÊ, 2: ʹÓÃTimer2×ö²¨ÌØÂÊ, ÆäËüÖµ: ʹÓÃTimer1×ö²¨ÌØÂÊ.
    EA = 1; //ÔÊÐí×ÜÖжÏ

//    PrintString1("AI8051UϵÁе¥Æ¬»úEEPROM²âÊÔ³ÌÐò£¬´®¿ÚÃüÁîÉèÖÃÈçÏÂ:\r\n");    //UART1·¢ËÍÒ»¸ö×Ö·û´®
//    PrintString1("W 0x000040 1234567890--> ¶Ô0x000040µØÖ·Ð´Èë×Ö·û1234567890.\r\n");   //UART1·¢ËÍÒ»¸ö×Ö·û´®
//    PrintString1("R 0x000040 10          --> ¶Ô0x000040µØÖ·¶Á³ö10¸ö×Ö½ÚÄÚÈÝ.\r\n"); //UART1·¢ËÍÒ»¸ö×Ö·û´®

    while(1)
    {
      delay_ms(1);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//      EEPROM_SectorErase(addr);         //²Á³ýÉÈÇø
//      i = EEPROM_write_n(addr,&RX1_Buffer,j);      //дN¸ö×Ö½Ú
                        while(1)
                        { addr=0xFFFC00;
                                j=1;
//                                tmp=0xF0;
                                EEPROM_read_n(addr,tmp,j);
                        }
   }
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
void EEPROM_read_n(u32 EE_address,u8 *DataAddress,u8 length)
{
    IAP_ENABLE();                           //ÉèÖõȴýʱ¼ä£¬ÔÊÐíIAP²Ù×÷£¬ËÍÒ»´Î¾Í¹»
    IAP_READ();                           //ËÍ×Ö½Ú¶ÁÃüÁÃüÁî²»Ðè¸Ä±äʱ£¬²»ÐèÖØÐÂËÍÃüÁî
    do
    {
      IAP_ADDRE = (u8)(EE_address >> 16); //Ë͵ØÖ·¸ß×Ö½Ú£¨µØÖ·ÐèÒª¸Ä±äʱ²ÅÐèÖØÐÂË͵ØÖ·£©
      IAP_ADDRH = (u8)(EE_address >> 8);//Ë͵ØÖ·ÖÐ×Ö½Ú£¨µØÖ·ÐèÒª¸Ä±äʱ²ÅÐèÖØÐÂË͵ØÖ·£©
      IAP_ADDRL = (u8)EE_address;         //Ë͵ØÖ·µÍ×Ö½Ú£¨µØÖ·ÐèÒª¸Ä±äʱ²ÅÐèÖØÐÂË͵ØÖ·£©
      EEPROM_Trig();                         //´¥·¢EEPROM²Ù×÷
/////////////////////////////////////////////////////////////////////////
      while(CMD_FAIL)
                                {P0=0x66;
                                }
                        //////////////////////////////////////////////////////////////////////////////                       
                        *DataAddress = IAP_DATA;            //¶Á³öµÄÊý¾ÝËÍÍù
      EE_address++;
      DataAddress++;
    }while(--length);

    DisableEEPROM();
}

       

ercircle 发表于 2025-5-28 16:20:15

具体调试遇到什么错误?
addr未初始化
IAP方式访问EEPROM,地址从0开始

zjyao 发表于 2025-5-28 16:45:02

ercircle 发表于 2025-5-28 16:20
具体调试遇到什么错误?
addr未初始化
IAP方式访问EEPROM,地址从0开始

我用串口读写EEPROM列子改写,addr我给个初值oxfc00或0,EEPROM设1k;读EEPROM子程序加检查EEPROM错误标志位       while(CMD_FAIL)
                                {P0=0x66;}写进芯片运行看P0口状态
                               

ercircle 发表于 2025-5-28 17:00:18

zjyao 发表于 2025-5-28 16:45
我用串口读写EEPROM列子改写,addr我给个初值oxfc00或0,EEPROM设1k;读EEPROM子程序加检查EEPROM错误标 ...

直接跑例程源码是否正常?为什么要这么测呢?

8bit还是32bit?

addr由0开始,CMD_FAIL看下定义,32bit是位操作,8bit下是宏定义常量while必进
#define CMD_FAIL                0x10

另外这个CMD_FAIL函数开始前用代码清零

zjyao 发表于 2025-5-28 17:47:28

ercircle 发表于 2025-5-28 17:00
直接跑例程源码是否正常?为什么要这么测呢?

8bit还是32bit?


我用8位;是用8051i替换8052rc改一下产品,现除EEPROM读写有问题,直接跑例程源码我没串口测试,cmd_FALL是IAP_CONTR的一位,检测前已清零。谁能给个8051i读写EEPROM的例子。

ercircle 发表于 2025-5-28 17:50:49

认真看下上面回复, 8bit测试你的代码有问题死循环了。
8bit语法:IAP_CONTR & CMD_FAIL 检测CMD_FAIL位

读写例程参考Ai8051U实验箱例程,直接复用读写函数即可。
https://www.stcaimcu.com/data/do ... -DEMO-CODE-V1.2.zip

zjyao 发表于 2025-5-28 18:21:05

CMD_FAIL是IAP_CONTR寄存器的第4位,在库文件已定义;我就是用Ai8051U实验箱例程,直接用读写函数调试不成功,

ercircle 发表于 2025-5-28 18:26:52

zjyao 发表于 2025-5-28 18:21
CMD_FAIL是IAP_CONTR寄存器的第4位,在库文件已定义;我就是用Ai8051U实验箱例程,直接用读写函数调试不成 ...截图看看你的定义



直接下载例程hex的话,频率和指令模式选了没


zjyao 发表于 2025-5-28 18:40:05

这些都设置了;我还吧IRC频率往低选,40M到6M都试过。

ercircle 发表于 2025-5-28 20:25:27

zjyao 发表于 2025-5-28 18:40
这些都设置了;我还吧IRC频率往低选,40M到6M都试过。

大哥你应该选固定的和代码一致的呀,为什么会试这个~

建议上传使用的工程,并且编译下载操作录屏看看。
页: [1] 2
查看完整版本: AI8051U的EEPROM读写出错怎么解决?