关于STC单片机IAP不能正确读取问题求各位指教!!!

[复制链接]
2219|2
 楼主| 唯Lose 发表于 2018-8-17 11:57 | 显示全部楼层 |阅读模式
我用的单片机型号是STC8a8k64s4a12,然后哟个功能用到EEPROM就根据文档提供的示例程序写了个测试代码,首先首先读取某个地址的值打印出来,然后再擦除通过串口打印这个地址的值竟然是00,后面我又写入了一个值到该地址读取该地址的值打印出来是我写入的,但我断电后重新读该地址打印出来的值竟然是00,实验了很多遍根本无法保存我代码如下请各位指正!!
  1. void Delay7us()                //@11.0592MHz
  2. {
  3.         unsigned char i;

  4.         _nop_();
  5.         _nop_();
  6.         _nop_();
  7.         i = 16;
  8.         while (--i);
  9. }

  10. void Delay5ms()                //@11.0592MHz
  11. {
  12.         unsigned char i, j;

  13.         i = 54;
  14.         j = 199;
  15.         do
  16.         {
  17.                 while (--j);
  18.         } while (--i);
  19. }

  20. void Delay500ms()                //@11.0592MHz
  21. {
  22.         unsigned char i, j, k;

  23.         _nop_();
  24.         _nop_();
  25.         i = 22;
  26.         j = 3;
  27.         k = 227;
  28.         do
  29.         {
  30.                 do
  31.                 {
  32.                         while (--k);
  33.                 } while (--j);
  34.         } while (--i);
  35. }


  36. void UartInit()
  37. {
  38.     SCON = 0x5a;
  39.     T2L = BRT;
  40.     T2H = BRT >> 8;
  41.     AUXR = 0x15;
  42. }

  43. void UartSend(char dat)
  44. {
  45.     while (!TI);
  46.     TI = 0;
  47.     SBUF = dat;
  48. }

  49. void IapIdle()
  50. {
  51.     IAP_CONTR = 0;                              //关闭IAP功能
  52.     IAP_CMD = 0;                                //清除命令寄存器
  53.     IAP_TRIG = 0;                               //清除触发寄存器
  54.     IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
  55.     IAP_ADDRL = 0;
  56. }

  57. char IapRead(int addr)
  58. {
  59.     char dat;

  60.     IAP_CONTR = WT_20M;                         //使能IAP
  61.     IAP_CMD = 1;                                //设置IAP读命令
  62.     IAP_ADDRL = addr;                           //设置IAP低地址
  63.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  64.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  65.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  66.     _nop_();
  67.     dat = IAP_DATA;                             //读IAP数据
  68.     IapIdle();                                  //关闭IAP功能

  69.     return dat;
  70. }

  71. void IapProgram(int addr, char dat)
  72. {
  73.     IAP_CONTR = WT_20M;                         //使能IAP
  74.     IAP_CMD = 2;                                //设置IAP写命令
  75.     IAP_ADDRL = addr;                           //设置IAP低地址
  76.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  77.     IAP_DATA = dat;                             //写IAP数据
  78.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  79.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  80.     _nop_();
  81.     IapIdle();                                  //关闭IAP功能
  82. }

  83. void IapErase(int addr)
  84. {
  85.     IAP_CONTR = WT_20M;                         //使能IAP
  86.     IAP_CMD = 3;                                //设置IAP擦除命令
  87.     IAP_ADDRL = addr;                           //设置IAP低地址
  88.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  89.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  90.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  91.     _nop_();                                    //
  92.     IapIdle();                                  //关闭IAP功能
  93. }

  94. void main()
  95. {
  96.        
  97.           char i;
  98.     UartInit();

  99.           for(i=0;i<5;i++)
  100.         {
  101.           Delay500ms();       
  102.         }
  103.           UartSend(IapRead(0x0400));
  104.        
  105.           IapErase(0x0400);
  106.           Delay5ms();
  107.     UartSend(IapRead(0x0400));
  108.        
  109.     IapProgram(0x0400, 0x12);
  110.           Delay7us();
  111.     UartSend(IapRead(0x0400));

  112.     while (1);
  113. }
airwill 发表于 2018-8-19 08:15 | 显示全部楼层
是不是因为加密而封锁了读总线. 这个可能需要咨询芯片厂商了
ycf119 发表于 2018-8-20 13:54 | 显示全部楼层
ISP软件了设置的EEPROM大小是不是小于0x400??
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

11

帖子

1

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