历史上的今天
今天是:2025年01月07日(星期二)
2020年01月07日 | 单片机成长之路(51基础篇) - 022 N76e003 APROM模拟EEPROM驱动
2020-01-07 来源:eefocus
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 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 }
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 由日立、松下、飞利浦、硅化图像Silicon Image、索尼、汤姆逊、东芝开发的高清晰度多媒体接口 (HDMI) 新近成为HDTV和消费类电子产品市场的连接标准。HDMI是首个也是唯一一个在单数字接口中集成 ...… 查看全部问答> |
|
经过本人的改造,友善之臂的qtopia自带的浏览器终于支持中文网页了,也就是,如果能把应用程序再汉化下,就可以应用到开发中。空说无凭,先给大家上几张图。(X86-qtopia在PC上运行) … 查看全部问答> |
|
本人现在要在作一个类似于手机平台之类的东西,要支持wifi 和GPRS ,采用的是xscale的处理器,准备采用的操作系统是linux, 刚开始的时候我们是希望采用集成了wifi和gprs的模块,但是本人现在没有找到,或是过于大了,如果坛子里有人知道的话,还 ...… 查看全部问答> |
|
昨天弄了一个44b0的板子 用bootloader的tftp没有问题,但是uclinux的和主机就是ping不通,网线用的交叉直连的,ip也设置成同一网段了。uclinux是随机带的,可能会是什么问题,系统的网络不会有问题吧?望高人指点一二… 查看全部问答> |
|
我想请问下winCE下能不能实现菜单的自绘。我用ModifyStyle不能实现。网上也有很多人提问,但是也没有人提出解决办法,小弟在这里先谢过了。主要的是在触摸屏上应用,现有的菜单太小,使用不方便。我想增大菜单的高度,如果不能实现自绘,是否有别的 ...… 查看全部问答> |
|
安装好后(SYSTEM中有红色控件)把SPCOMM控件放入窗体,没写一行代码直接编译弹出SPCOMM单元文件,编译不过,好像内嵌了一个代码单元,怎么回事?… 查看全部问答> |




