DebugLab 发表于 2025-5-23 14:39:43

AI8H2K12U EEPROM 程序

#include <absacc.h>
#define                IAP_TPS_      24                //等待参数
#define                IAP_OFFSET      0x2E00      //EEPROM地址

void Iap_Idle(void)
{
      IAP_CONTR&=~IAPEN;
      IAP_CMD=IAP_IDL;
      IAP_TRIG=0x00;
      IAP_ADDRH=0x80;
      IAP_ADDRL=0x00;
}

unsigned char Iap_Read_Byte(unsigned char sector,unsigned int addr)
{
      return *(CBYTE+IAP_OFFSET+sector*0x0200+addr);
}

//unsigned char Iap_Read_Byte(unsigned char sector,unsigned int addr)
//{
//      unsigned char dat;
//      unsigned int add;
//      add=sector*0x0200+addr;
//      IAP_CONTR|=IAPEN;
//      IAP_TPS=IAP_TPS_;
//      IAP_CMD=IAP_READ;
//      IAP_ADDRL=add;
//      IAP_ADDRH=add>>8;
//      IAP_TRIG=0x5A;
//      IAP_TRIG=0xA5;
//      _nop_();
//      dat=IAP_DATA;
//      Iap_Idle();
//      return dat;
//}

void Iap_Program_Byte(unsigned char sector,unsigned int addr,unsigned char dat)
{
      unsigned int add;
      add=sector*0x0200+addr;
      IAP_CONTR|=IAPEN;
      IAP_TPS=IAP_TPS_;
      IAP_CMD=IAP_WRITE;
      IAP_ADDRL=add;
      IAP_ADDRH=add>>8;
      IAP_DATA=dat;
      IAP_TRIG=0x5A;
      IAP_TRIG=0xA5;
      _nop_();
      Iap_Idle();
}

void Iap_Erase_Sector(unsigned char sector)
{
      unsigned int add;
      add=sector*0x0200;
      IAP_CONTR|=IAPEN;
      IAP_TPS=IAP_TPS_;
      IAP_CMD=IAP_ERASE;
      IAP_ADDRL=add;
      IAP_ADDRH=add>>8;
      IAP_TRIG=0x5A;
      IAP_TRIG=0xA5;
      _nop_();
      Iap_Idle();
}

神农鼎 发表于 2025-5-23 21:26:30

烧录时要选择 EEPROM 的大小

_奶咖君_ 发表于 2025-5-24 09:17:58

其实之前有想过直接使用MOVC的方式读取EEPROM的数据,但是目前来看,这种方式不具有普适性。因为EEPROM的大小是可以设置的,而且好像手册中页没有说明可以通过什么寄存器读取这个设置的EEPROM大小或者关于EEPROM的起始位置之类的(如果存在的,记得回来踢我一脚)。。如果调试人员对EEPROM的配置修改了,和程序里面的宏定义不匹配极可能会导致程序出现问题,增加调试成本。。

最后就还是选择了IAP的方式读取EEPROM数据,这样把无论设置EEPROM的大小是多少,只要是够用,就都能正确读取{:wunai:}
页: [1]
查看完整版本: AI8H2K12U EEPROM 程序