打印
[技术问答]

IAP_Dataflash_EEPROM例程读出为0,是程序的问题吗

[复制链接]
2006|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kt98741|  楼主 | 2018-5-18 17:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用的N76E003芯片,下载了最新版2017版的IAP_Dataflash_EEPROM,测试任何值写入,再读都为0,找了2016版的例程测试,读出数据正确,仔细对比了代码,发现两个版本有一些不同

2017版
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;
}       



2016版
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;
}       

新版修改那4个数值是什么意义?
沙发
dongnanxibei| | 2018-5-18 21:27 | 只看该作者
不太清楚,既然新版改的不能用,还是继续用老板。

使用特权

评论回复
板凳
huangcunxiake| | 2018-5-19 10:07 | 只看该作者
找到能用的就好。谁知道他们为什么改呢,说不定是个要辞职的员工,故意修错的。

使用特权

评论回复
地板
hj007| | 2018-5-19 15:57 | 只看该作者
本帖最后由 hj007 于 2018-5-19 15:58 编辑

楼主你好!
对于这个问题我或许略知一二首先查看N76E003的数据手册得知这颗芯片的XRAM的大小为:768字节,即大小为0x300(N76E616为256字节)另外还可知道Flash每一页的大小为128字节(N76E616为256字节)。
在擦除一页Flash之前先要保存这一页Flash,也就是说要保存128字节的内容,所以2016版的例程就使用了XRAM的最后128字节的来保存Flash,可从下面这段代码看出
        xd_tmp = 0x280;
        cd_longaddr = (u16_addr&0xff00)+u8_addrl_r;        
        while (xd_tmp !=0x300)

所以楼主说的第一个不同点和第二个不同点是因为XRAM大小不同而不一样。
而后面的不同都是一样的。

使用特权

评论回复
5
wahahaheihei| | 2018-5-19 22:11 | 只看该作者
楼上研究的深入啊。

使用特权

评论回复
6
wahahaheihei| | 2018-5-19 22:11 | 只看该作者
楼主说的是003,那么到底看的例子是哪个的。

使用特权

评论回复
7
yiy| | 2018-5-20 11:59 | 只看该作者
你确认是003的例子?

使用特权

评论回复
8
xixi2017| | 2018-5-20 23:13 | 只看该作者
是不是地址有问题。

使用特权

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

本版积分规则

25

主题

51

帖子

1

粉丝