OpenEdv-开源电子网

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

nand flash从f429移植到f407的问题

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2018-9-28
在线时间
5 小时
发表于 2020-12-9 18:25:42 | 显示全部楼层 |阅读模式
1金钱
请教一下各位大神,我的板子上mcu是stm32f407,nand flash型号为MT29F4G08,挂接在NCE2上,程序是从stm32f429(阿波罗)的“实验40 NAND FLASH实验”移植过来的,移植过程中代码做了以下几个修改:
1、nand.c中修改如下:
    NAND_Handler.Init.NandBank=FSMC_NAND_BANK2;   // NAND挂在BANK2上,f429的nand挂接在NCE3上
2、nand.h中修改如下:
    #define NAND_ADDRESS         0X70000000        //nand flash的访问地址,接NCE2,地址为:0X7000 0000
3、nand.c中修改如下:
    //初始化PD7 NCE2引脚
    GPIO_Initure.Pin=GPIO_PIN_7;                          //f429的NCE3为PG9,这里f407为PD7
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;         //输入
    GPIO_Initure.Pull=GPIO_NOPULL;                    //上拉         
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;         //高速
    GPIO_Initure.Alternate=GPIO_AF12_FSMC;      //复用为FMC
    HAL_GPIO_Init(GPIOD,&GPIO_Initure);
4、nand.c中所有“FMC”替换为“FSMC”;

程序当前能读取deviceID,结果也没问题,但是创建LUT表始终不成功,nand_dev.valid_blocknum的结果始终为0,不知道问题出在哪里?

最佳答案

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

谢谢你的回复,我后来走投无路之下重新移植了一次,然后就能用了,也不知道为什么。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2018-9-28
在线时间
5 小时
 楼主| 发表于 2020-12-9 18:25:43 | 显示全部楼层
zbxymail2529087 发表于 2021-1-14 15:32
重新格式化下flash试下

谢谢你的回复,我后来走投无路之下重新移植了一次,然后就能用了,也不知道为什么。
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2018-9-28
在线时间
5 小时
 楼主| 发表于 2020-12-9 18:27:48 | 显示全部楼层
本帖最后由 shxsxlh 于 2020-12-9 18:30 编辑

// 重新创建LUT表
// mode:0,仅检查第一个坏块标记
//      1,两个坏块标记都要检查(备份区也要检查)
// 返回值:0,成功
//     其他,失败
u8 FTL_CreateLUT(u8 mode)
{
    u32 i;
    u8 buf[4];
    u32 LBNnum=0;                                                                // 逻辑块号
    for(i=0;i<nand_dev.block_totalnum;i++)                // 复位LUT表,初始化为无效值,也就是0XFFFF
    {
        nand_dev.lut=0XFFFF;
   
}
        nand_dev.good_blocknum=0;
    for(i=0;i<nand_dev.block_totalnum;i++)
    {
                NAND_ReadSpare(i*nand_dev.block_pagenum,0,buf,4);        // 读取4个字节
                if(buf[0]==0XFF&&mode)NAND_ReadSpare(i*nand_dev.block_pagenum+1,0,buf,1);// 好块,且需要检查2次坏块标记
                if(buf[0]==0XFF)// 是好块                                 
        {
                        LBNnum=((u16)buf[3]<<8)+buf[2];                // 得到逻辑块编号
            if(LBNnum<nand_dev.block_totalnum)        // 逻辑块号肯定小于总的块数量
            {
                nand_dev.lut[LBNnum]=i;                        // 更新LUT表,写LBNnum对应的物理块编号
            }
                        nand_dev.good_blocknum++;
                }else printf("bad block index:%d\r\n",i);
    }
    // LUT表建立完成以后检查有效块个数
    for(i=0;i<nand_dev.block_totalnum;i++)
    {
        if(nand_dev.lut>=nand_dev.block_totalnum)
        {
            nand_dev.valid_blocknum=i;
            break;
        }
    }                                                                           // 有效块数始终为0,不知道为什么,这个函数的代码都没有改
    if(nand_dev.valid_blocknum<100)return 2;        // 有效块数小于100,有问题.需要重新格式化
    return 0;        // LUT表创建完成
}

贴一下创建LUT表的函数,函数执行到末尾时,nand_dev.valid_blocknum始终为0,导致无法创建LUT表
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2021-1-14
在线时间
0 小时
发表于 2021-1-14 15:32:39 | 显示全部楼层
shxsxlh 发表于 2020-12-9 18:27
// 重新创建LUT表
// mode:0,仅检查第一个坏块标记
//      1,两个坏块标记都要检查(备份区也要检查)

重新格式化下flash试下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 12:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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