打印
[技术问答]

N76E003 IAP模拟EEP的问题

[复制链接]
2003|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;去掉小括号

使用特权

评论回复
5
xinpian101| | 2018-7-17 21:32 | 只看该作者
可以贴啊,你没有点贴代码那个东西。现在最新版1.05,还是1.06不清楚。

使用特权

评论回复
6
heisexingqisi| | 2018-7-17 23:33 | 只看该作者
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* 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 "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"

#define ADDR_BASE 0x4700

#define FLASH_L_LOW                        ADDR_BASE+1
#define FLASH_L_HIGH                ADDR_BASE+2
#define FLASH_H_LOW                        ADDR_BASE+3
#define FLASH_H_HIGH                ADDR_BASE+4
/*****************************************************************************************************************
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 = 0x280;
        cd_longaddr = (u16_addr&0xff00)+u8_addrl_r;       
        while (xd_tmp !=0x300)
        {
                *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+0x280;
        }
        else
        {
                xd_tmp = u8_addrl_r+0x200;
        }
        *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 !=0x2FF)
                {
                        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;
                UINT16 system16highsite;
/* -------------------------------------------------------------------------*/
/*  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 (0x3802,0x34);
                write_DATAFLASH_BYTE (FLASH_L_LOW,0x55);
                write_DATAFLASH_BYTE (FLASH_L_HIGH,0x56);
                write_DATAFLASH_BYTE (FLASH_H_LOW,0xaa);
                write_DATAFLASH_BYTE (FLASH_H_HIGH,0x66);
//call read byte
                datatemp = read_APROM_BYTE(0x3802);
                system16highsite = ((read_APROM_BYTE(FLASH_H_HIGH)<<8)+read_APROM_BYTE(FLASH_H_LOW));

    while(1)
                {
//                                printf ("\n data temp = 0x%bx", datatemp);
                }
}
//-----------------------------------------------------------------------------------------------------------

使用特权

评论回复
7
heisexingqisi| | 2018-7-17 23:33 | 只看该作者
忽悠我,这不是可以贴代码吗

使用特权

评论回复
8
tianxj01| | 2018-7-18 09:05 | 只看该作者
heisexingqisi 发表于 2018-7-17 23:33
忽悠我,这不是可以贴代码吗

怪事,点高级模式,反而没有代码入口了。普通模式到还留着代码按钮。

使用特权

评论回复
9
xiaobao28|  楼主 | 2018-7-18 09:47 | 只看该作者

使用特权

评论回复
10
xiaobao28|  楼主 | 2018-7-18 09:47 | 只看该作者
tianxj01 发表于 2018-7-17 17:05
#define     PAGE_ERASE_AP    0x22 //页擦除命令
#define     BYTE_PROGRAM_AP  0x21 //字节编程命令
#def ...

谢谢大侠

使用特权

评论回复
11
tianxj01| | 2018-7-18 09:52 | 只看该作者
本帖最后由 tianxj01 于 2018-7-18 10:07 编辑
<div class="blockcode"><blockquote>#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[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;
}

使用特权

评论回复
12
Charlotte1| | 2018-7-18 10:10 | 只看该作者
提供专业的IC行业B2B电子商务、网络营销等互联网应用服务

使用特权

评论回复
13
jiekou001| | 2018-7-18 19:56 | 只看该作者
原版的例子跑起来行吗

使用特权

评论回复
14
caijie001| | 2018-7-18 20:06 | 只看该作者
一言不合就放代码

使用特权

评论回复
15
caijie001| | 2018-7-18 20:06 | 只看该作者
一言不合就放代码

使用特权

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

本版积分规则

4

主题

25

帖子

1

粉丝