找回密码
 立即注册
查看: 276|回复: 1

8H8K64U的EEPROM可以写入地址,但是掉电插拔后值丢失

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-04-20 10:10:44
已绑定手机

1

主题

0

回帖

85

积分

注册会员

积分
85
发表于 2025-2-16 18:00:18 | 显示全部楼层 |阅读模式
这是我的EEPROM设置,招贴后看了大神们说尝试了增加TRIG,并且再执行IAP_TRIG前关闭总中断,都尝试了之后还是在重新插拔usb后值丢失
  1. //清除寄存器指令
  2. void Iapclearcommand()
  3. {
  4.                 IAP_CONTR = 0;
  5.                 IAP_CMD         = 0;
  6.                 IAP_TRIG  = 0;
  7.                 IAP_ADDRH = 0X80;
  8.                 IAP_ADDRL = 0;
  9. }
  10. //读操作
  11. char Iapread(int address)
  12. {
  13.                 char dat = 0;
  14.                 IAP_CONTR = 0x80;
  15.                 IAP_TPS = 24;
  16.                 IAP_CMD = 1;
  17.                 IAP_ADDRL = address;
  18.                 IAP_ADDRH = address >> 8;
  19.                 //EA = 0;
  20.                 IAP_TRIG  = 0X5A;
  21.                 IAP_TRIG  = 0XA5;
  22.                 IAP_TRIG  = 0X5A;
  23.                 IAP_TRIG  = 0XA5;
  24.                 //EA = 1;
  25.                 dat = IAP_DATA;
  26.                 Iapclearcommand();
  27.         
  28.                 return dat;
  29. }
  30. //写操作
  31. void Iapwrite(int addr , char dat)
  32. {
  33.                
  34.                 IAP_CONTR = 0X80;
  35.                 IAP_TPS   = 24;
  36.                 IAP_CMD         = 2;
  37.                 IAP_ADDRL = addr;
  38.                 IAP_ADDRH = addr >> 8;
  39.                 IAP_DATA        = dat;
  40.                 //EA = 0;
  41.                 IAP_TRIG         = 0X5A;
  42.                 IAP_TRIG         = 0XA5;
  43.                 IAP_TRIG  = 0X5A;
  44.                 IAP_TRIG  = 0XA5;
  45.                 //EA = 1;
  46.                 Iapclearcommand();
  47. }
  48. //擦除操作
  49. void IapErase(int addr)
  50. {
  51.                  IAP_CONTR = 0X80;
  52.                  IAP_TPS          = 24;
  53.                  IAP_CMD         = 3;
  54.                  IAP_ADDRL = addr;
  55.                  IAP_ADDRH = addr >> 8;
  56.                         EA = 0;
  57.                  IAP_TRIG  = 0X5A;
  58.                  IAP_TRIG  = 0XA5;
  59.                   
  60.                         EA = 1;
  61.                  Iapclearcommand();
  62. }
复制代码
下面的是我用usb hound捕捉的输入报告


截图202502161750402996.jpg
上面的后两位是对应不同扇区的两个eeprom地址的值,再官方的上位机我设置的是FF
在我自己做的上位机可以改变对应存储的eeprom地址的值,再usb hound中也会显示出来
截图202502161755505021.jpg 截图202502161756244111.jpg
这是我的stc8h下位机部分代码,是在收到对应上位机的按钮时执行的 操作,通过bus hound可以看到已经更改了对应的值,为什么在重新上电之后,对应eeprom地址的值就回到默认的0xff了呢?
  1. switch (command)
  2.                                         {
  3.                                                 case 0x31 :
  4.                                                         usb_write_reg(OUTCSR1, 0);
  5.                                                         eepmin = UsbOutBuffer[1];
  6.               //mindrive = (float)eepmin / 100 ;
  7.                                                         IapErase(0x20);
  8.                                                         Iapwrite(0x20 ,eepmin);
  9.                                                         break;
  10.                                                 
  11.                                                 case 0x32:
  12.                                                         usb_write_reg(OUTCSR1, 0);
  13.                                                         eepmax = UsbOutBuffer[1];
  14.                                                         //
  15.                                                         IapErase(0x02C8);
  16.                                                         Iapwrite(0x02C8 ,eepmax);
  17.               //maxdrive = (float)UsbOutBuffer[1] / 100;  
  18.                                                         
  19.                                                         break;
  20.                                                                
  21.                                                 default:
  22.                                                         break;
  23.                                         }
复制代码

求各位大神指点小弟!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-2-16 22:41:03 | 显示全部楼层
  1. #include <absacc.h>
  2. #define                IAP_TPS_        24                //等待参数
  3. #define                IAP_OFFSET        0xFE00        //EEPROM地址
  4. void Iap_Idle(void)
  5. {
  6.         IAP_CONTR&=~IAPEN;
  7.         IAP_CMD=IAP_IDL;
  8.         IAP_TRIG=0x00;
  9.         IAP_ADDRH=0x80;
  10.         IAP_ADDRL=0x00;
  11. }
  12. unsigned char Iap_Read_Byte(unsigned char sector,unsigned int addr)
  13. {
  14.         return *(CBYTE+IAP_OFFSET+sector*0x0200+addr);
  15. }
  16. //unsigned char Iap_Read_Byte(unsigned char sector,unsigned int addr)
  17. //{
  18. //        unsigned char dat;
  19. //        unsigned int add;
  20. //        add=sector*0x0200+addr;
  21. //        IAP_CONTR|=IAPEN;
  22. //        IAP_TPS=IAP_TPS_;
  23. //        IAP_CMD=IAP_READ;
  24. //        IAP_ADDRL=add;
  25. //        IAP_ADDRH=add>>8;
  26. //        IAP_TRIG=0x5A;
  27. //        IAP_TRIG=0xA5;
  28. //        _nop_();
  29. //        dat=IAP_DATA;
  30. //        Iap_Idle();
  31. //        return dat;
  32. //}
  33. void Iap_Program_Byte(unsigned char sector,unsigned int addr,unsigned char dat)
  34. {
  35.         unsigned int add;
  36.         add=sector*0x0200+addr;
  37.         IAP_CONTR|=IAPEN;
  38.         IAP_TPS=IAP_TPS_;
  39.         IAP_CMD=IAP_WRITE;
  40.         IAP_ADDRL=add;
  41.         IAP_ADDRH=add>>8;
  42.         IAP_DATA=dat;
  43.         IAP_TRIG=0x5A;
  44.         IAP_TRIG=0xA5;
  45.         _nop_();
  46.         Iap_Idle();
  47. }
  48. void Iap_Erase_Sector(unsigned char sector)
  49. {
  50.         unsigned int add;
  51.         add=sector*0x0200;
  52.         IAP_CONTR|=IAPEN;
  53.         IAP_TPS=IAP_TPS_;
  54.         IAP_CMD=IAP_ERASE;
  55.         IAP_ADDRL=add;
  56.         IAP_ADDRH=add>>8;
  57.         IAP_TRIG=0x5A;
  58.         IAP_TRIG=0xA5;
  59.         _nop_();
  60.         Iap_Idle();
  61. }
复制代码


DebugLab
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 06:49 , Processed in 0.151614 second(s), 56 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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