[DemoCode下载] N76E003 APROM 数据闪存作为EEPROM使用

[复制链接]
2797|28
 楼主 | 2017-7-12 16:45 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2016 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

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

  12. //***********************************************************************************************************
  13. //  File Function: N76E003 APROM program DATAFLASH as EEPROM way
  14. //***********************************************************************************************************
  15. #include <stdio.h>
  16. #include "N76E003.h"
  17. #include "Common.h"
  18. #include "Delay.h"
  19. #include "SFR_Macro.h"
  20. #include "Function_Define.h"

  21. bit BIT_TMP;

  22. //-------------------------------------------------------------------------
  23. UINT8 read_APROM_BYTE(UINT16 code *u16_addr)
  24. {
  25.         UINT8 rdata;
  26.         rdata = *u16_addr>>8;
  27.         return rdata;
  28. }
  29. //-------------------------------------------------------------------------


  30. /*****************************************************************************************************************
  31. write_DATAFLASH_BYTE :
  32. user can copy all this subroutine into project, then call this function in main.
  33. ******************************************************************************************************************/               
  34. void write_DATAFLASH_BYTE(UINT16 u16_addr,UINT8 u8_data)
  35. {
  36.         UINT8 looptmp=0,u8_addrl_r;
  37.         unsigned char code *cd_longaddr;
  38.         unsigned char xdata *xd_tmp;
  39.        
  40. //Check page start address
  41.         u8_addrl_r = u16_addr;
  42.         if (u8_addrl_r<0x80)
  43.         {
  44.                 u8_addrl_r = 0;
  45.         }
  46.         else
  47.         {
  48.                 u8_addrl_r = 0x80;
  49.         }
  50. //Save APROM data to XRAM
  51.         xd_tmp = 0x80;
  52.         cd_longaddr = (u16_addr&0xff00)+u8_addrl_r;       
  53.         while (xd_tmp !=0x100)
  54.         {
  55.                 *xd_tmp = *cd_longaddr;
  56.                 looptmp++;
  57.                 xd_tmp++;
  58.                 cd_longaddr++;
  59.         }
  60. // Modify customer data in XRAM
  61.         u8_addrl_r = u16_addr;
  62.         if (u8_addrl_r<0x80)
  63.         {
  64.                 xd_tmp = u8_addrl_r+0x80;
  65.         }
  66.         else
  67.         {
  68.                 xd_tmp = u8_addrl_r+0;
  69.         }
  70.         *xd_tmp = u8_data;
  71. //Erase APROM DATAFLASH page
  72.                 IAPAL = u16_addr;
  73.                 IAPAH = u16_addr>>8;
  74.                 IAPFD = 0xFF;
  75.           set_IAPEN;
  76.                 set_APUEN;
  77.     IAPCN = 0x22;                
  78.                 set_IAPGO;
  79. //Save changed RAM data to APROM DATAFLASH
  80.         u8_addrl_r = u16_addr;
  81.         if (u8_addrl_r<0x80)
  82.         {
  83.                 u8_addrl_r =0;
  84.         }
  85.         else
  86.         {
  87.                 u8_addrl_r = 0x80;
  88.         }
  89.                 xd_tmp = 0x80;
  90.           IAPAL = u8_addrl_r;
  91.     IAPAH = u16_addr>>8;
  92.                 set_IAPEN;
  93.                 set_APUEN;
  94.           IAPCN = 0x21;
  95.                 while (xd_tmp !=0xFF)
  96.                 {
  97.                         IAPFD = *xd_tmp;
  98.                         set_IAPGO;
  99.                         IAPAL++;
  100.                         xd_tmp++;
  101.                 }
  102.                 clr_APUEN;
  103.                 clr_IAPEN;
  104. }       
  105. /******************************************************************************************************************/               


  106. void main (void)
  107. {
  108.                 UINT8 datatemp;
  109. /* -------------------------------------------------------------------------*/
  110. /*  Dataflash use APROM area                                                                                                                         */
  111. /*        APROM 0x3800~0x38FF demo as dataflash                                                                                                     */
  112. /* Please use Memory window key in C:0x3800 to check earse result                                          */             
  113. /* -------------------------------------------------------------------------*/
  114.        
  115. //call write byte
  116.                 write_DATAFLASH_BYTE (0x3881,0x55);
  117.                 write_DATAFLASH_BYTE (0x3882,0x56);
  118.                 write_DATAFLASH_BYTE (0x3855,0xaa);
  119.                 write_DATAFLASH_BYTE (0x3856,0x66);
  120. //call read byte
  121.                 datatemp = read_APROM_BYTE(0x3882);
  122.     while(1);
  123. }
  124. //-----------------------------------------------------------------------------------------------------------
