查看: 88|回复: 5
收起左侧

[技术问答] N76E003,内部Flash怎么写入数据

[复制链接]
     

5

主题

20

帖子

4666

积分

中级工程师

 楼主| 发表于 2017-7-18 01:54 | 显示全部楼层 |返回版面|阅读模式
本帖最后由 chenqinyao 于 2017-7-18 01:56 编辑

如下程序, 数据手册上的写入流程, 来操作没有任何变化, 读出来的是0xFF, 而不是0x55按BSP包里面的例程序也没任何变化, 写入0x55, 读出来也是0xFF
现在问一下, 写内部Flash要注意什么的吗, 还是还要哪里云设置


#include "N76E003.h"
#include "Function_Define.h"
#include "SFR_Macro.h"

//******************************************************************************
//  This code illustrates how to use IAP to make APROM 201h as a byte of
//  Data Flash when user code is executed in APROM.
//******************************************************************************
#define  PAGE_ERASE_AP    0x22
#define  BYTE_PROGRAM_AP  0x21

/*Data Flash, as part of APROM, is read by MOVC. Data Flash can be defined as
128-element array in “code” area from absolute address 0x0200               */

volatile unsigned char code Data_Flash[128] _at_ 0x0200;

Main (void)
{
    TA = 0xAA;        //CHPCON is TA protected
    TA = 0x55;
    CHPCON |= 0x01;       //IAPEN = 1, enable IAP mode

    TA = 0xAA;        //IAPUEN is TA protected
    TA = 0x55;
    IAPUEN |= 0x01;       //APUEN = 1, enable APROM update

    IAPCN = PAGE_ERASE_AP;    //Erase page 200h~27Fh
    IAPAH = 0x02;
    IAPAL = 0x00;
    IAPFD = 0xFF;
    TA = 0xAA;        //IAPTRG is TA protected
    TA = 0x55;
    IAPTRG |= 0x01;      //write ‘1’ to IAPGO to trigger IAP process

    IAPCN = BYTE_PROGRAM_AP;    // Program 201h with 55h
    IAPAH = 0x02;
    IAPAL = 0x01;
    IAPFD = 0x55;
    TA = 0xAA;
    TA = 0x55;
    IAPTRG |= 0x01;      //write ‘1’ to IAPGO to trigger IAP process

    TA = 0xAA;        //IAPUEN is TA protected
    TA = 0x55;
    IAPUEN &= ~0x01;       //APUEN = 0, disable APROM update

    TA = 0xAA;        //CHPCON is TA protected
    TA = 0x55;
    CHPCON &= ~0x01;       //IAPEN = 0, disable IAP mode

    P0 = Data_Flash[1];     //Read content of address 200h+1

    while(1);
}
上面  Data_Flash[1] 读出来的0xFF, 而不是0x55



21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

70

主题

1557

帖子

4671

积分

中级工程师

发表于 2017-7-18 14:58 | 显示全部楼层 |返回版面
提供的有例子吧。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

70

主题

1557

帖子

4671

积分

中级工程师

发表于 2017-7-18 15:13 | 显示全部楼层 |返回版面
  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. //-----------------------------------------------------------------------------------------------------------
复制代码
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

83

主题

1785

帖子

5370

积分

高级工程师

发表于 2017-7-18 18:57 | 显示全部楼层 |返回版面
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0
     

61

主题

1851

帖子

5581

积分

高级工程师

发表于 2017-7-18 19:59 | 显示全部楼层 |返回版面
手册上应该有说操作哪儿
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

8

主题

309

帖子

1776

积分

助理工程师

发表于 2017-7-19 10:08 | 显示全部楼层 |返回版面
KEIL C51 有时会优化掉 TA=0xAA;TA=0x55; ???;这个时序有要求的.我也是刚发现,优化等级为9的时候出了问题,改优化等级为7 就没有 问题了
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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