打印
[DemoCode下载]

N76E003 APROM 数据闪存作为EEPROM使用

[复制链接]
9950|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
734774645|  楼主 | 2017-7-12 16:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2016 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Nuvoton Technoledge Corp.
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Apr/21/2016
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: N76E003 APROM program DATAFLASH as EEPROM way
//***********************************************************************************************************
#include <stdio.h>
#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_Define.h"

bit BIT_TMP;

//-------------------------------------------------------------------------
UINT8 read_APROM_BYTE(UINT16 code *u16_addr)
{
        UINT8 rdata;
        rdata = *u16_addr>>8;
        return rdata;
}
//-------------------------------------------------------------------------


/*****************************************************************************************************************
write_DATAFLASH_BYTE :
user can copy all this subroutine into project, then call this function in main.
******************************************************************************************************************/               
void write_DATAFLASH_BYTE(UINT16 u16_addr,UINT8 u8_data)
{
        UINT8 looptmp=0,u8_addrl_r;
        unsigned char code *cd_longaddr;
        unsigned char xdata *xd_tmp;
       
//Check page start address
        u8_addrl_r = u16_addr;
        if (u8_addrl_r<0x80)
        {
                u8_addrl_r = 0;
        }
        else
        {
                u8_addrl_r = 0x80;
        }
//Save APROM data to XRAM
        xd_tmp = 0x80;
        cd_longaddr = (u16_addr&0xff00)+u8_addrl_r;       
        while (xd_tmp !=0x100)
        {
                *xd_tmp = *cd_longaddr;
                looptmp++;
                xd_tmp++;
                cd_longaddr++;
        }
// Modify customer data in XRAM
        u8_addrl_r = u16_addr;
        if (u8_addrl_r<0x80)
        {
                xd_tmp = u8_addrl_r+0x80;
        }
        else
        {
                xd_tmp = u8_addrl_r+0;
        }
        *xd_tmp = u8_data;
//Erase APROM DATAFLASH page
                IAPAL = u16_addr;
                IAPAH = u16_addr>>8;
                IAPFD = 0xFF;
          set_IAPEN;
                set_APUEN;
    IAPCN = 0x22;                
                set_IAPGO;
//Save changed RAM data to APROM DATAFLASH
        u8_addrl_r = u16_addr;
        if (u8_addrl_r<0x80)
        {
                u8_addrl_r =0;
        }
        else
        {
                u8_addrl_r = 0x80;
        }
                xd_tmp = 0x80;
          IAPAL = u8_addrl_r;
    IAPAH = u16_addr>>8;
                set_IAPEN;
                set_APUEN;
          IAPCN = 0x21;
                while (xd_tmp !=0xFF)
                {
                        IAPFD = *xd_tmp;
                        set_IAPGO;
                        IAPAL++;
                        xd_tmp++;
                }
                clr_APUEN;
                clr_IAPEN;
}       
/******************************************************************************************************************/               


void main (void)
{
                UINT8 datatemp;
/* -------------------------------------------------------------------------*/
/*  Dataflash use APROM area                                                                                                                         */
/*        APROM 0x3800~0x38FF demo as dataflash                                                                                                     */
/* Please use Memory window key in C:0x3800 to check earse result                                          */             
/* -------------------------------------------------------------------------*/
       
//call write byte
                write_DATAFLASH_BYTE (0x3881,0x55);
                write_DATAFLASH_BYTE (0x3882,0x56);
                write_DATAFLASH_BYTE (0x3855,0xaa);
                write_DATAFLASH_BYTE (0x3856,0x66);
//call read byte
                datatemp = read_APROM_BYTE(0x3882);
    while(1);
}
//-----------------------------------------------------------------------------------------------------------


沙发
598330983| | 2017-7-12 19:12 | 只看该作者
确实可以这样。

使用特权

评论回复
板凳
heisexingqisi| | 2017-7-17 22:07 | 只看该作者
可以省一个EEPROM的钱。

使用特权

评论回复
地板
天灵灵地灵灵| | 2017-7-17 22:34 | 只看该作者
这个功能有助于实现高性价比的方案。

使用特权

评论回复
5
lizhenming| | 2017-7-18 09:02 | 只看该作者
不是很明白为什么要将数据先放在XRAM里呢,直接刷鞋Flash不行吗

使用特权

