FATFS管理nandflash存储图片

2019-07-20 04:23发布

如题哦,从ucos,到lwip,到摄像头,到指纹,到sdram,一步步的太艰苦,现在到了nandflash这块,之后还有emwin,回归主题,问如何用FATFS管理nandflash存储图片,我获得的图片方式是一行一行的缓存在sdram,sdram中有完整的图片,这个管理系统麻烦大神告诉我一下大概怎么使用就行啦,详细的我会继续研究,就是第一次接触,想听听大神建议及思路,如果不用文件管理系统,我的图片每行是480个字节,分辨率是480*320,用的是原子的f767核心板上的nandflash,29f4g一页flash是2k+64字节,那样一页存4行数据,用80页就能存一张图,但是擦除只能按block擦除,咦有点不对劲,不必担心多余擦除的问题,我用2个block存一张图片,擦除也就擦除2个block,这样空间虽然浪费太多,不知可行不可行。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
25条回答
kbq1950361006
2019-07-20 19:46
正点原子 发表于 2018-3-19 16:28
你用我们提供的代码就行了。 我们提供的FTL层,就支持FATFS管理nandflash,原理什么的,我也都讲了,看教程 ...

原子哥,再问个问题,这个函数,数据传输是8位额,可不可以改成16位传输的[mw_shl_code=c,true]u8 FTL_WriteSectors(u8 *pBuffer,u32 SectorNo,u16 SectorSize,u32 SectorCount)
{
    u8 flag=0;
        u16 temp;
    u32 i=0;
        u16 wsecs;                //D′ò3′óD¡
        u32 wlen;                //D′èë3¤¶è
    u32 LBNNo;      //Âß¼-¿éoÅ
    u32 PBNNo;      //Îïàí¿éoÅ
    u32 PhyPageNo;  //Îïàíò3oÅ
    u32 PageOffset; //ò3ÄúÆ«òÆμØÖ·
    u32 BlockOffset;//¿éÄúÆ«òÆμØÖ·
        u32 markdpbn=0XFFFFFFFF;                //±ê¼ÇáËμÄÎïàí¿é±àoÅ  
        for(i=0;i<SectorCount;i++)
    {
        LBNNo=(SectorNo+i)/(nand_dev.block_pagenum*(nand_dev.page_mainsize/SectorSize));//&#184;ù&#190;Y&#194;&#223;&#188;-éè&#199;&#248;o&#197;oíéè&#199;&#248;′óD&#161;&#188;&#198;&#203;&#227;3&#246;&#194;&#223;&#188;-&#191;éo&#197;
        PBNNo=FTL_LBNToPBN(LBNNo);                                        //&#189;&#171;&#194;&#223;&#188;-&#191;é×a&#187;&#187;&#206;a&#206;&#239;àí&#191;é
        if(PBNNo>=nand_dev.block_totalnum)return 1;        //&#206;&#239;àí&#191;éo&#197;′óóúNAND FLASHμ&#196;×ü&#191;éêy,&#212;ò꧰ü.
        BlockOffset=((SectorNo+i)%(nand_dev.block_pagenum*(nand_dev.page_mainsize/SectorSize)))*SectorSize;//&#188;&#198;&#203;&#227;&#191;é&#196;ú&#198;&#171;ò&#198;
        PhyPageNo=PBNNo*nand_dev.block_pagenum+BlockOffset/nand_dev.page_mainsize;        //&#188;&#198;&#203;&#227;3&#246;&#206;&#239;àíò3o&#197;
        PageOffset=BlockOffset%nand_dev.page_mainsize;                                                                //&#188;&#198;&#203;&#227;3&#246;ò3&#196;ú&#198;&#171;ò&#198;μ&#216;&#214;·
                temp=nand_dev.page_mainsize-PageOffset;        //page&#196;úê£óà×&#214;&#189;úêy
                temp/=SectorSize;                                                //&#191;éò&#212;á&#172;D&#248;D′è&#235;μ&#196;sectorêy
                wsecs=SectorCount-i;                                        //&#187;1ê£&#182;àéù&#184;&#246;sectoròaD′
                if(wsecs>=temp)wsecs=temp;                                //′óóú&#191;éá&#172;D&#248;D′è&#235;μ&#196;sectorêy,&#212;òD′è&#235;temp&#184;&#246;éè&#199;&#248;  
                wlen=wsecs*SectorSize;                                        //&#195;&#191;′&#206;D′wsecs&#184;&#246;sector  
                //&#182;á3&#246;D′è&#235;′óD&#161;μ&#196;&#196;úèY&#197;D&#182;&#207;ê&#199;·&#241;è&#171;&#206;a0XFF
                flag=NAND_ReadPageComp(PhyPageNo,PageOffset,0XFFFFFFFF,wlen/4,&temp);                //&#182;áò&#187;&#184;&#246;wlen/4′óD&#161;&#184;&#246;êy&#190;Y,2¢ó&#235;0XFFFFFFFF&#182;&#212;±è
                if(flag)return 2;                                                //&#182;áD′′í&#206;ó£&#172;&#187;μ&#191;é
                if(temp==(wlen/4)) flag=NAND_WritePage(PhyPageNo,PageOffset,pBuffer,wlen);        //è&#171;&#206;a0XFF,&#191;éò&#212;&#214;±&#189;óD′êy&#190;Y
                else flag=1;                                                        //2&#187;è&#171;ê&#199;0XFF,&#212;òáí×÷′|àí
                if(flag==0&&(markdpbn!=PBNNo))                        //è&#171;ê&#199;0XFF,&#199;òD′è&#235;3é1|,&#199;ò±ê&#188;&#199;á&#203;μ&#196;&#206;&#239;àí&#191;éó&#235;μ±&#199;°&#206;&#239;àí&#191;é2&#187;í&#172;
                {
                        flag=FTL_UsedBlockMark(PBNNo);                //±ê&#188;&#199;′&#203;&#191;éò&#209;&#190;-ê1ó&#195;  
                        markdpbn=PBNNo;                                                //±ê&#188;&#199;íê3é,±ê&#188;&#199;&#191;é=μ±&#199;°&#191;é,·à&#214;1&#214;&#216;&#184;′±ê&#188;&#199;
                }
                if(flag)//2&#187;è&#171;&#206;a0XFF/±ê&#188;&#199;꧰ü£&#172;&#189;&#171;êy&#190;YD′μ&#189;áíò&#187;&#184;&#246;&#191;é   
        {
                        temp=((u32)nand_dev.block_pagenum*nand_dev.page_mainsize-BlockOffset)/SectorSize;//&#188;&#198;&#203;&#227;&#213;&#251;&#184;&#246;block&#187;1ê£&#207;&#194;&#182;àéù&#184;&#246;SECTOR&#191;éò&#212;D′è&#235;
                        wsecs=SectorCount-i;                                //&#187;1ê£&#182;àéù&#184;&#246;sectoròaD′
                        if(wsecs>=temp)wsecs=temp;                        //′óóú&#191;éá&#172;D&#248;D′è&#235;μ&#196;sectorêy,&#212;òD′è&#235;temp&#184;&#246;éè&#199;&#248;
                        wlen=wsecs*SectorSize;                                //&#195;&#191;′&#206;D′wsecs&#184;&#246;sector   
            flag=FTL_CopyAndWriteToBlock(PhyPageNo,PageOffset,pBuffer,wlen);//&#191;&#189;±′μ&#189;áííaò&#187;&#184;&#246;block,2¢D′è&#235;êy&#190;Y
            if(flag)return 3;//꧰ü
        }
                i+=wsecs-1;
                pBuffer+=wlen;//êy&#190;Y&#187;o3&#229;&#199;&#248;&#214;&#184;&#213;&#235;&#198;&#171;ò&#198;
    }
    return 0;   
}[/mw_shl_code]

一周热门 更多>