[STC单片机] STC12C5608AD 读写 EEPROM 有问题 也不知道啥原因 用的是范蠡 一直ERROR

[复制链接]
211|1
 楼主 | 2019-8-21 10:13 | 显示全部楼层 |阅读模式
  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ---------------------------------------------*/
  3. /* --- STC12C56xx Series MCU ISP/IAP/EEPROM Demo -------------------*/
  4. /* --- Mobile: (86)13922805190 -------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/
  7. /* --- Web: www.STCMCU.com -----------------------------------------*/
  8. /* --- Web: www.GXWMCU.com -----------------------------------------*/
  9. /* If you want to use the program or the program referenced in the  */
  10. /* article, please specify in which data and procedures from STC    */
  11. /*------------------------------------------------------------------*/

  12. //#include "reg51.h"
  13. #include "intrins.h"
  14. #include        "STC5404AD.h"


  15. typedef unsigned char BYTE;
  16. typedef unsigned int WORD;

  17. /*Declare SFR associated with the IAP */
  18. sfr IAP_DATA    =   0xE2;           //Flash data register
  19. sfr IAP_ADDRH   =   0xE3;           //Flash address HIGH
  20. sfr IAP_ADDRL   =   0xE4;           //Flash address LOW
  21. sfr IAP_CMD     =   0xE5;           //Flash command register
  22. sfr IAP_TRIG    =   0xE6;           //Flash command trigger
  23. sfr IAP_CONTR   =   0xE7;           //Flash control register

  24. /*Define ISP/IAP/EEPROM command*/
  25. #define CMD_IDLE    0               //Stand-By
  26. #define CMD_READ    1               //Byte-Read
  27. #define CMD_PROGRAM 2               //Byte-Program
  28. #define CMD_ERASE   3               //Sector-Erase

  29. /*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/
  30. //#define ENABLE_IAP 0x80           //if SYSCLK<30MHz
  31. //#define ENABLE_IAP 0x81           //if SYSCLK<24MHz
  32. //#define ENABLE_IAP  0x82            //if SYSCLK<20MHz
  33. #define ENABLE_IAP 0x83           //if SYSCLK<12MHz
  34. //#define ENABLE_IAP 0x84           //if SYSCLK<6MHz
  35. //#define ENABLE_IAP 0x85           //if SYSCLK<3MHz
  36. //#define ENABLE_IAP 0x86           //if SYSCLK<2MHz
  37. //#define ENABLE_IAP 0x87           //if SYSCLK<1MHz

  38. //Start address for STC12C56xx EEPROM
  39. #define IAP_ADDRESS 0x0200

  40. void Delay(BYTE n);
  41. void IapIdle();
  42. BYTE IapReadByte(WORD addr);
  43. void IapProgramByte(WORD addr, BYTE dat);
  44. void IapEraseSector(WORD addr);

  45. void main()
  46. {
  47.     WORD i;

  48.         P3M0      = 0x84;
  49.         P3M1      = 0x3B;
  50.         P2M0      = 0xC1;
  51.         P2M1      = 0x3E;
  52.         P1M0      = 0xDF;
  53.         P1M1      = 0x20;
  54.         P0M0      = 0x0D;
  55.         P0M1      = 0x02;       
  56.           EA=0;
  57.     P2 = 0x00;                      //1111,1110 System Reset OK
  58.     Delay(10);                      //Delay
  59.     IapEraseSector(IAP_ADDRESS);    //Erase current sector
  60.     for (i=0; i<512; i++)           //Check whether all sector data is FF
  61.     {
  62.         if (IapReadByte(IAP_ADDRESS+i) != 0xFF)
  63.             goto Error;             //If error, break
  64.     }
  65.                 #if 0
  66.     //P1 = 0xfc;                      //1111,1100 Erase successful
  67.     Delay(10);                      //Delay
  68.     for (i=0; i<512; i++)           //Program 512 bytes data into data flash
  69.     {
  70.         IapProgramByte(IAP_ADDRESS+i, (BYTE)i);
  71.     }
  72.     //P1 = 0xf8;                      //1111,1000 Program successful
  73.     Delay(10);                      //Delay
  74.     for (i=0; i<512; i++)           //Verify 512 bytes data
  75.     {
  76.         if (IapReadByte(IAP_ADDRESS+i) != (BYTE)i)
  77.             goto Error;             //If error, break
  78.     }
  79.     //P1 = 0xf0;                      //1111,0000 Verify successful
  80.     while (1);
  81.                 #endif
  82. Error:
  83.                 P2 =0x20;
  84.     //P1 &= 0x7f;                     //0xxx,xxxx IAP operation fail
  85.     while (1);
  86. }

  87. /*----------------------------
  88. Software delay function
  89. ----------------------------*/
  90. void Delay(BYTE n)
  91. {
  92.     WORD x;

  93.     while (n--)
  94.     {
  95.         x = 0;
  96.         while (++x);
  97.     }
  98. }

  99. /*----------------------------
  100. Disable ISP/IAP/EEPROM function
  101. Make MCU in a safe state
  102. ----------------------------*/
  103. void IapIdle()
  104. {
  105.     IAP_CONTR = 0;                  //Close IAP function
  106.     IAP_CMD = 0;                    //Clear command to standby
  107.     IAP_TRIG = 0;                   //Clear trigger register
  108.     IAP_ADDRH = 0x80;               //Data ptr point to non-EEPROM area
  109.     IAP_ADDRL = 0;                  //Clear IAP address to prevent misuse
  110. }

  111. /*----------------------------
  112. Read one byte from ISP/IAP/EEPROM area
  113. Input: addr (ISP/IAP/EEPROM address)
  114. Output:Flash data
  115. ----------------------------*/
  116. BYTE IapReadByte(WORD addr)
  117. {
  118.     BYTE dat;                       //Data buffer

  119.     IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
  120.     IAP_CMD = CMD_READ;             //Set ISP/IAP/EEPROM READ command
  121.     IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  122.     IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
  123.     IAP_TRIG = 0x46;                //Send trigger command1 (0x46)
  124.     IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)
  125.     _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
  126.     dat = IAP_DATA;                 //Read ISP/IAP/EEPROM data
  127.     IapIdle();                      //Close ISP/IAP/EEPROM function

  128.     return dat;                     //Return Flash data
  129. }

  130. /*----------------------------
  131. Program one byte to ISP/IAP/EEPROM area
  132. Input: addr (ISP/IAP/EEPROM address)
  133.        dat (ISP/IAP/EEPROM data)
  134. Output:-
  135. ----------------------------*/
  136. void IapProgramByte(WORD addr, BYTE dat)
  137. {
  138.     IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
  139.     IAP_CMD = CMD_PROGRAM;          //Set ISP/IAP/EEPROM PROGRAM command
  140.     IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  141.     IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
  142.     IAP_DATA = dat;                 //Write ISP/IAP/EEPROM data
  143.     IAP_TRIG = 0x46;                //Send trigger command1 (0x46)
  144.     IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)
  145.     _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
  146.     IapIdle();
  147. }

  148. /*----------------------------
  149. Erase one sector area
  150. Input: addr (ISP/IAP/EEPROM address)
  151. Output:-
  152. ----------------------------*/
  153. void IapEraseSector(WORD addr)
  154. {
  155.     IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
  156.     IAP_CMD = CMD_ERASE;            //Set ISP/IAP/EEPROM ERASE command
  157.     IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  158.     IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
  159.     IAP_TRIG = 0x46;                //Send trigger command1 (0x46)
  160.     IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)
  161.     _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
  162.     IapIdle();
  163. }

复制代码

使用特权

评论回复
 楼主 | 2019-8-21 10:15 | 显示全部楼层
isp  设置如下
QQ截图20190821101421.png

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /3 下一条

在线客服 快速回复 返回顶部 返回列表