[STC单片机] 关于STC8a8s64k4a12eeprom地址数据无法正确读取的问题,请各位指教!

[复制链接]
 楼主| 唯Lose 发表于 2018-8-17 15:33 | 显示全部楼层 |阅读模式
我用的单片机型号是STC8a8k64s4a12,然后有个功能用到EEPROM就根据ISP上的范例程序写了个测试代码,首先首先读取某个地址的值打印出来,然后再擦除通过串口打印这个地址的值竟然是00,后面我又写入了一个值到该地址读取该地址的值打印出来是我写入的,但我断电后重新读该地址打印出来的值竟然还是00,实验了很多遍数据根本无法保存,我代码如下请各位指正!!
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define FOSC            11059200UL
  4. #define BRT             (65536 - FOSC / 19200 / 4)

  5. sfr     AUXR        =   0x8e;
  6. sfr     T2H         =   0xd6;
  7. sfr     T2L         =   0xd7;

  8. sfr     IAP_DATA    =   0xC2;
  9. sfr     IAP_ADDRH   =   0xC3;
  10. sfr     IAP_ADDRL   =   0xC4;
  11. sfr     IAP_CMD     =   0xC5;
  12. sfr     IAP_TRIG    =   0xC6;
  13. sfr     IAP_CONTR   =   0xC7;

  14. #define WT_30M          0x80
  15. #define WT_24M          0x81
  16. #define WT_20M          0x82
  17. #define WT_12M          0x83
  18. #define WT_6M           0x84
  19. #define WT_3M           0x85
  20. #define WT_2M           0x86
  21. #define WT_1M           0x87


  22. void Delay7us()                //@11.0592MHz
  23. {
  24.         unsigned char i;

  25.         _nop_();
  26.         _nop_();
  27.         _nop_();
  28.         i = 16;
  29.         while (--i);
  30. }

  31. void Delay5ms()                //@11.0592MHz
  32. {
  33.         unsigned char i, j;

  34.         i = 54;
  35.         j = 199;
  36.         do
  37.         {
  38.                 while (--j);
  39.         } while (--i);
  40. }

  41. void Delay500ms()                //@11.0592MHz
  42. {
  43.         unsigned char i, j, k;

  44.         _nop_();
  45.         _nop_();
  46.         i = 22;
  47.         j = 3;
  48.         k = 227;
  49.         do
  50.         {
  51.                 do
  52.                 {
  53.                         while (--k);
  54.                 } while (--j);
  55.         } while (--i);
  56. }


  57. void UartInit()
  58. {
  59.     SCON = 0x5a;
  60.     T2L = BRT;
  61.     T2H = BRT >> 8;
  62.     AUXR = 0x15;
  63. }

  64. void UartSend(char dat)
  65. {
  66.     while (!TI);
  67.     TI = 0;
  68.     SBUF = dat;
  69. }

  70. void IapIdle()
  71. {
  72.     IAP_CONTR = 0;                              //关闭IAP功能
  73.     IAP_CMD = 0;                                //清除命令寄存器
  74.     IAP_TRIG = 0;                               //清除触发寄存器
  75.     IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
  76.     IAP_ADDRL = 0;
  77. }

  78. char IapRead(int addr)
  79. {
  80.     char dat;

  81.     IAP_CONTR = WT_20M;                         //使能IAP
  82.     IAP_CMD = 1;                                //设置IAP读命令
  83.     IAP_ADDRL = addr;                           //设置IAP低地址
  84.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  85.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  86.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  87.     _nop_();
  88.     dat = IAP_DATA;                             //读IAP数据
  89.     IapIdle();                                  //关闭IAP功能

  90.     return dat;
  91. }

  92. void IapProgram(int addr, char dat)
  93. {
  94.     IAP_CONTR = WT_20M;                         //使能IAP
  95.     IAP_CMD = 2;                                //设置IAP写命令
  96.     IAP_ADDRL = addr;                           //设置IAP低地址
  97.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  98.     IAP_DATA = dat;                             //写IAP数据
  99.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  100.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  101.     _nop_();
  102.     IapIdle();                                  //关闭IAP功能
  103. }

  104. void IapErase(int addr)
  105. {
  106.     IAP_CONTR = WT_20M;                         //使能IAP
  107.     IAP_CMD = 3;                                //设置IAP擦除命令
  108.     IAP_ADDRL = addr;                           //设置IAP低地址
  109.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  110.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  111.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  112.     _nop_();                                    //
  113.     IapIdle();                                  //关闭IAP功能
  114. }

  115. void main()
  116. {
  117.         
  118.           char i;
  119.     UartInit();

  120.           for(i=0;i<5;i++)
  121.         {
  122.           Delay500ms();        
  123.         }
  124.           UartSend(IapRead(0x0400));
  125.         
  126.           IapErase(0x0400);
  127.           Delay5ms();
  128.     UartSend(IapRead(0x0400));
  129.         
  130.     IapProgram(0x0400, 0x12);
  131.           Delay7us();
  132.     UartSend(IapRead(0x0400));

  133.     while (1);
  134. }
 楼主| 唯Lose 发表于 2018-8-17 15:37 | 显示全部楼层
