[技术问答] N76E003 IAP模拟EEP的问题

[复制链接]
2350|14
 楼主| xiaobao28 发表于 2018-7-17 16:58 | 显示全部楼层 |阅读模式
大家好,我用了官方 1.03例程,为什么还是不能存储,是哪里的问题?请问大家有没有不用官方例程的代码吗?
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

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

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


/*****************************************************************************************************************
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 = 0x280;
          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;
}       
       
//-------------------------------------------------------------------------
UINT8 read_APROM_BYTE(UINT16 code *u16_addr)
{
        UINT8 rdata;
        rdata = *u16_addr>>8;
        return rdata;
}

/******************************************************************************************************************/       


void main (void)
{
                UINT8 datatemp;
/* -------------------------------------------------------------------------*/
/*  Dataflash use APROM area, please ALWAYS care the address of you code    */
/*        APROM 0x3800~0x38FF demo as dataflash                                                                                                     */
/*         Please use Memory window key in C:0x3800 to check earse result                                        */             
/* -------------------------------------------------------------------------*/
                InitialUART0_Timer1(115200);
//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)
                {
//                                printf ("\n data temp = 0x%bx", datatemp);
                }
}
//-----------------------------------------------------------------------------------------------------------
tianxj01 发表于 2018-7-17 17:05 | 显示全部楼层
#define     PAGE_ERASE_AP    0x22 //页擦除命令
#define     BYTE_PROGRAM_AP  0x21 //字节编程命令
#define     UN_TA           TA=0xAA;TA=0X55
//====================================
void EE_WRITE (void)
        {
                u8 i;
                EA =0;
                UN_TA;
                CHPCON |= 0x01;    //IAPEN = 1, enable IAP mode CHPCON TA保护
                UN_TA;
                IAPUEN |= 0x01;    //APUEN = 1, enable APROM update,IAPUEN  TA保护
               
                IAPCN = PAGE_ERASE_AP;    //页擦除 4700h~477Fh
                IAPAH = EEPROM_ADD_H;
                IAPAL = EEPROM_ADD_L;
                IAPFD = 0xFF;
                UN_TA;
                IAPTRG |= 0x01;      //write ‘1’ to IAPGO to trigger IAP process
               
                IAPCN = BYTE_PROGRAM_AP;    // Program 201h with 55h
                IAPAH = EEPROM_ADD_H;
                IAPAL = EEPROM_ADD_L;
                //----=============开始字节编程=================--------------------
                for(i=0;i<3;i++)              
                        {
                                IAPFD = SET_DATA[i]>>8;              //被编程数据
                                UN_TA;
                                IAPTRG |= 0x01;      //write ‘1’ to IAPGO to trigger IAP process
                                IAPAL++;
                                IAPFD = SET_DATA[i];                 //被编程数据
                                UN_TA;
                                IAPTRG |= 0x01;      //write ‘1’ to IAPGO to trigger IAP process
                                IAPAL++;     
                        }
       
                UN_TA;
                IAPUEN &= ~0x01;       //APUEN = 0, disable APROM update
                UN_TA;
                CHPCON &= ~0x01;       //IAPEN = 0, disable IAP mode
                EA =1;
        }
tianxj01 发表于 2018-7-17 17:05 | 显示全部楼层
本帖最后由 tianxj01 于 2018-7-17 17:11 编辑

#define     PAGE_ERASE_AP    0x22 //页擦除命令
#define     BYTE_PROGRAM_AP  0x21 //字节编程命令
#define     UN_TA           TA=0xAA;TA=0X55#define     EEPROM_ADD      0x4700
#define     EEPROM_ADD_H    (u8)(EEPROM_ADD>>8)
#define     EEPROM_ADD_L    (u8)(EEPROM_ADD)
//====================================
void EE_WRITE (void)
        {
                u8 i;
                EA =0;
                UN_TA;
                CHPCON |= 0x01;    //IAPEN = 1, enable IAP mode CHPCON TA保护
                UN_TA;
                IAPUEN |= 0x01;    //APUEN = 1, enable APROM update,IAPUEN  TA保护
               
                IAPCN = PAGE_ERASE_AP;    //页擦除 4700h~477Fh
                IAPAH = EEPROM_ADD_H;
                IAPAL = EEPROM_ADD_L;
                IAPFD = 0xFF;
                UN_TA;
                IAPTRG |= 0x01;      //write ‘1’ to IAPGO to trigger IAP process
               
                IAPCN = BYTE_PROGRAM_AP;    // Program 201h with 55h
                IAPAH = EEPROM_ADD_H;
                IAPAL = EEPROM_ADD_L;
                //----=============开始字节编程=================--------------------
                for(i=0;i<3;i++)              
                        {
                                 IAPFD = SET_DATA>>8;              //被编程数据                                UN_TA;
                                IAPTRG |= 0x01;      //write ‘1’ to IAPGO to trigger IAP process
                                IAPAL++;
                                IAPFD = SET_DATA
;                 //被编程数据
                                UN_TA;
                                IAPTRG |= 0x01;      //write ‘1’ to IAPGO to trigger IAP process
                                IAPAL++;     
                        }
        
                UN_TA;
                IAPUEN &= ~0x01;       //APUEN = 0, disable APROM update
                UN_TA;
                CHPCON &= ~0x01;       //IAPEN = 0, disable IAP mode
                EA =1;
        }
