首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

操作EEPROM的问题

操作EEPROM的问题

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编辑过]

在memory区,可以看到0x0800的地址上写入了数据56和78,但同时,也可以看到0x0C00地址也被写入了数据56和78,可我并没有对写这个地址啊?

这个状态时,先看一下epage是多少,如果0xFF,那就正常。

0xFF0800 其实就是 0x0C00

[此贴子已经被作者于2008-9-19 16:10:49编辑过]

想向0xFC0800写数据的话,先把EPAGE设置成0xFC,然后再向0x0800里写数据。
返回列表