打印
[STM32F1]

stm32f103zet6读取nandflash有误

[复制链接]
1237|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 小猫薄薄 于 2014-10-21 14:58 编辑

nandflash的型号是  HY27UF081G2A,  128MB

命令参数如下图

这个芯片的页大小是2k的,修改了固件库中fsmc那部分的代码
写函数如下

uint32_t NAND_WriteBigPage(uint8_t *pBuffer,NAND_ADDRESS Address,uint32_t NumPageToWrite){
        uint32_t index = 0x00, numpagewritten = 0x00, addressstatus = NAND_VALID_ADDRESS;
        uint32_t  status = NAND_READY, size = 0x00;
        
        while((addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY) && (NumPageToWrite != 0)){
                *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE0;
               
                *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00;
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0X00;
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);
               
                size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpagewritten);   /*ͳ¼ÆдÈëµÄ¸öÊý*/
               
                for(;index < size;index++){
                        *(__IO uint8_t *)(Bank_NAND_ADDR | DATA_AREA) = pBuffer[index];  
                }
               
               
                *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE_TRUE1;
                status = NAND_GetStatus();//µÃµ½flashµÄµ±Ç°×´Ì¬
               
                if(status == NAND_READY){
                        numpagewritten++;
                        NumPageToWrite--;
                        
                        addressstatus = NAND_AddressIncrement(&Address);
                }
        }
         return (status | addressstatus);
}

读flash的函数如下
uint32_t NAND_ReadBigPage(uint8_t *pBuffer,NAND_ADDRESS Address,uint32_t NumPageToWrite){
        uint32_t index = 0x00, numpagewritten = 0x00, addressstatus = NAND_VALID_ADDRESS;
        uint32_t  status = NAND_READY, size = 0x00;
        
        while((addressstatus == NAND_VALID_ADDRESS) && (NumPageToWrite != 0)){
                *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_A;
               
                *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00;
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0X00;
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);
               
                *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_TRUE1;
               
                while(GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_6) == 0 ){};
                size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpagewritten);   /*ͳ¼Æ¶Á³öµÄ¸öÊý*/
               
                for(;index < size;index++){
                        pBuffer[index] = *(__IO uint8_t *)(Bank_NAND_ADDR | DATA_AREA);
                }
               
                        numpagewritten++;
                        NumPageToWrite--;
                        
                        addressstatus = NAND_AddressIncrement(&Address);
        }
         status = NAND_GetStatus();
         return (status | addressstatus);
}

主函数中将一组连续的数列101.102.103.104,........ 写入到第0页中,然后读出来校验,串口显示的结果却是一个固定值。结果如下图


单步调试的时候在单步到写的时候 地址0x70000000中的内容如下图

为什么都是一个数呀
搞了一天多了 实在不知是什么原因,请各位高手帮忙给看下





沙发
搞IT的| | 2014-10-21 23:22 | 只看该作者
写入Flash字符不知道是不是有点问题啊!!!

使用特权

评论回复
板凳
小猫薄薄|  楼主 | 2014-10-22 21:02 | 只看该作者
搞IT的 发表于 2014-10-21 23:22
写入Flash字符不知道是不是有点问题啊!!!

问题找到了 是读取flash状态寄存器的时候出错了

使用特权

评论回复
地板
搞IT的| | 2014-11-13 15:19 | 只看该作者
小猫薄薄 发表于 2014-10-22 21:02
问题找到了 是读取flash状态寄存器的时候出错了

哈哈,那就好啊。。。:handshake

使用特权

评论回复
5
290978075| | 2015-1-8 16:13 | 只看该作者
你好,我的也是这个问题,芯片是K9F1G08B0C,不知道大神怎么解决的,指导一下,非常感谢

使用特权

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

本版积分规则

8

主题

21

帖子

0

粉丝