OpenEdv-开源电子网

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

关于用fmsc操作片外nand flash 的大量读写

[复制链接]

15

主题

46

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2014-5-10
在线时间
2 小时
发表于 2014-6-8 09:48:09 | 显示全部楼层 |阅读模式
5金钱
用的128M的nand flash  多页的读写都完成了,但是由于LCD显示图片的时候 ,图片数量有点多,我想先把图片代码存在flash里面,然后切换屏幕的时候 再去读,自己写了个写常量的函数- -不知道为啥感觉总和我的定义的数组读出来的不一样
[mw_shl_code=c,true]WriteReadAddr.Zone = 0x00;   WriteReadAddr.Block = 0x01;   WriteReadAddr.Page = 0x00; [/mw_shl_code] [mw_shl_code=c,true]FSMC_NAND_Writeconst(WriteReadAddr, 75);[/mw_shl_code] [mw_shl_code=c,true]
[mw_shl_code=c,true]uint32_t FSMC_NAND_Writeconst(NAND_ADDRESS Address, uint32_t NumPageToWrite) { uint32_t index = 0x00, numpagewritten = 0x00, addressstatus = NAND_VALID_ADDRESS; uint32_t status = NAND_READY, size = 0x00; while((NumPageToWrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY)) { /* Page write command and address */ *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM; *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00; *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0X00; *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS); *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS); /* Calculate the size */ size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpagewritten); /* Write data */ for(index=NAND_PAGE_SIZE * numpagewritten; index < size; index++) { *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA) =index; } *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM_TRUE; /* 读忙脚 */ // while( GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_6) == 0 ); /* Check status for successful operation */ status = FSMC_NAND_GetStatus(); if(status == NAND_READY) { numpagewritten++; NumPageToWrite--; /* Calculate Next small page Address */ addressstatus = FSMC_NAND_AddressIncrement(&Address); } } return (status | addressstatus); }[/mw_shl_code] [mw_shl_code=c,true]数组能有这么大static uint8_t Rx2 [153600];[/mw_shl_code] [mw_shl_code=c,true]然后用下面读最后一页- -读出来和数组不一样 - -不知道哪里错了[/mw_shl_code] [mw_shl_code=c,true]WriteReadAddr.Zone = 0x00;   WriteReadAddr.Block = 0x00;   WriteReadAddr.Page = 0x4a;   /* Read back the written data */   FSMC_NAND_ReadSmallPage (RxBuffer2, WriteReadAddr, 1);[/mw_shl_code] [mw_shl_code=c,true]uint32_t FSMC_NAND_ReadSmallPage(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumPageToRead) {   uint32_t index = 0x00, numpageread = 0x00, addressstatus = NAND_VALID_ADDRESS;   uint32_t status = NAND_READY, size = 0x00;   while((NumPageToRead != 0x0) && (addressstatus == NAND_VALID_ADDRESS))   {        /* Page Read command and page address */     *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_READ_1;          *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00;      *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0X00;      *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);       *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);            *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_READ_TRUE;          /* 读忙脚 */     //while( GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_6) == 0 );          /* Calculate the size */     size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpageread);      for(index=0; index < 0xff; index++);//延时     /* Get Data into Buffer */         for(index=NAND_PAGE_SIZE * numpageread; index < size; index++)     {       pBuffer[index-2]= *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);     }     numpageread++;          NumPageToRead--;     /* Calculate page address */                 addressstatus = FSMC_NAND_AddressIncrement(&Address);   }   status = FSMC_NAND_GetStatus();      return (status | addressstatus); } [/mw_shl_code]
[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

46

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2014-5-10
在线时间
2 小时
 楼主| 发表于 2014-6-8 17:19:09 | 显示全部楼层
nand flash 的大批量读写 有人做过吗?难道要参考U盘历程?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-6-8 22:48:40 | 显示全部楼层
回复【2楼】霉是全方面的:
---------------------------------
NAND有坏区,你这个有坏区管理么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2014-6-9 12:18:54 | 显示全部楼层
做一个最简单的坏区管理
1. 做一个数组 记录坏区表
2. 扫描整个flash 得到坏块数目
3. 记录坏块表 然后用好的地址替换
4.每次读写擦flash都检查一下表 如果是坏块地址就对地址替换下 
5. 只需扫描一次坏块表 然后表存起来 
6.开机加载坏块表

不知道我买的nand flash是否差 每片进行扫描 都可以找到有 N块 是坏区的 N小于20  最多情况是1-5  呵 后来就做了管理  。
我扫描的坏块表现为   写入一个数 读出来是 0xff  就是不能写入 
回复

使用道具 举报

15

主题

46

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2014-5-10
在线时间
2 小时
 楼主| 发表于 2014-6-9 16:49:16 | 显示全部楼层
回复【3楼】正点原子:
--------------------------------
fsmc 里面的ECC效验不行吗? 难道是我理解错了
回复

使用道具 举报

15

主题

46

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2014-5-10
在线时间
2 小时
 楼主| 发表于 2014-6-9 16:50:16 | 显示全部楼层
回复【4楼】simms01:
---------------------------------
但是我对最后一页写1到ff,最后都能读出来1—ff。。。。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-6-9 22:08:14 | 显示全部楼层
回复【5楼】霉是全方面的:
---------------------------------
这个应该不行,没用过ECC功能.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

118

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3060
金钱
3060
注册时间
2015-12-20
在线时间
299 小时
发表于 2018-2-9 11:30:32 | 显示全部楼层
楼主,能把代码分享一下吗?我也想研究研究nand flash,自己写的初始化函数,运行老是死机。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 09:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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