OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2988|回复: 2

nandflash子函数内指针问题。

[复制链接]

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2016-3-22
在线时间
41 小时
发表于 2016-9-4 20:15:48 | 显示全部楼层 |阅读模式
5金钱
本人最近在学习nandflash,用的是阿波罗的代码,但是测试是数据总是输处错误,不是数据读错,而是子函数返回不了正确值,原本是将输入的数组指正赋给一个函数内的指针然后依次读取数据存放(*(vu8*)pBuffer= *(vu8*)FSMC_Bank_NAND;),但最后出来的数据都是181。之后我无意间将读出来的数据给了一个u8型的变量也没把他输出(d= *(vu8*)FSMC_Bank_NAND;),最后结果反而输出了正确的结果,这让我很困惑。希望大家能帮我找找原因。
       
调用
pbuf=mymalloc(SRAMIN,2113);  
sta=NAND_ReadPage(pagenum,colnum,&pbuf[0],readbytes);        //¶áè¡êy¾Y



//函数
u8 NAND_ReadPage(u32 PageNum,u16 ColNum,u8 *pBuffer,u16 NumByteToRead)
{
    vu16 i=0;
        u8 res=0;
        u8 eccnum=0;                //Dèòa¼ÆËãμÄECC¸öêy£¬Ã¿NAND_ECC_SECTOR_SIZE×Ö½ú¼ÆËãò»¸öecc
        u8 eccstart=0;                //μúò»¸öECCÖμËùêôμÄμØÖ··¶Î§
        u8 errsta=0;
        u8 *p;
      u8 d;
    *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_READ_1;
    *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = (u8)ColNum;  
    *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = (u8)(ColNum>>8);
    *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = (u8)PageNum;
    *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = (u8)(PageNum>>8);
          *(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = (u8)(PageNum>>16);
    *(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_READ_TRUE;
    res=NAND_WaitRB(0);                        //μè′yRB=0
    if(res)return NSTA_TIMEOUT;        //3¬ê±íË3ö
    //ÏÂÃæ2DD′úÂëêÇÕæÕyÅD¶ÏNANDêÇ·ñ×¼±¸oÃμÄ
        res=NAND_WaitRB(1);                        //μè′yRB=1
    if(res)return NSTA_TIMEOUT;        //3¬ê±íË3ö

    if(NumByteToRead%NAND_ECC_SECTOR_SIZE)//2»êÇNAND_ECC_SECTOR_SIZEμÄÕûêy±¶£¬2»½øDDECCD£Ñé
        {
                //¶áè¡NAND FLASHÖDμÄÖμ
                for(i=0;i<NumByteToRead;i++)
                {
                        d= *(vu8*)FSMC_Bank_NAND;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

                }
        }
    else
    {
         eccnum=NumByteToRead/NAND_ECC_SECTOR_SIZE;                        //μ&#195;μ&#189;ecc&#188;&#198;&#203;&#227;′&#206;êy
                 eccstart=ColNum/NAND_ECC_SECTOR_SIZE;

                 p=pBuffer;//&#189;&#171;pBufferμ&#196;μ&#216;&#214;·&#184;&#248; p

        for(res=0;res<eccnum;res++)
                {   

                        FSMC_Bank2->PCR2|=1<<6;                                                //ê1&#196;üECCD£&#209;é
                        for(i=0;i<NAND_ECC_SECTOR_SIZE;i++)                                //&#182;áè&#161;NAND_ECC_SECTOR_SIZE&#184;&#246;êy&#190;Y
                        {   
                d= *(vu8*)(FSMC_Bank_NAND);/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////                               
                        }

            for (i=0;i<512;i++)
            {
                delay_ms (10);
                LCD_ShowNum(0,100,pBuffer[i],4,24);  //&#196;úèYè&#171;ê&#199;181£&#187;′í&#206;ó
                LCD_ShowNum(50,100,i,4,24);
            }  

                        while(!(FSMC_Bank2->SR2&(1<<6)));                                //μè′yFIFO&#191;&#213;       
                        nand_dev.ecc_hdbuf[res+eccstart]=FSMC_Bank2->ECCR2;//&#182;áè&#161;ó2&#188;t&#188;&#198;&#203;&#227;oóμ&#196;ECC&#214;μ      
            FSMC_Bank2->PCR2&=~(1<<6);                                                //&#189;&#251;&#214;1ECCD£&#209;é
                }     
                i=nand_dev.page_mainsize+0X10+eccstart*4;                        //′óspare&#199;&#248;μ&#196;0X10&#206;&#187;&#214;&#195;&#191;aê&#188;&#182;áè&#161;&#214;&#174;&#199;°′&#230;′¢μ&#196;ecc&#214;μ
                NAND_Delay(30);//μè′ytADL
                *(vu8*)(FSMC_Bank_NAND|NAND_CMD)=0X05;                                //&#203;&#230;&#187;ú&#182;á&#214;&#184;á&#238;
                //·¢&#203;íμ&#216;&#214;·
                *(vu8*)(FSMC_Bank_NAND|NAND_ADDR)=(u8)i;
                *(vu8*)(FSMC_Bank_NAND|NAND_ADDR)=(u8)(i>>8);
                *(vu8*)(FSMC_Bank_NAND|NAND_CMD)=0XE0;                                //&#191;aê&#188;&#182;áêy&#190;Y

                NAND_Delay(30);//μè′ytADL
            pBuffer=(u8*)&nand_dev.ecc_rdbuf[eccstart];       
        for(i=0;i<4*eccnum;i++)                                                                //&#182;áè&#161;±£′&#230;μ&#196;ECC&#214;μ
                {
            d= *(vu8*)FSMC_Bank_NAND;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////     
                }

                for(i=0;i<eccnum;i++)                                                                //&#188;ì&#209;éECC
                {
                        if(nand_dev.ecc_rdbuf[i+eccstart]!=nand_dev.ecc_hdbuf[i+eccstart])//2&#187;&#207;àμè,DèòaD£&#213;y
                        {

                                res=NAND_ECC_Correction(p+NAND_ECC_SECTOR_SIZE*i,nand_dev.ecc_rdbuf[i+eccstart],nand_dev.ecc_hdbuf[i+eccstart]);//ECCD£&#209;é
                                if(res)errsta=NSTA_ECC2BITERR;                                //±ê&#188;&#199;2BIT&#188;°ò&#212;é&#207;ECC′í&#206;ó
                                else errsta=NSTA_ECC1BITERR;                                //±ê&#188;&#199;1BIT ECC′í&#206;ó
                        }
        }
    }

    if(NAND_WaitForReady()!=NSTA_READY)errsta=NSTA_ERROR;        //ê§°ü
    pBuffer=p;
    return errsta;
}

最佳答案

查看完整内容[请看2#楼]

问题已经解决了,帖子删不了,就在这说一下原因,本质问题是nandflash的fsmc地址被我写错了,后面写常量成功的原因是因为在写数据时我申请了以个空间,之后又被我释放掉了,但数据依然在里面。在读数据时我又申请了一个大小相同的空间。分配的地址还是之前写数据分配的地址,所以只要不做处理里面读出来的数据就是写入的数据。给人照成了nandflash读写没问题的错觉。心累啊,不说了,泪已滑落脸颊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2016-3-22
在线时间
41 小时
 楼主| 发表于 2016-9-4 20:15:49 | 显示全部楼层
问题已经解决了,帖子删不了,就在这说一下原因,本质问题是nandflash的fsmc地址被我写错了,后面写常量成功的原因是因为在写数据时我申请了以个空间,之后又被我释放掉了,但数据依然在里面。在读数据时我又申请了一个大小相同的空间。分配的地址还是之前写数据分配的地址,所以只要不做处理里面读出来的数据就是写入的数据。给人照成了nandflash读写没问题的错觉。心累啊,不说了,泪已滑落脸颊
回复

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2016-3-22
在线时间
41 小时
 楼主| 发表于 2016-9-4 20:19:56 | 显示全部楼层
如果直接*(vu8*)pBuffer= 常数;也可以有正确结果输出。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 18:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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