9S12XDT512,BANKED模式。 prm文件相关设置如下: /* non-paged EEPROM */ EEPROM = READ_ONLY 0x0C00 TO 0x0FFB; /* paged EEPROM 0x0800 TO 0x0BFF; addressed through EPAGE */ EEPROM_FC = READ_ONLY 0xFC0800 TO 0xFC0BFF; EEPROM_FD = READ_ONLY 0xFD0800 TO 0xFD0BFF; EEPROM_FE = READ_ONLY 0xFE0800 TO 0xFE0BFF;
EEPROM操作代码如下:
#define EEPROM_ADDR_BASE ((volatile int *)0x0800) #define ee_word_program 0x20 // 字编程 #define ee_word_erase 0x40 // 字擦除 #define ee_sector_erase 0x41 // 全部擦除 /*************************************************
EEPROM模块初始化程序
*************************************************/ void EEPROM_init(void) { ECLKDIV=0x15; // 不采用8分频,因为OSCLK=4M,又为了使ECLK // 达到190KHZ,所以EDIV=21,即ECLK=4M/21=190.5KHZ ECNFG=0x00; // 禁止EEPROM相关操作的中断 while(ECLKDIV_EDIVLD == 0); // 等待时钟设置成功 EPROT_EPOPEN=1; // EEPROM没有保护,可以进行编程与擦除 EPROT_EPDIS=1; // EEPROM保护禁止 } /************************************************* 直接操作EEPROM程序
Addr: 要操作的EEPROM地址 Data: 要操作的EEPROM数据 OpType:操作命令类型 *************************************************/ void EEPROM_direct_operate(uint * Addr,uint Data,uchar OpType) { while(ESTAT_CBEIF == 0); // 等待EEPROM命令缓冲区为空 *Addr=Data; ECMD=OpType; // 指令的类型 ESTAT |= 0x80; // 清命令缓冲标志,开始执行命令 while(ESTAT_CCIF == 0); // 等待命令完成 }
在main里调用 EEPROM_direct_operate((EEPROM_ADDR_BASE+1),Dump,ee_word_erase); EEPROM_direct_operate((EEPROM_ADDR_BASE+1),0x5678,ee_word_program); 当EEPROM_ADDR_BASE 地址为0x800~0xBFF时,运行之后,在memory区的对应地址都能看到数据被正确写入,但同时,在0xC00~0xFFF的对应地址上也被写入了同样的数据。比如,#define EEPROM_ADDR_BASE ((volatile int *)0x0800),那么,在memory区,可以看到0x0800的地址上写入了数据56和78,但同时,也可以看到0x0C00地址也被写入了数据56和78,可我并没有对写这个地址啊? 更奇怪的是,如果#define EEPROM_ADDR_BASE ((volatile int *)0x0C00),则发现,数据根本就不能被写入! 另外,如果#define EEPROM_ADDR_BASE ((volatile int *)0xFC0800),也就是我想向EEPROM的分页区写入数据,但是在memory区中发现,0xFC0800地址并没有被写入数据,而数据却被写入到了0x0800地址,但此时,0x0C00地址并没有被写入数据! 我完全搞糊涂了!
8pZ9vRcK.rar (978.1 KB)
[此贴子已经被作者于2008-9-19 15:09:33编辑过] |