查看: 8814|回复: 8

[S12] MC9S12DG128单片机的EEPROM调试心得

[复制链接]

该用户从未签到

17

主题

36

帖子

0

中级会员

Rank: 3Rank: 3

积分
240
最后登录
1970-1-1
发表于 2010-12-10 13:58:42 | 显示全部楼层 |阅读模式
 
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
我知道答案 目前已有7人回答
回复

使用道具 举报

该用户从未签到

30

主题

168

帖子

0

高级会员

Rank: 4

积分
799
最后登录
1970-1-1
发表于 2010-12-16 17:14:59 | 显示全部楼层

RE:MC9S12DG128单片机的EEPROM调试心得

学习了!

该用户从未签到

3

主题

151

帖子

0

中级会员

Rank: 3Rank: 3

积分
396
最后登录
2020-6-22
发表于 2011-1-6 18:23:31 | 显示全部楼层

RE:MC9S12DG128单片机的EEPROM调试心得


谢谢飞翔!

该用户从未签到

0

主题

5

帖子

0

新手上路

Rank: 1

积分
3
最后登录
1970-1-1
发表于 2011-2-28 17:19:26 | 显示全部楼层

回复:MC9S12DG128单片机的EEPROM调试心得

很好,正是我需要的东西

该用户从未签到

0

主题

16

帖子

0

新手上路

Rank: 1

积分
22
最后登录
1970-1-1
发表于 2011-3-9 17:20:56 | 显示全部楼层

RE:MC9S12DG128单片机的EEPROM调试心得

学习了

该用户从未签到

0

主题

2

帖子

0

新手上路

Rank: 1

积分
3
最后登录
1970-1-1
发表于 2011-3-25 15:45:37 | 显示全部楼层

回复:MC9S12DG128单片机的EEPROM调试心得

很需要,谢谢  看看

该用户从未签到

0

主题

32

帖子

0

新手上路

Rank: 1

积分
45
最后登录
1970-1-1
发表于 2011-5-5 15:22:00 | 显示全部楼层

回复:MC9S12DG128单片机的EEPROM调试心得

多谢分享,受益匪浅啊!谢谢!

该用户从未签到

0

主题

9

帖子

0

新手上路

Rank: 1

积分
13
最后登录
1970-1-1
发表于 2011-6-28 22:39:28 | 显示全部楼层

RE:MC9S12DG128单片机的EEPROM调试心得

多谢分享!大家一起定分享,让这里成为收获的殿堂!顶!

该用户从未签到

0

主题

13

帖子

0

新手上路

Rank: 1

积分
16
最后登录
1970-1-1
发表于 2011-7-9 10:15:13 | 显示全部楼层

RE:MC9S12DG128单片机的EEPROM调试心得

回复:
MC9S12DG128单片机的EEPROM调试心得
谢谢!
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-26 19:13 , Processed in 0.101081 second(s), 29 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表