本帖最后由 baobao125 于 2021-9-30 13:04 編輯
EEPROM一共5K10個扇區,起始扇區首地址000H,結束扇區末尾地址13FFH。一個扇區512字節。
我按0x0100,0x0200,0x0300,這樣分區只有第一個寫進去后讀取成功了。感覺這樣差不多在兩個分區的交界處左右。按0x0100,0x0300,0x0500,0x0700,這樣分區得話又能讀寫成功,
請教這十個扇區的 地址是怎么分的?
以下是我用的EEPROM擦讀寫程序
if(IapReadByte(0x0100)!=PWMZ)
{
IapEraseSector(0x0100);
IapProgramByte(0x0100,PWMZ);
}
/*----------------------------
關閉IAP
----------------------------*/
void IapIdle()
{
IAP_CONTR = 0; //關閉IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除觸發寄存器
IAP_ADDRH = 0x80; //將地址設置到非IAP區域
IAP_ADDRL = 0;
}
/*----------------------------
從ISP/IAP/EEPROM區域讀取一字節
----------------------------*/
BYTE IapReadByte(WORD addr)
{
BYTE dat; //數據緩沖區
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_READ; //設置IAP命令
IAP_ADDRL = addr; //設置IAP低地址
IAP_ADDRH = addr >> 8; //設置IAP高地址
IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
dat = IAP_DATA; //讀ISP/IAP/EEPROM數據
IapIdle(); //關閉IAP功能
return dat; //返回
}
/*----------------------------
寫一字節數據到ISP/IAP/EEPROM區域
----------------------------*/
void IapProgramByte(WORD addr, BYTE dat)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_PROGRAM; //設置IAP命令
IAP_ADDRL = addr; //設置IAP低地址
IAP_ADDRH = addr >> 8; //設置IAP高地址
IAP_DATA = dat; //寫ISP/IAP/EEPROM數據
IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/*----------------------------
扇區擦除
----------------------------*/
void IapEraseSector(WORD addr)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_ERASE; //設置IAP命令
IAP_ADDRL = addr; //設置IAP低地址
IAP_ADDRH = addr >> 8; //設置IAP高地址
IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
|