tianxj01 发表于 2018-7-17 17:12 | 显示全部楼层
奇怪 ,不能贴代码了,然后还给我省略内容:
SET_DATA([i])变成SET_DATA;去掉小括号
xinpian101 发表于 2018-7-17 21:32 | 显示全部楼层
可以贴啊,你没有点贴代码那个东西。现在最新版1.05,还是1.06不清楚。
heisexingqisi 发表于 2018-7-17 23:33 | 显示全部楼层
  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 "N76E003.h"
  16. #include "Common.h"
  17. #include "Delay.h"
  18. #include "SFR_Macro.h"
  19. #include "Function_define.h"

  20. #define ADDR_BASE 0x4700

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

  108. /******************************************************************************************************************/       


  109. void main (void)
  110. {
  111.                 UINT8 datatemp;
  112.                 UINT16 system16highsite;
  113. /* -------------------------------------------------------------------------*/
  114. /*  Dataflash use APROM area, please ALWAYS care the address of you code    */
  115. /*        APROM 0x3800~0x38FF demo as dataflash                                                                                                     */
  116. /*         Please use Memory window key in C:0x3800 to check earse result                                        */             
  117. /* -------------------------------------------------------------------------*/
  118.                 InitialUART0_Timer1(115200);
  119. //call write byte
  120.                 write_DATAFLASH_BYTE (0x3802,0x34);
  121.                 write_DATAFLASH_BYTE (FLASH_L_LOW,0x55);
  122.                 write_DATAFLASH_BYTE (FLASH_L_HIGH,0x56);
  123.                 write_DATAFLASH_BYTE (FLASH_H_LOW,0xaa);
  124.                 write_DATAFLASH_BYTE (FLASH_H_HIGH,0x66);
  125. //call read byte
  126.                 datatemp = read_APROM_BYTE(0x3802);
  127.                 system16highsite = ((read_APROM_BYTE(FLASH_H_HIGH)<<8)+read_APROM_BYTE(FLASH_H_LOW));

  128.     while(1)
  129.                 {
  130. //                                printf ("\n data temp = 0x%bx", datatemp);
  131.                 }
  132. }
  133. //-----------------------------------------------------------------------------------------------------------
heisexingqisi 发表于 2018-7-17 23:33 | 显示全部楼层
忽悠我,这不是可以贴代码吗
tianxj01 发表于 2018-7-18 09:05 | 显示全部楼层
heisexingqisi 发表于 2018-7-17 23:33
忽悠我,这不是可以贴代码吗

怪事,点高级模式,反而没有代码入口了。普通模式到还留着代码按钮。
 楼主| xiaobao28 发表于 2018-7-18 09:47 | 显示全部楼层
 楼主| xiaobao28 发表于 2018-7-18 09:47 | 显示全部楼层
tianxj01 发表于 2018-7-17 17:05
#define     PAGE_ERASE_AP    0x22 //页擦除命令
#define     BYTE_PROGRAM_AP  0x21 //字节编程命令
#def ...

谢谢大侠
tianxj01 发表于 2018-7-18 09:52 | 显示全部楼层
本帖最后由 tianxj01 于 2018-7-18 10:07 编辑
  1. <div class="blockcode"><blockquote>#define BYTE_PROGRAM_AP 0x21 //字节编程命令
  2. #define UN_TA TA=0xAA;TA=0X55
  3. #define EEPROM_ADD 0x4700
  4. #define EEPROM_ADD_H (u8)(EEPROM_ADD>>8)
  5. #define EEPROM_ADD_L (u8)(EEPROM_ADD)
  6. //====================================
  7. void EE_WRITE (void)
  8. {
  9. u8 i;
  10. EA =0;
  11. UN_TA;
  12. CHPCON |= 0x01; //IAPEN = 1, enable IAP mode CHPCON TA保护
  13. UN_TA;
  14. IAPUEN |= 0x01; //APUEN = 1, enable APROM update,IAPUEN TA保护

  15. IAPCN = PAGE_ERASE_AP; //页擦除 4700h~477Fh
  16. IAPAH = EEPROM_ADD_H;
  17. IAPAL = EEPROM_ADD_L;
  18. IAPFD = 0xFF;
  19. UN_TA;
  20. IAPTRG |= 0x01; //write ‘1’ to IAPGO to trigger IAP process

  21. IAPCN = BYTE_PROGRAM_AP; // Program 201h with 55h
  22. IAPAH = EEPROM_ADD_H;
  23. IAPAL = EEPROM_ADD_L;
  24. //----=============开始字节编程=================--------------------
  25. for(i=0;i<3;i++)
  26. {
  27. IAPFD = SET_DATA[i]>>8; //被编程数据
  28. UN_TA;
  29. IAPTRG |= 0x01; //write ‘1’ to IAPGO to trigger IAP process
  30. IAPAL++;
  31. IAPFD = SET_DATA[i]; //被编程数据
  32. UN_TA;
  33. IAPTRG |= 0x01; //write ‘1’ to IAPGO to trigger IAP process
  34. IAPAL++;
  35. }

  36. UN_TA;
  37. IAPUEN &= ~0x01; //APUEN = 0, disable APROM update
  38. UN_TA;
  39. CHPCON &= ~0x01; //IAPEN = 0, disable IAP mode
  40. EA =1;
  41. }

Charlotte1 发表于 2018-7-18 10:10 | 显示全部楼层
提供专业的IC行业B2B电子商务、网络营销等互联网应用服务
jiekou001 发表于 2018-7-18 19:56 | 显示全部楼层
原版的例子跑起来行吗
caijie001 发表于 2018-7-18 20:06 | 显示全部楼层
一言不合就放代码
caijie001 发表于 2018-7-18 20:06 | 显示全部楼层
一言不合就放代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

25

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部