MC9S12DG128单片机的EEPROM调试心得
几年前曾经调过DG128单片机的EEPROM,记得当时遇到了一些困难,最终还是弄明白了。
EEPROM是单片机的一类存储器,一般用来存储数据。
从DG128的datasheet上可以看到,EEPROM的地址是$0000-$07FF,而RAM的地址是$0000-$1FFF,而且$0400地址以下的存储器都是寄存器的空间,显然EEPROM、RAM和register在地址上发生了重叠。
找了一些代码,并参考单片机的datasheet编了个程序,下载之后,发现存储器中存储的根本不是自己想存储的数据。实际上,由于存储器地址的重叠,导致了DG128单片机的EEPROM不可见。所以要想往EEPROM中存储数据,就要对EEPROM进行一些配置。对EEPROM进行配置的寄存器为INITEE,INITEE各位的定义如下
EE[15:12]这4位定义了EEPROM16位地址的高四位,EEON定义了是否启用EEPROM。
从DG128的memory map可以看出$2000-$3FFF这部分地址是空闲的,因此可以将EEPROM配置在这里。
令INITEE=0X21; 即设置了EEPROM的起始地址为$2000.
相关的代码如下,实现的功能是网EEPROM中存入4个字母“GOOD”并读出验证数据是否正确。
/*-------------------------------------------------------*/
/*********************************************************
飞翔科技MC9S12DG128汽车电子综合开发平台
E-mail:bhfengchong@gmail.com
2008f.d@163.com
淘宝店:http://fxfreefly.taobao.com
**********************************************************/
/*-------------------------------------------------------*/
#include /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define LEDCPU PORTK_BIT4
#define LEDCPU_dir DDRK_BIT4
#define BUZZ PORTK_BIT5
#define BUZZ_dir DDRK_BIT5
#define any (*((volatile unsigned char*)(erase)))
#define EraseInSector 0x40
#define ProgramInAlignedWord 0x20
#define EEPROM_ADDRESS 0x2000
/*******************************************************/
/* 向EEPROM中写入数据 */
/******************************************************/
void EEPROM_program(unsigned char code,unsigned char number)
{
unsigned char *eeaddr; //对EEPROM进行写操作时的地址
eeaddr = (unsigned char*)(EEPROM_ADDRESS+2*(number-1));
while(!(ECLKDIV & 0x80)) //判断ECLKDIV是否被写入,是向下进行,否原地等待
{}
while(!(ESTAT & 0x80)) //判断缓冲区是否准备好,准备好则向下进行,没有准备好则原地等待
{}
while(!(EPROT & 0x80)) //判断EEPROM是否允许被写入,允许向下进行,不允许则原地等待
{}
*eeaddr= code;
ECMD = ProgramInAlignedWord;
ESTAT |= 0x80;
while(!(ESTAT & 0x40)) //判断EEPROM是否被写入,是向下进行,否原地等待;
{}
return;
}
/*********************************************************/
/* 擦除EEPROM中的数据 */
/*********************************************************/
void EEPROM_erasure(void)
{
unsigned char *erase; //对EEPROM进行擦除操作时的地址
erase = (unsigned char*)(EEPROM_ADDRESS);
if(*erase == 0xff)
return;
else
{
<span style="font-size: 14pt"> while(erase
|