OpenEdv-开源电子网

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

关于STM32F103驱动NAND FLASH并模拟U盘(加载文件系统)

[复制链接]

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2015-4-27
在线时间
39 小时
发表于 2016-10-28 15:41:28 | 显示全部楼层 |阅读模式
25金钱
在官网上面下载了一个NAND FLASH并加载了文件系统。现在U盘模拟成功,文件读写正常。但是呢!我现在想把U盘的容量减小点,以留点内存处理其他事情。我的NAND FLASH是64M的。我分别注意到了这三个函数。在mass_mal.c的文件下有三个函数
***************************1*******************
uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length)  函数1

uint16_t MAL_Read(uint8_t lun, uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length)  函数2

uint16_t MAL_GetStatus (uint8_t lun)  函数2

以上三个函数就分别是给U盘的一些容量处理,

那么我们来看该 uint16_t MAL_GetStatus (uint8_t lun)  这个函数就是给U盘内存的容量大小定义,


其中这三个数组,就是分配U盘容量的数组。 我试过修改这些参数值。但是我的U盘容量没变。
      Mass_Block_Count[0] = (NAND_ZONE_SIZE * NAND_BLOCK_SIZE * NAND_MAX_ZONE);
      Mass_Block_Size[0]  = NAND_PAGE_SIZE;//512 byte
      Mass_Memory_Size[0] = (Mass_Block_Count[0] * Mass_Block_Size[0]);


因为我以前做SPI FLASH的时候,也是给这个三个数组分配值修改U盘容量的大小值。 但是操作NAND FLASH 竟然无效。
想请教一下各位大兄弟。有没有做过NAND FALSH模拟U盘并改变U盘容量。
再请教一个问题,也麻烦一下各位大兄弟。 一个U盘分成2个盘符可以实行么?

