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地址并没有被写入数据!
我完全搞糊涂了!
[此贴子已经被作者于2008-9-19 15:09:33编辑过]
在memory区,可以看到0x0800的地址上写入了数据56和78,但同时,也可以看到0x0C00地址也被写入了数据56和78,可我并没有对写这个地址啊?
这个状态时,先看一下epage是多少,如果0xFF,那就正常。
0xFF0800 其实就是 0x0C00
[此贴子已经被作者于2008-9-19 16:10:49编辑过]
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |