单片机成长之路(51基础篇) - 022 N76e003 APROM模拟EEPROM驱动

Posted jikexianfeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机成长之路(51基础篇) - 022 N76e003 APROM模拟EEPROM驱动相关的知识,希望对你有一定的参考价值。

  N76e003单片机内部没有EEPROM,但是可以使用 APROM模拟EEPROM功能,代码如下:

eeprom.h

 1 #ifndef _EEPROM_H_
 2 #define _EEPROM_H_
 3 
 4 //EEPROM 指令
 5 #define BYTE_PROGRAM_AP 0x21    //APROM 字节编程(数据写入)
 6 #define PAGE_ERASE_AP     0x22    //APROM 页擦除 (128字节)
 7 #define BYTE_Read_AP    0x00    //APROM 字节读 (数据字节)
 8 
 9 
10 // EEPROM起始地址
11 #define EEPROM_START_ADDRESS          0x0200
12 
13 void Eeprom_Unlock(void);
14 void Eeprom_Locked(void);
15 void Eeprom_IAP_process(void);
16 void Eeprom_Erase_page(unsigned short address,unsigned char Data);
17 void Eeprom_Byte_write(unsigned short address,unsigned char Data);
18 unsigned char Eeprom_Erase_read(unsigned short address);
19 
20 
21 #endif  /* _EEPROM_H_ */

eeprom.c

  1 #include "N76E003.h"
  2 #include "button.h"
  3 #include "eeprom.h"
  4 
  5 volatile unsigned char code Data_Flash[128] _at_ EEPROM_START_ADDRESS;                //不被优化
  6 
  7 /**************************************************************************
  8 Function:    Eeprom_Unlock
  9 Description: 解锁 Eeprom
 10 Input:       no
 11 Output:      no
 12 Return:      no
 13 **************************************************************************/
 14 void Eeprom_Unlock(void)
 15 {
 16     //开启 在线编程模式(LDROM和APROM)
 17     TA = 0xAA;                     //CHPCON受TA保护
 18     TA = 0x55;
 19     CHPCON |= 0x01;             //IAPEN = 1, 启用IAP模式(CHPCON芯片控制寄存器)
 20     //开启 编程程序模式(APROM)
 21     TA = 0xAA;                     //IAPUEN受TA保护
 22     TA = 0x55;
 23     IAPUEN |= 0x01;             //APUEN = 1, 启用APROM更新(更新使能)
 24 }
 25 /**************************************************************************
 26 Function:    Eeprom_Locked
 27 Description: 解锁 Eeprom
 28 Input:       no
 29 Output:      no
 30 Return:      no
 31 **************************************************************************/
 32 void Eeprom_Locked(void)
 33 {
 34     //关闭 编程程序模式(APROM)
 35     TA = 0xAA;                     //IAPUEN受TA保护
 36     TA = 0x55;
 37     IAPUEN &= ~0x01;             //APUEN = 0,禁用APROM更新
 38     //关闭 在线编程模式(LDROM和APROM)
 39     TA = 0xAA;                     //CHPCON受TA保护
 40     TA = 0x55;
 41     CHPCON &= ~0x01;             //IAPEN = 0,禁用IAP模式
 42 }
 43 
 44 
 45 /**************************************************************************
 46 Function:    Eeprom_IAP_process
 47 Description: IAP 处理
 48 Input:       no
 49 Output:      no
 50 Return:      no
 51 **************************************************************************/
 52 void Eeprom_IAP_process(void){
 53     bit EA_status;
 54     //IAP 执行
 55     TA = 0xAA;
 56     TA = 0x55;
 57     EA_status = EA;
 58     EA = 0;             
 59     IAPTRG |= 0x01;             //IAP 执行(设置该位为1开始执行IAP。该指令后,CPU保持程序计数器(PC) ,IAP硬件自动管理控制该过程。IAP完成后,程序计数器继续执行下一个指令。IAPGO位自动清零,保持为0。在触发IAP动作前,如果中断打开应该临时关闭因为硬件限制。)    Eeprom_Unlock();            //Eeprom 上锁
 60     EA = EA_status;
 61 }
 62 /**************************************************************************
 63 Function:    Eeprom_Erase_page
 64 Description: 擦除页面 Eeprom
 65 Input:       - address  指定擦除页面的绝对地址
 66              - Data  Eeprom擦除后的数据
 67 Output:      no
 68 Return:      no
 69 **************************************************************************/
 70 void Eeprom_Erase_page(unsigned short address,unsigned char Data)
 71 {
 72     unsigned char High_address = address >> 8;        //取高位
 73     unsigned char Low_address = address;            //取低位
 74     Eeprom_Unlock();            //Eeprom 解锁
 75     //擦除页面
 76     IAPCN = PAGE_ERASE_AP;         //页擦除
 77     IAPAH = High_address;        //页面地址高8位
 78     IAPAL = Low_address;        //页面地址低8位
 79     IAPFD = Data;                //擦除数据值
 80     //IAP 执行
 81     Eeprom_IAP_process();        //执行上面设置
 82     Eeprom_Locked();            //Eeprom 上锁
 83 }
 84 
 85 
 86 /**************************************************************************
 87 Function:    Eeprom_Byte_write
 88 Description: 字节编程 Eeprom
 89 Input:       - address  指定更改数据的绝对地址
 90              - Data  Eeprom写入的数据
 91 Output:      no
 92 Return:      no
 93 **************************************************************************/
 94 void Eeprom_Byte_write(unsigned short address,unsigned char Data)
 95 {
 96     unsigned char High_address = address >> 8;        //取高位
 97     unsigned char Low_address = address;            //取低位
 98     Eeprom_Unlock();            //Eeprom 解锁
 99     //字节编程
100     IAPCN = BYTE_Read_AP;         //字节编程
101     IAPAH = High_address;        //字节编程地址高8位
102     IAPAL = Low_address;        //字节编程地址低8位
103     IAPFD = Data;                //写入的数据
104     //IAP 执行
105     Eeprom_IAP_process();        //执行上面设置
106     Eeprom_Locked();            //Eeprom 上锁
107 }
108 /**************************************************************************
109 Function:    Eeprom_Erase_read
110 Description: 字节读 Eeprom
111 Input:       - address  指定读出数据的绝对地址
112 Output:      no
113 Return:      IAPFD 读出的数据
114 **************************************************************************/
115 unsigned char Eeprom_Erase_read(unsigned short address){
116     unsigned char High_address = address >> 8;        //取高位
117     unsigned char Low_address = address;            //取低位
118     //字节读
119     IAPCN = BYTE_Read_AP;         //字节读
120     IAPAH = High_address;        //字节读地址高8位
121     IAPAL = Low_address;        //字节读地址低8位
122     //IAP 执行
123     Eeprom_IAP_process();        //执行上面设置
124     return IAPFD;
125 }

 

以上是关于单片机成长之路(51基础篇) - 022 N76e003 APROM模拟EEPROM驱动的主要内容,如果未能解决你的问题,请参考以下文章

单片机成长之路(51基础篇) - 018 keil51的STARTUP.A51

单片机成长之路(51基础篇) - 016 常见总线类型

单片机成长之路(51基础篇) - 015 关于sdcc的多文件编译范例二

单片机成长之路(51基础篇) - 008 C51 的标示符和关键字

单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境

单片机成长之路(51基础篇) - 020 51单片机寄存器功能一览表