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

 

posted @ 2019-04-16 00:13  极客先锋  阅读(1937)  评论(0编辑  收藏  举报