/* ================ 打開 ISP,IAP 功能 ================= */
void ISP_IAP_enable(void)
{
EA = 0;? ?? ? /* 關中斷? ?*/
ISP_CONTR = ISP_CONTR & 0x18;? ?? ? /* 0001,1000 */
ISP_CONTR = ISP_CONTR | WaitTime; /* 寫入硬件延時 */
ISP_CONTR = ISP_CONTR | 0x80;? ?? ? /* ISPEN=1??*/
}
/* =============== 關閉 ISP,IAP 功能 ================== */
void ISP_IAP_disable(void)
{
ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
ISP_TRIG = 0x00;
EA? ?=? ?1;? ?/* 開中斷 */
}
/* ================ 公用的觸發代碼 ==================== */
void ISPgoon(void)
{
ISP_IAP_enable();? ?/* 打開 ISP,IAP 功能 */
ISP_TRIG = 0x46;??/* 觸發ISP_IAP命令字節1 */
ISP_TRIG = 0xb9;??/* 觸發ISP_IAP命令字節2 */
_nop_();
}
/* ==================== 字節讀 ======================== */
uchar byte_read(uint byte_addr)
{
ISP_ADDRH = (uchar)(byte_addr >> 8);/* 地址賦值 */
ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
ISP_CMD? ?= ISP_CMD & 0xf8;? ?/* 清除低3位??*/
ISP_CMD? ?= ISP_CMD | RdCommand; /* 寫入讀命令 */
ISPgoon();? ?? ? /* 觸發執行??*/
ISP_IAP_disable();? ? /* 關閉ISP,IAP功能 */
return (ISP_DATA);? ? /* 返回讀到的數據 */
}
/* ================== 扇區擦除 ======================== */
void SectorErase(uint sector_addr)
{
uint iSectorAddr;
iSectorAddr = (sector_addr & 0xfe00); /* 取扇區地址 */
ISP_ADDRH = (uchar)(iSectorAddr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8;? ?/* 清空低3位??*/
ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3??*/
ISPgoon();? ?? ? /* 觸發執行??*/
ISP_IAP_disable();? ? /* 關閉ISP,IAP功能 */
}
/* ==================== 字節寫 ======================== */
void byte_write(uint byte_addr, uchar original_data)
{
ISP_ADDRH = (uchar)(byte_addr >> 8);??/* 取地址??*/
ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
ISP_CMD??= ISP_CMD & 0xf8;? ? /* 清低3位 */
ISP_CMD??= ISP_CMD | PrgCommand;??/* 寫命令2 */
ISP_DATA = original_data;? ?/* 寫入數據準備 */
ISPgoon();? ?? ? /* 觸發執行??*/
ISP_IAP_disable();? ???/* 關閉IAP功能 */
}