找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1582|回复: 2
收起左侧

STC15系列单片机的内部EEPROM使用问题

[复制链接]
ID:708768 发表于 2021-6-23 14:01 | 显示全部楼层 |阅读模式
芯片是stc15W4K56S4,在加入eeprom相关程序后,期望存储数据,但实际情况是,外部修改的数据在电路板掉电后,再次接电源时,修改的数据并没有保存,不确定是函数的问题,还是数据根本没有写进去,请求解答,有涉及到EEPROM的部分单片机程序如下:
  1. #include <intrins.h>
  2. #include        "STC15Fxxxx.H"

  3. #define MAIN_Fosc                24000000UL        
  4. #define LcmXPixel 128
  5. #define LcmYPixel 64
  6. #define MIN(A,B) ((A)<(B)?(A):(B))
  7. #define Uchar unsigned char
  8. #define Uint unsigned int
  9. #define        Timer0_Reload        (MAIN_Fosc / 1000)        
  10.         
  11. #define CMD_IDLE       0
  12. #define CMD_READ       1
  13. #define CMD_PROGRAM    2
  14. #define CMD_ERASE      3
  15. #define MileageAddr    64
  16. #define BLaddr         1024

  17. u16 Buf[12][3]={{5,1,1},{5,3,1},{10,3,2},{5,6,2},{10,6,3},{15,4,3}};

  18. Uchar IAPreadbyte(Uint addr);
  19. void IAPprogrambyte(Uint addr , Uchar dat);
  20. void IAPerasesector(Uint addr);
  21. void IAPidle();
  22. void writeDatas(Uint addr , Uchar *pdat , Uchar n);

  23. void writeDatas(Uint addr , Uchar *pdat , Uchar n)
  24. {
  25.         Uchar i;
  26.         IAPerasesector(addr);
  27.         for(i=0;i<n;i++)
  28.         {
  29.                 IAPprogrambyte(addr+i,pdat[i]);
  30.         }
  31. }

  32. void main( void )
  33. {
  34.                 Uchar contrast=30;
  35.                 DelayMS(10);
  36.                 RES = 0;
  37.                 DelayMS(200);
  38.                 RES = 1;
  39.                 DelayMS(50);
  40.                 LcmInit();
  41.                 ds1302_init();
  42.                 ds1302_write_time();
  43.                 P0M1 = 0;        P0M0 = 0;         
  44.                 P1M1 = 0;        P1M0 = 0;         
  45.                 P2M1 = 0;        P2M0 = 0;         
  46.                 P3M1 = 0;        P3M0 = 0;         
  47.                 P4M1 = 0;        P4M0 = 0;         
  48.                 P5M1 = 0;        P5M0 = 0;         
  49.                 P6M1 = 0;        P6M0 = 0;         
  50.                 P7M1 = 0;        P7M0 = 0;         

  51.                 INT_CLKO |= 0x20;  
  52.                 display_index = 0;
  53.                 AUXR |= 0x80;        
  54.                 TMOD &= 0xF0;               
  55.                 TL0 = 0x00;//        TH0 = (u8)(Timer0_Reload / 256);
  56.                 TH0 = 0xDC;//        TL0 = (u8)(Timer0_Reload % 256);
  57.                 ET0 = 1;        //Timer0 interrupt enable
  58.                 TR0 = 1;        //Timer0 run
  59.                 EA = 1;               
  60.                 TF0 = 0;

  61.                 Buf[select_2-2][0]=IAPreadbyte(0x0000);

  62.                 while(1)
  63.         {        
  64.                 if(pagenum==21)
  65.                          {
  66.                  LcmPutStr(0,0,"________________");                          
  67.                                  
  68.                  LcmPutNum(7,4,Buf[select_2-2][1]);//LcmPutStr(100,4,"h");
  69.                  LcmPutNum(43,4,Buf[select_2-2][0]);//LcmPutStr(50,4,"ml");
  70.                  LcmPutNum(84,4,Buf[select_2-2][2]);//LcmPutStr(50,4,"d");                                 
  71.                                          
  72.                                  if(select_21==1){LcmPutStr(10,0,">");LcmPutStr(10,4," ");        LcmPutStr(45,4," ");LcmPutStr(87,4," ");LcmPutStr(30,6," ");}        
  73.                                  if(select_21==2){LcmPutStr(10,4,">");LcmPutStr(10,0," ");LcmPutStr(45,4," ");        LcmPutStr(87,4," ");LcmPutStr(30,6," ");}        //
  74.                                  if(select_21==3){LcmPutStr(45,4,">");LcmPutStr(10,0," ");LcmPutStr(10,4," ");        LcmPutStr(87,4," ");LcmPutStr(30,6," ");}        //
  75.                                  if(select_21==4){LcmPutStr(87,4,">");LcmPutStr(10,0," ");LcmPutStr(10,4," ");        LcmPutStr(45,4," ");LcmPutStr(30,6," ");}        //                                

  76.                  if(B2PressOnce==1)
  77.                                  {
  78.                     B2PressOnce=0;
  79.                      if(select_21==2){if(Buf[select_2-2][1]<24){Buf[select_2-2][1]++; }else{Buf[select_2-2][1]=0;}}
  80.                      if(select_21==3){if(Buf[select_2-2][0]<15){Buf[select_2-2][0]++; }else{Buf[select_2-2][0]=0;}}
  81.                              if(select_21==4){if(Buf[select_2-2][2]<10){Buf[select_2-2][2]++; }else{Buf[select_2-2][2]=0;}}
  82.                  }        
  83.                  if(B3PressOnce==1)
  84.                  {
  85.                     B3PressOnce=0;
  86.                      if(select_21==1)   {select_21=2;}
  87.                      else if(select_21==2){select_21=3;}
  88.                              else if(select_21==3){select_21=4;}
  89.                              else if(select_21==4){select_21=1;}                                         
  90.                  }                                         
  91.                  if(B4PressOnce==1)
  92.                          {
  93.                     B4PressOnce=0;
  94.                     if(select_21==1){pagenum=2;LcmClear(0x00);}
  95.                     else {pagenum=3;LcmClear(0x00);}
  96.                   }                                       
  97.                                  writeDatas(0x0000,&Buf[select_2-2][0],4);
  98.                        }
  99.                    }
  100. }
  101. void IAPidle(void)
  102. {
  103.         IAP_CONTR = 0;                        
  104.         IAP_CMD   = 0;                        
  105.         IAP_TRIG  = 0;                        
  106.         IAP_ADDRH = 0x80;               
  107.         IAP_ADDRL = 0;               
  108. }
  109. Uchar IAPreadbyte(Uint addr)
  110. {
  111.         Uchar dat;
  112.         IAP_CONTR = 0x83;
  113.         IAP_CMD   = CMD_READ;
  114.         IAP_ADDRL = addr;
  115.         IAP_ADDRH = addr>>8;
  116.         IAP_TRIG  = 0x5A;
  117.   IAP_TRIG  = 0xA5;
  118.         _nop_();
  119.         dat = IAP_DATA;
  120.         IAPidle();
  121.   return dat;
  122. }
  123. void IAPerasesector(Uint addr)
  124. {
  125.         IAP_CONTR  = 0x83;
  126.         IAP_CMD     = CMD_ERASE;
  127.         IAP_ADDRL   = addr;
  128.         IAP_ADDRH   = addr>>8;
  129.         IAP_TRIG    = 0x5A;
  130.         IAP_TRIG    = 0xA5;
  131.         _nop_();
  132.         IAPidle();
  133. }
  134. void IAPprogrambyte(Uint addr , Uchar dat)
  135. {
  136.   IAP_CONTR   = 0x83;
  137.         IAP_CMD     = CMD_PROGRAM;
  138.         IAP_ADDRL   = addr;
  139.         IAP_ADDRH   = addr>>8;
  140.         IAP_DATA    = dat;
  141.         IAP_TRIG    = 0x5A;
  142.         IAP_TRIG    = 0xA5;
  143.         _nop_();
  144.         IAPidle();
  145. }
复制代码
回复

使用道具 举报

ID:123289 发表于 2021-6-23 16:08 | 显示全部楼层
1、先证明数据的确写入EEPROM了。证明方式,回读EEPROM中的数据。
2、保证接电后,至读取数据之前这段时间内,未对EEPROM做过擦除动作。
回复

使用道具 举报

ID:362076 发表于 2021-6-27 15:14 | 显示全部楼层
你定义的MAIN_Fosc是24M,按照手册所述,IAP_CONTR寄存器的低三位WT2/WT1/WT0应当为0/0/1,即IAP_CONTR应该赋值为0x81而不是当前使用的0x83,问题会不会是这个原因造成的呢?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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