评论回复
评论
北辰极界 2018-3-16 09:04 回复TA
@yezi350 :这个写操作不是很明白能不能详细讲解一下 
yezi350 2018-3-12 11:25 回复TA
因为他是整页擦除的,所以先保存不用修改的,在擦除后从新写回去。 
6
wahahaheihei| | 2017-7-18 16:31 | 只看该作者
这玩的,都无法理解了。

使用特权

评论回复
7
chhm8chhm| | 2017-12-11 18:29 | 只看该作者
N76E003 APROM 数据闪存作为EEPROM使用。这个便程我用源码仿真出来,写入的数据读出后都是00.是怎么回事?有验证过吗?

使用特权

评论回复
8
zqpeng| | 2017-12-12 10:03 | 只看该作者
我请教下,我用的是官方的EPPROM列程。读存都没问题,但是EEPROM的写入时间太长,导致数码管会出现0的抖动,怎么去解决这方面问题

使用特权

评论回复
9
LguoFu| | 2018-1-17 15:56 | 只看该作者
zqpeng 发表于 2017-12-12 10:03
我请教下,我用的是官方的EPPROM列程。读存都没问题,但是EEPROM的写入时间太长,导致数码管会出现0的抖动 ...

当然会抖动,写EEPROM时总中断都关了

使用特权

评论回复
10
小将wzj| | 2018-1-20 14:16 | 只看该作者
问一下,这个对eeprom的地址有什么要求,为什么是               
write_DATAFLASH_BYTE (0x3881,0x55);
write_DATAFLASH_BYTE (0x3882,0x56);
write_DATAFLASH_BYTE (0x3855,0xaa);
write_DATAFLASH_BYTE (0x3856,0x66);
其他地址是否可以。还是有工程中要作什么配置吗

使用特权

评论回复
11
yjgna| | 2018-1-21 13:58 | 只看该作者
使用dataflash模拟eeprom,有没有办法下载后不擦除 dataflash所在的区域?

使用特权

评论回复
12
yjgna| | 2018-1-21 14:04 | 只看该作者
zqpeng 发表于 2017-12-12 10:03
我请教下,我用的是官方的EPPROM列程。读存都没问题,但是EEPROM的写入时间太长,导致数码管会出现0的抖动 ...

官方这个每次写一个地址 都要把一页(128字节)擦除一次。主要是擦除耗时长。
建议修改下接口,分为擦除一页和编程,每次有数据更新时,先擦除,再将所有新数据依次写入。

使用特权

评论回复
评论
Javaleilei 2018-8-12 21:51 回复TA
断电数据就没了啥情况 
13
qinxingtech| | 2018-2-10 17:02 | 只看该作者
不擦除,直接编程也可以的

使用特权

评论回复
14
734774645|  楼主 | 2018-2-10 17:27 | 只看该作者
是的,不擦除也可以直接覆盖。

使用特权

评论回复
15
qinxingtech| | 2018-2-24 14:12 | 只看该作者
请教楼主,为什么单独调用读函数读出来都是FF;写完马上调用读就可以呢?

使用特权

评论回复
16
734774645|  楼主 | 2018-2-24 15:52 | 只看该作者
qinxingtech 发表于 2018-2-24 14:12
请教楼主,为什么单独调用读函数读出来都是FF;写完马上调用读就可以呢?

FF代表空白。

使用特权

评论回复
17
mintspring| | 2018-2-24 15:58 | 只看该作者
STC单片机也具备这个功能,这个功能非常实用。

使用特权

评论回复
18
bugkil-killer| | 2018-3-4 22:01 | 只看该作者
最大用到过几k?

使用特权

评论回复
19
yezi350| | 2018-3-12 11:24 | 只看该作者
lizhenming 发表于 2017-7-18 09:02
不是很明白为什么要将数据先放在XRAM里呢,直接刷鞋Flash不行吗

应该是先保存以前那些不用修改的,然后在擦除后再从新写进去。注意他是整页擦除的。

使用特权

评论回复
20
北辰极界| | 2018-3-16 09:06 | 只看该作者
yjgna 发表于 2018-1-21 14:04
官方这个每次写一个地址 都要把一页(128字节)擦除一次。主要是擦除耗时长。
建议修改下接口,分为擦除 ...

每次写一个数据就要擦一整页  其实主要还是对这个不怎么理解  以前没有接触过用Flash作为EEPROM  他到底是怎么工作的呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

197

主题

3445

帖子

14

粉丝