复制代码


| 2017-7-12 19:12 | 显示全部楼层
确实可以这样。
| 2017-7-17 22:07 | 显示全部楼层
可以省一个EEPROM的钱。
| 2017-7-17 22:34 | 显示全部楼层
这个功能有助于实现高性价比的方案。
| 2017-7-18 09:02 | 显示全部楼层
不是很明白为什么要将数据先放在XRAM里呢,直接刷鞋Flash不行吗

评论

yezi350 2018-3-12 11:25 回复TA
因为他是整页擦除的,所以先保存不用修改的,在擦除后从新写回去。 
北辰极界 2018-3-16 09:04 回复TA
@yezi350 :这个写操作不是很明白能不能详细讲解一下 
| 2017-7-18 16:31 | 显示全部楼层
这玩的,都无法理解了。
| 2017-12-11 18:29 | 显示全部楼层
N76E003 APROM 数据闪存作为EEPROM使用。这个便程我用源码仿真出来,写入的数据读出后都是00.是怎么回事?有验证过吗?
| 2017-12-12 10:03 | 显示全部楼层
我请教下,我用的是官方的EPPROM列程。读存都没问题,但是EEPROM的写入时间太长,导致数码管会出现0的抖动,怎么去解决这方面问题
| 2018-1-17 15:56 | 显示全部楼层
zqpeng 发表于 2017-12-12 10:03
我请教下,我用的是官方的EPPROM列程。读存都没问题,但是EEPROM的写入时间太长,导致数码管会出现0的抖动 ...

当然会抖动,写EEPROM时总中断都关了
| 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);
其他地址是否可以。还是有工程中要作什么配置吗
| 2018-1-21 13:58 | 显示全部楼层
使用dataflash模拟eeprom,有没有办法下载后不擦除 dataflash所在的区域?
| 2018-1-21 14:04 | 显示全部楼层
zqpeng 发表于 2017-12-12 10:03
我请教下,我用的是官方的EPPROM列程。读存都没问题,但是EEPROM的写入时间太长,导致数码管会出现0的抖动 ...

官方这个每次写一个地址 都要把一页(128字节)擦除一次。主要是擦除耗时长。
建议修改下接口,分为擦除一页和编程,每次有数据更新时,先擦除,再将所有新数据依次写入。
| 2018-2-10 17:02 | 显示全部楼层
不擦除,直接编程也可以的
 楼主 | 2018-2-10 17:27 | 显示全部楼层
是的,不擦除也可以直接覆盖。
| 2018-2-24 14:12 | 显示全部楼层
请教楼主,为什么单独调用读函数读出来都是FF;写完马上调用读就可以呢?
 楼主 | 2018-2-24 15:52 | 显示全部楼层
qinxingtech 发表于 2018-2-24 14:12
请教楼主,为什么单独调用读函数读出来都是FF;写完马上调用读就可以呢?

FF代表空白。
| 2018-2-24 15:58 | 显示全部楼层
STC单片机也具备这个功能,这个功能非常实用。
| 2018-3-4 22:01 | 显示全部楼层
最大用到过几k?
| 2018-3-12 11:24 | 显示全部楼层
lizhenming 发表于 2017-7-18 09:02
不是很明白为什么要将数据先放在XRAM里呢,直接刷鞋Flash不行吗

应该是先保存以前那些不用修改的,然后在擦除后再从新写进去。注意他是整页擦除的。
| 2018-3-16 09:06 | 显示全部楼层
yjgna 发表于 2018-1-21 14:04
官方这个每次写一个地址 都要把一页(128字节)擦除一次。主要是擦除耗时长。
建议修改下接口,分为擦除 ...

每次写一个数据就要擦一整页  其实主要还是对这个不怎么理解  以前没有接触过用Flash作为EEPROM  他到底是怎么工作的呢
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

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