烧写了一次程序,然后反复断电测试通过串口打印的信息如下还请各位坛友指点下有哪些地方不对,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
liang030704 发表于 2018-8-18 09:13 | 显示全部楼层
我用STC8F2K08S2也是差不多,写进去,当时读可以,断电再读出来就不对,搞了很多天,实在不行了。放气了,外加一片24C02吧
sanzi666 发表于 2018-8-18 09:52 | 显示全部楼层
STC有没有SOP8  带AD的型号啊,
wcheng13 发表于 2018-8-18 13:53 | 显示全部楼层
sanzi666 发表于 2018-8-18 09:52
STC有没有SOP8  带AD的型号啊,

目前 据我所知好像没有
 楼主| 唯Lose 发表于 2018-8-20 09:19 | 显示全部楼层
liang030704 发表于 2018-8-18 09:13
我用STC8F2K08S2也是差不多,写进去,当时读可以,断电再读出来就不对,搞了很多天,实在不行了。放气了, ...

也考虑过这个方案哦,但有重新布板觉得太麻烦了现在看原厂怎么解决哦
xurexi 发表于 2018-8-21 15:31 | 显示全部楼层
本帖最后由 xurexi 于 2018-8-21 15:33 编辑

我用STC8F2K64S4正常,对于STC8F2K08,最大就4K的EEPROM,地址0x4000,超出4K地址了啊!换成0X0000试试!
coody 发表于 2018-8-21 20:23 | 显示全部楼层
楼主,注意下载时,硬件选项中的“设置用户EEPROM大小”要选择你需要的EEPROM大小值,否则会访问不成功的。
 楼主| 唯Lose 发表于 2018-8-22 10:48 | 显示全部楼层
xurexi 发表于 2018-8-21 15:31
我用STC8F2K64S4正常,对于STC8F2K08,最大就4K的EEPROM,地址0x4000,超出4K地址了啊!换成0X0000试试! ...

解决了是下载配置的问题,把地址改成0x0000就可以了!

评论

[url=home.php?mod=space&uid=3371634]@2257762774[/url] :stc-isp软件里有例程,你先用那个试试  发表于 2022-8-11 14:10
楼主,你还记得这个程序吗,我现在写进去他读不出来,你知道是什么问题吗  发表于 2022-8-9 16:22
我一开始用0x0400和0x0200 都不行。  发表于 2018-9-20 07:44
我也遇到相同问题。根据你的建议 ,问题解决了。但是还不知道为什么 必须改为0x0000。能不能详细说说呢?  发表于 2018-9-20 07:41
 楼主| 唯Lose 发表于 2018-8-22 10:48 | 显示全部楼层
本帖最后由 唯Lose 于 2018-8-22 10:57 编辑
coody 发表于 2018-8-21 20:23
楼主,注意下载时,硬件选项中的“设置用户EEPROM大小”要选择你需要的EEPROM大小值,否则会访问不成功的。 ...

谢谢解决了!附加EEPROM配置选项,如下图!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
liang030704 发表于 2018-8-27 20:00 | 显示全部楼层
你这是什么版本的STC工具,我的工具上没有“设置用户EEPROM大小”选项呀?
kissdb 发表于 2018-8-31 16:56 | 显示全部楼层
liang030704 发表于 2018-8-27 20:00
你这是什么版本的STC工具,我的工具上没有“设置用户EEPROM大小”选项呀?

这个是根据单片机型号来显示的,支持调节的会显示
bd3vz 发表于 2019-2-25 09:50 | 显示全部楼层
唯Lose 发表于 2018-8-22 10:48
解决了是下载配置的问题,把地址改成0x0000就可以了!

看着宏晶官方手册折腾2天搞不定,原来是这里的问题,想不通大公司的手册是这么不负责任
djyqz 发表于 2019-7-29 17:00 | 显示全部楼层
bd3vz 发表于 2019-2-25 09:50
看着宏晶官方手册折腾2天搞不定,原来是这里的问题,想不通大公司的手册是这么不负责任 ...

是的很不负责任 stc8系列的手册根本没写eeprom的起始地址和结束地址 只是说了句可以当ISP/IAP用,我是从IAP15系列直接跳过来用的结果可想而知,IAP15系列是只要程序后面的flash有空就随便用 我用的是9000h的地址 到了stc8 一看人家说可以当ISP/IAP用 那就接着从9000h的地址开始写呗结果写了一上午哎~~。数据怎么也不对。接着看手册 15的手册里关于eeprom的写的比较明白,再看烧录程序默认设置0.5keeprom ,起始地址0x0000h。心里一万头cnm奔过。合着就512字节能用地址还是从0000-01ff,9000的地址当然啥也没有,不过人家单片机强大不是程序不能执行,而是往01ff里写最后一个字
clavin1977 发表于 2019-8-13 08:58 | 显示全部楼层
djyqz 发表于 2019-7-29 17:00
是的很不负责任 stc8系列的手册根本没写eeprom的起始地址和结束地址 只是说了句可以当ISP/IAP用,我是从I ...

写入之前还要先擦除扇区,才能成功。
zwsam 发表于 2022-8-21 22:17 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

11

帖子

1

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