最后,祝各位大兄弟生活愉快。汪汪  汪汪  哈哈
[img]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\1184207257\QQ\WinTemp\RichOle\`CCV{[QBOS91~RQ{F6I99S8.png[/img]

[img]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\1184207257\QQ\WinTemp\RichOle\`CCV{[QBOS91~RQ{F6I99S8.png[/img]

`CCV{[QBOS91~RQ{F6I99S8.png

最佳答案

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

看看你的程序中是不是只有这一处声明 Mass_Block_Count[0] = (NAND_ZONE_SIZE * NAND_BLOCK_SIZE * NAND_MAX_ZONE); Mass_Block_Size[0] = NAND_PAGE_SIZE;//512 byte Mass_Memory_Size[0] = (Mass_Block_Count[0] * Mass_Block_Size[0]); 还是有其他的地方有定义: Mass_Block_Count[1] = (NAND_ZONE_SIZE * NAND_BLOCK_SIZE * NAND_MAX_ZONE); Mass_Block_Size[1] = NAND_PAGE_SIZE;//512 byte ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
974
金钱
974
注册时间
2016-6-15
在线时间
473 小时
发表于 2016-10-28 15:41:29 | 显示全部楼层
看看你的程序中是不是只有这一处声明
Mass_Block_Count[0] = (NAND_ZONE_SIZE * NAND_BLOCK_SIZE * NAND_MAX_ZONE);
      Mass_Block_Size[0]  = NAND_PAGE_SIZE;//512 byte
      Mass_Memory_Size[0] = (Mass_Block_Count[0] * Mass_Block_Size[0]);

还是有其他的地方有定义:
Mass_Block_Count[1] = (NAND_ZONE_SIZE * NAND_BLOCK_SIZE * NAND_MAX_ZONE);
      Mass_Block_Size[1]  = NAND_PAGE_SIZE;//512 byte
      Mass_Memory_Size[1] = (Mass_Block_Count[0] * Mass_Block_Size[0]);
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2015-4-27
在线时间
39 小时
 楼主| 发表于 2016-10-28 23:50:14 | 显示全部楼层
shuaigew88 发表于 2016-10-28 18:34
看看你的程序中是不是只有这一处声明
Mass_Block_Count[0] = (NAND_ZONE_SIZE * NAND_BLOCK_SIZE * NAND_M ...

这个我全局查找过了的  并没有使用到描述的三个数组 你这样写这几个数组  Mass_Block_Size[1]  Mass_Memory_Size[1]  Mass_Block_Count[1]    当多个U盘的时候使用到分配U盘  因为我现在只做一个U盘 所以就直接使用数组零  我看你贴的代码   想必你也做了NAND FLASH了  不知道大兄弟能够一起探讨一下
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2015-4-27
在线时间
39 小时
 楼主| 发表于 2016-10-28 23:52:30 | 显示全部楼层
各位大兄弟  本小人觉得  这个NAND FLASH是个值得深究一下的FLASH  因为NAND FLASH的读写速度比较快  而且做了坏块处理  个人觉得非常好   并没有像我们使用SPI  FLASH的那样  读写都比较慢   
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2015-4-27
在线时间
39 小时
 楼主| 发表于 2016-10-29 00:00:11 | 显示全部楼层
像我之前处理SPI FLASH的时候  就是这样分配内存的  看下面程序就可以知道了
uint16_t MAL_GetStatus (uint8_t lun)
{
           if (lun == 0)
           {
                Mass_Block_Count[0] = SPI_FLASH_SIZE/SPI_FLASH_PAGE_SIZE;
                Mass_Block_Size[0] = SPI_FLASH_PAGE_SIZE;                    
                Mass_Memory_Size[0] = SPI_FLASH_SIZE;
                return MAL_OK;
          }
  
          return MAL_FAIL;
}


#define     SPI_FLASH_START_ADDR        0x00000000    // Flash start address
#define     SPI_FLASH_SIZE              0x400000            // 4000K ?U?
#define     SPI_FLASH_PAGE_SIZE         0x1000         // 4k Bytes per page


按照我理解的SPI FLASH  我是这样分配内存的   现在到了NAND FLASH  应该是差不多原理   但也只是应该  我估计是错得一塌糊涂的   欢迎各位大兄弟扔砖头  :lol
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
974
金钱
974
注册时间
2016-6-15
在线时间
473 小时
发表于 2016-10-29 09:02:33 | 显示全部楼层
本帖最后由 shuaigew88 于 2016-10-29 09:03 编辑
072216 发表于 2016-10-29 00:00
像我之前处理SPI FLASH的时候  就是这样分配内存的  看下面程序就可以知道了
uint16_t MAL_GetStatus (ui ...

应该还是你没找到具体的定义位置,是的有一段时间我一直在研究NANDFLASH的坏块管理问题,目前来说我自己已经写了一套NANDFLASH坏块管理的程序配合FATFS文件系统使用目前来说还是比较稳定,因为NANDFLASH的优势就是读写速度快所以在编写坏块管理层时也充分考虑了速度问题,基本上在速度上等于直接读写NANDFLASH,缺点就是需要占用了25KB左右的RAM做缓存(小页模式,大页NANDFLASH需要更多内存做缓存)。
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2015-4-27
在线时间
39 小时
 楼主| 发表于 2016-10-29 10:01:20 | 显示全部楼层
shuaigew88 发表于 2016-10-29 09:02
应该还是你没找到具体的定义位置,是的有一段时间我一直在研究NANDFLASH的坏块管理问题,目前来说我自己 ...

好样的   加油~~~~我是直接使用官网的  关于坏块管理  还没有更多的深究  得先把容量问题解决  不过我还是没有找到具体在哪里定义内存大小   你要是知道   就指点一下吧  我的神呀  
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
974
金钱
974
注册时间
2016-6-15
在线时间
473 小时
发表于 2016-10-29 10:21:36 | 显示全部楼层
072216 发表于 2016-10-29 10:01
好样的   加油~~~~我是直接使用官网的  关于坏块管理  还没有更多的深究  得先把容量问题解决  不过我还 ...

你用的USB还是FATFS
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2015-4-27
在线时间
39 小时
 楼主| 发表于 2016-10-29 10:38:22 | 显示全部楼层

用的是USB  但也加载了文件系统   因为文件系统操作起来比较直观 毕竟是要做U盘   一些文件读写  U盘初始化 文件保存都没有问题    就是这个U盘内存容量分配定义  还没有搞定  表示周末都没有多大心情  一心想把这个内存容量解决掉   大兄弟  周末愉快   
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2015-4-27
在线时间
39 小时
 楼主| 发表于 2016-10-29 10:47:37 | 显示全部楼层
072216 发表于 2016-10-29 10:38
用的是USB  但也加载了文件系统   因为文件系统操作起来比较直观 毕竟是要做U盘   一些文件读写  U盘初始 ...

额 刚刚理解你的意思错了  我仔细想想  你的意思是 内存是由文件系统管理 并且分配   是这个意思吧
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
974
金钱
974
注册时间
2016-6-15
在线时间
473 小时
发表于 2016-10-29 10:50:04 | 显示全部楼层
Mass_Block_Count[0]
Mass_Block_Size[0]  
Mass_Memory_Size[0]
找到变量定义的位置将其注释后看看报错位置,是不是还有其他地方有定义。
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2015-4-27
在线时间
39 小时
 楼主| 发表于 2016-10-29 11:00:25 | 显示全部楼层
shuaigew88 发表于 2016-10-29 10:50
Mass_Block_Count[0]
Mass_Block_Size[0]  
Mass_Memory_Size[0]

我已经注释过了  若是把这个三个数组都屏蔽掉的话  U盘的容量就无法识别,在电脑端就只能发现一个盘符并伴随着U盘也无法格式化   也只有一处地方用到的  就是该处用到
   Mass_Block_Count[0] = (NAND_ZONE_SIZE * NAND_BLOCK_SIZE * NAND_MAX_ZONE);
      Mass_Block_Size[0]  = NAND_PAGE_SIZE;//512 byte
      Mass_Memory_Size[0] = (Mass_Block_Count[0] * Mass_Block_Size[0]);

回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
974
金钱
974
注册时间
2016-6-15
在线时间
473 小时
发表于 2016-10-29 11:08:43 | 显示全部楼层
072216 发表于 2016-10-29 11:00
我已经注释过了  若是把这个三个数组都屏蔽掉的话  U盘的容量就无法识别,在电脑端就只能发现一个盘符并 ...

那应该不会错,就是这个地方配置的,你把宏去掉直接用数字该
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2015-4-27
在线时间
39 小时
 楼主| 发表于 2016-10-29 11:15:24 | 显示全部楼层
shuaigew88 发表于 2016-10-29 11:08
那应该不会错,就是这个地方配置的,你把宏去掉直接用数字该

哥啊  直接用数字也试过了......... 也试过在获取地址哪里直接减去1000  因为总共有4096块吗 4096-1000=3096  也不行  哥啊  你的NAND FLASH怎么样了  是不是也是在这几个宏定义这里直接改成相应的页  相应的块   相应的簇
#define NAND_PAGE_SIZE             ((uint16_t)0x0200) /* 512 bytes per page w/o Spare Area */
#define NAND_BLOCK_SIZE            ((uint16_t)0x0020) /* 32x512 bytes pages per block */
#define NAND_ZONE_SIZE             ((uint16_t)0x0400) /* 1024 Block per zone */
#define NAND_SPARE_AREA_SIZE       ((uint16_t)0x0010) /* last 16 bytes as spare area */
#define NAND_MAX_ZONE              ((uint16_t)0x0004) /* 4 zones of 1024 block */
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
974
金钱
974
注册时间
2016-6-15
在线时间
473 小时
发表于 2016-10-29 11:18:22 | 显示全部楼层
本帖最后由 shuaigew88 于 2016-10-29 11:21 编辑
Mass_Block_Count[0] = 4096;//BlockNumber    Mass_Block_Size[0]  = NAND_PAGE_SIZE;//512 byte
Mass_Memory_Size[0] = NAND_PAGE_SIZE*4096;

这个地方直接用数字替换,先不要用那个宏。还有就是Mass_Block_Count[0] 指的是扇区数量不是NAND块的数量
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2015-4-27
在线时间
39 小时
 楼主| 发表于 2016-10-29 11:49:05 | 显示全部楼层
shuaigew88 发表于 2016-10-29 11:18
这个地方直接用数字替换,先不要用那个宏。还有就是Mass_Block_Count[0] 指的是扇区数量不是NAND块的数量 ...

刚刚试了一下  改了这个  也是没变  这个问题!
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
974
金钱
974
注册时间
2016-6-15
在线时间
473 小时
发表于 2016-10-29 12:31:52 | 显示全部楼层
072216 发表于 2016-10-29 11:49
刚刚试了一下  改了这个  也是没变  这个问题!

只能说还是你配置问题,或者说是你的程序是别人移植的,移植时不规范。
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2015-4-27
在线时间
39 小时
 楼主| 发表于 2016-10-29 16:11:27 | 显示全部楼层
shuaigew88 发表于 2016-10-29 12:31
只能说还是你配置问题,或者说是你的程序是别人移植的,移植时不规范。

哎!本想周末好好研究一下的   真的是好事多磨人啊   有点这样的感觉 风萧萧兮易水寒    兄弟  周末愉快  要出去浪一会了  这么好的周末  怎么可以埋没骚动的心   你也出去浪吧  浪...........
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
974
金钱
974
注册时间
2016-6-15
在线时间
473 小时
发表于 2016-10-29 16:22:12 | 显示全部楼层
072216 发表于 2016-10-29 16:11
哎!本想周末好好研究一下的   真的是好事多磨人啊   有点这样的感觉 风萧萧兮易水寒    兄弟  周末愉快  ...

我刚回来
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2015-4-27
在线时间
39 小时
 楼主| 发表于 2016-10-31 10:51:11 | 显示全部楼层

在此 多谢了 shuaigew88先森  已经解决了  一个小问题来的  主要是我把一个变量给干掉了  大兄弟  多谢多谢了  这个小问题就不贴出来了   在此祝你一帆风顺  早日脱单啊  额额额额
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
974
金钱
974
注册时间
2016-6-15
在线时间
473 小时
发表于 2016-10-31 12:53:36 | 显示全部楼层
072216 发表于 2016-10-31 10:51
在此 多谢了 shuaigew88先森  已经解决了  一个小问题来的  主要是我把一个变量给干掉了  大兄弟  多谢多 ...

我已经结婚了
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-2-28
在线时间
8 小时
发表于 2017-5-7 17:20:33 | 显示全部楼层
072216 发表于 2016-10-31 10:51
在此 多谢了 shuaigew88先森  已经解决了  一个小问题来的  主要是我把一个变量给干掉了  大兄弟  多谢多 ...

您好,楼主,我也在做这个,你是把什么变量干掉了?拜谢,好折腾
回复

使用道具 举报

23

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
284
金钱
284
注册时间
2013-8-27
在线时间
37 小时
发表于 2017-11-6 15:01:18 | 显示全部楼层
072216 发表于 2016-10-31 10:51
在此 多谢了 shuaigew88先森  已经解决了  一个小问题来的  主要是我把一个变量给干掉了  大兄弟  多谢多 ...

楼主 能否分享下你的作品,我这边调试卡住了,不知道怎么办,。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-9-17
在线时间
3 小时
发表于 2018-11-14 07:58:56 | 显示全部楼层
修改Mass_Block_Count[0]
Mass_Block_Size[0]  
Mass_Memory_Size[0]
之后电脑显示容量没变
格式化一下即可
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-11-16
在线时间
3 小时
发表于 2018-11-16 15:06:19 | 显示全部楼层
你好楼主,能不能分享下nand flash的代码,坏块管理和交换区做的懵了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-2-26
在线时间
3 小时
发表于 2020-2-28 11:20:27 | 显示全部楼层
shuaigew88 发表于 2016-10-29 09:02
应该还是你没找到具体的定义位置,是的有一段时间我一直在研究NANDFLASH的坏块管理问题,目前来说我自己 ...

大哥有NAND FLASH有坏块管理和FATFS文件系统的吗
跪求TAT
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-3-17
在线时间
17 小时
发表于 2020-3-26 15:14:48 | 显示全部楼层
大佬,例程可以发我一下吗,我的是阿波罗f429开发板,一直实现不了nand flash模拟u盘,或者说你网址给我我自己去下载,真的谢谢了,新手发不了短信-,只能在这里求了,希望大佬看到我
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-3 06:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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