当前位置:文档之家› 单片机EEPROM读写程序

单片机EEPROM读写程序

uint iSectorAddr; iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */ ISP_ADDRH = (uchar)(iSectorAddr >> 8); ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8;
/* 清空低 3 位 */
/* 指向下一个字节 */
/* ========================= 扇区读出 ========================= */
/* 程序对地址没有作有效性判断,请调用方事先保证他在规定范围内 */
void ArrayRead(uint begin_addr, uchar len){
// uchar xdata data_buffer[];
/* 整个扇区读取缓存区 */
uint iSectorAddr;
uint i;
iSectorAddr = begin_addr; // & 0xfe00;
/* 取扇区地址 */
ISP_IAP_enable(); for(i = 0; i < len; i++){
ISP_DATA = 0;
ISP_TRIG = 0x46;
/* 触发 ISP_IAP 命令字节 1 */
ISP_TRIG = 0xb9;
/* 触发 ISP_IAP 命令字节 2 */
_nop_();
Ttotal[i] = ISP_DATA; iSectorAddr++; } ISP_IAP_disable(); }
ISP_TRIG = 0x46; ISP_TRIG = 0xb9; _nop_();
/* 触发 ISP_IAP 命令字节 1 */ /* 触发 ISP_IAP 命令字节 2 */
/* 比较对错 */ if(ISP_DATA != array[i]){
ISP_IAP_disable(); return Error; } in_addr++; } ISP_IAP_disable(); return Ok; }
return Error;
}
in_addr = begin_addr;
/* 逐个写入并校对 */
ISP_IAP_enable();
/* 打开 IAP 功能 */
for(i = 0; i< len; i++){
/* 写一个字节 */
ISP_ADDRH = (uchar)(in_addr >> 8);
ISP_ADDRL = (uchar)(in_addr & 0x00ff);
/* 关闭 IAP 功能 */
/* ==============================================================
从 eeprom 中读取数据
=================================================打开 ISP,IAP 功能 */
ISP_TRIG = 0x46;
/* 触发 ISP_IAP 命令字节 1 */
ISP_TRIG = 0xb9;
/* 触发 ISP_IAP 命令字节 2 */
_nop_();
}
/* ==================== 字节读 ======================== */ uchar byte_read(uint byte_addr){
#define WaitTime 0x01
/* ================ 打开 ISP,IAP 功能 ================= */
void ISP_IAP_enable(void){
EA = 0;
/* 关中断
*/
ISP_CONTR = ISP_CONTR & 0x18;
/* 0001,1000 */
ISP_ADDRH = (uchar)(byte_addr >> 8); /* 取地址 */ ISP_ADDRL = (uchar)(byte_addr & 0xff);
ISP_CMD = ISP_CMD & 0xf8; ISP_CMD = ISP_CMD | PrgCommand; ISP_DATA = original_data;
ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */
ISP_CONTR = ISP_CONTR | 0x80;
/* ISPEN=1
*/
}
/* =============== 关闭 ISP,IAP 功能 ================== */
void ISP_IAP_disable(void){
ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令 3 */
ISPgoon(); ISP_IAP_disable();
/* 触发执行
*/
/* 关闭 ISP,IAP 功能 */
}
/* ==================== 字节写 ======================== */ void byte_write(uint byte_addr, uchar original_data){
uint i; uint in_addr;
/* 判是否是有效范围,此函数不允许跨扇区操作 */
if(len > PerSector){
return Error;
}
in_addr = begin_addr & 0x01ff;
/* 扇区内偏移量 */
if((in_addr + len) > PerSector){
ISP_ADDRH = (uchar)(iSectorAddr >> 8); ISP_ADDRL = (uchar)(iSectorAddr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8;
/* 清低 3 位 */
ISP_CMD = ISP_CMD | RdCommand;
/* 读命令 1 */
/* 写命令 2 */
ISP_DATA = original_data;
/* 写入数据准备 */
ISPgoon(); ISP_IAP_disable(); }
/* 触发执行
*/
/* 关闭 IAP 功能 */
/* =================== 字节写并校验 =================== */ uchar byte_write_verify(uint byte_addr, uchar original_data){
void DataRestore()
{
EepromPtr = BaseAddr;
/* 触发 ISP_IAP 命令字节 1 */ /* 触发 ISP_IAP 命令字节 2 */
/* 读回来 */ ISP_DATA = 0x00;
ISP_CMD = ISP_CMD & 0xf8;
/* 清低 3 位 */
ISP_CMD = ISP_CMD | RdCommand;
/* 读命令 1 */
if(ISP_DATA == original_data){ return Ok;
} else{
return Error; } }
/* 读写数据校验 */ /* 返回校验结果 */
/* ===================== 数组写入 ===================== */ uchar ArrayWrite(uint begin_addr, uint len, uchar *array){
0x02,
0x03,
0x04,
0x05,
0x06,
0x07,
0x08,
0x09,
0x0a,
0x0b,
0x0c,
0x0d,
0x0e,
0x0f,
};
uint timerForDelay, i, EepromPtr;
/* 专供延时用的变量 */
/* 循环变量
*/
/* eeprom 读写指针 */
/* --------------- 命令定义 --------------- */
ISP_DATA = array[i];
/* 取数据 */
ISP_CMD = ISP_CMD & 0xf8;
/* 清低 3 位 */
ISP_CMD = ISP_CMD | PrgCommand; /* 写命令 2 */
ISP_TRIG = 0x46; ISP_TRIG = 0xb9; _nop_();
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){
相关主题