关于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次就可以.
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]