[技术问答] EEPROM的例程更改问题

[复制链接]
1578|8
 楼主| 北辰极界 发表于 2018-3-5 21:06 | 显示全部楼层 |阅读模式
UINT8 read_APROM_BYTE(unsigned int 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);
}




UINT8 read_APROM_BYTE(unsigned int code *u16_addr)
{
  
        UINT8 rdata;
        rdata = *(0x3800+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(0x82);
    while(1);
}


前一个程序是例程 后面的是改动两个部分改动的就是读取的方法地址一个是直接赋值  另外一个由相加确定  为什么不能实现读取???
还有读取的时候的地址不能附变量吗???

想要将例程的改为下面的可变地址需要怎么改
小明的同学 发表于 2018-3-5 21:33 | 显示全部楼层
不知道啊,肯定是跟人家的读取方式不同吧

评论

我这个有点看不懂其实  发表于 2018-3-6 19:44
幸福小强 发表于 2018-3-6 11:08 | 显示全部楼层
还按照人家的方法吧。

评论

按照人家的方法要是可以实现其他的我当然是按照他的  发表于 2018-3-6 19:44
捉虫天师 发表于 2018-3-7 09:10 | 显示全部楼层
直接调用人家的函数就行了,修改地址,其他不动。
捉虫天师 发表于 2018-3-7 09:11 | 显示全部楼层
另外这个写操作应该还需要解除保护和写保护
lizhenming 发表于 2018-5-29 08:51 | 显示全部楼层
老兄,发现到底是什么原因导致吗?我也遇到和你一样的问题,改成地址相加的情况,就有问题了
hj007 发表于 2018-5-31 17:04 | 显示全部楼层
UINT8 read_APROM_BYTE(unsigned char code *u8_addr)
{
        UINT8 rdata;
        rdata = *(0x3800+(unsigned int)u8_addr)>>8;
        return rdata;
}


改成这样试一试!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

141

帖子

0

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