打印

Nand Flash 实时存储中遇到的问题

[复制链接]
2148|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
davidteng10|  楼主 | 2013-3-7 13:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠,小弟是玩STM32的新手,在做一个项目中需要用STM32F10x系列大容量的片子挂一个1G的nand flash。
存储过程是通过定时器中断按一个比较高的频率采样(比如100KHz),把AD的读数往一个BUF数组里存,存满flash一个Page的大小就往Flash里烧。由于写一个Page需要至少200us,所以不得不在烧的过程中继续接受定时器的中断。可这样的话最后从flash里读出来的数据,平均每页会丢一两百个(2048个8Bit一页的)。大家有啥好的方法吗?
沙发
davidteng10|  楼主 | 2013-3-7 13:56 | 只看该作者
补充,我自己分析应该是时序上的问题,不过因为第一次用,也不排除是flash有坏块,那个ECC还在研究,不知道怎么用呢。
不过从数据丢失的多少来看,应该不是坏块,总不会一页里有5%以上都是坏块吧。
还有,数据上看明显是丢数,不是误码。

使用特权

评论回复
板凳
davidteng10|  楼主 | 2013-3-7 15:01 | 只看该作者
木有人有办法吗?
刚又测试了下,基本找到问题在哪了,就是在FSMC_NAND_WriteSmallPage里送数据那儿

uint32_t FSMC_NAND_WriteSmallPage(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumPageToWrite)
{
。。。。。。
。。。。。。前面一堆定义 计算和送地址
/* Write data */
    for(; index < size; index++)
    {
      *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA) = pBuffer[index];
    }
   
    *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM_TRUE;

    /* 读忙脚 */
    while( GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_6) == 0 );

。。。。
。。。。后面的一堆
}
就在送字节中出了TIMx的中断,所以导致了丢数据,这个怎么搞咧。。。

使用特权

评论回复
地板
jlass| | 2013-3-7 17:34 | 只看该作者
用多线程试试

速度不行的话好想没法解决啊,如果有DMA可以用,倒是可以用DMA来传

使用特权

评论回复
5
hawksabre| | 2013-3-7 17:36 | 只看该作者
木有玩过这个  呵呵   帮你顶一个   呵呵   顶起来   有钱出钱  有力出力  呵呵   

使用特权

评论回复
6
davidteng10|  楼主 | 2013-3-9 11:56 | 只看该作者
后来又优化了优化,发现nand flash的WritePage是可以中途中断的,这也算是我这个新手的一点经验吧,对需要较高数据获取率且要实时存储的同志们希望能有帮助。

使用特权

评论回复
7
明月小厨| | 2013-3-9 13:00 | 只看该作者
写一个Page需要至少200us;是什么型号,写的速度这么快;太牛X了;

使用特权

评论回复
8
cjhk| | 2013-3-9 20:41 | 只看该作者
使用flash这一块  还没有怎么深入过   这个需要抽时间好好看一看  很不错的学习帖子  有空需要好好学一学  谢谢了  楼主  谢谢

使用特权

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

本版积分规则

6

主题

16

帖子

1

粉丝