蓝色多瑙河 发表于 2024-12-2 09:53:18

关于AI8H4K32TLCD 中内部EEPROM的问题

本帖最后由 DebugLab 于 2024-12-2 10:00 编辑

在使用关于AI8H4K32TLCD时, 用到写内部EEPROM, 发现写一次并不能成功, 要连续写两三次才可以成功.

代码如下:

char WriteFlash(unsigned char *p,unsigned int addr,unsigned int length)
{
      unsigned int i;

      
   IAP_CONTR=0x80;
         IAP_TPS=12;

//写
for(i=0;i<length;i++)
{

         IAP_CMD=EEPROM_WRITE;      
         IAP_ADDRL=      (unsigned char)(addr%256);               
         IAP_ADDRH=      (unsigned char)(addr/256);
                        
               
               IAP_DATA = *p;
      
               IAP_TRIG=0x5a;
               IAP_TRIG=0xa5;
   _nop_();               
   _nop_();                        
   _nop_();      
   _nop_();                        
         p++;
               addr++;


   }


         IAP_CONTR=0x00;
         IAP_CMD=EEPROM_NOP;
         IAP_TRIG=0;         
         IAP_ADDRL=      0x00;                        
         IAP_ADDRH=      0x80;
   return 1;
}

在主程序中调用WriteFlash(unsigned char *p,unsigned int addr,unsigned int length)不能写入数据, 当连续调用3次就可以.

DebugLab 发表于 2024-12-2 10:21:37

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();
}

页: [1]
查看完整版本: 关于AI8H4K32TLCD 中内部EEPROM的问题