OpenEdv-开源电子网

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

[F1开发板通用] 如何修改战舰板的USB读卡器实验为单磁盘读取,教学贴!

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
发表于 2014-11-23 10:24:31 | 显示全部楼层 |阅读模式
今天又有客户要SD卡,不要SPI了,看了此贴,还是不会改。
我心里只有几个省略号。
花了几分钟,帮客户搞定,以后有朋友看了,自己想想为何改不出来吧。面壁思过几天。
见附件(附件是战舰V3的,寄存器版本)。

---------------------------------------------------------------------------------------------------------------------------------------------------------         
     有时候帮人想多了,也是一种痛苦。
比如USB读卡器实验,我们做了2个磁盘支持,可是很多朋友并不需要用到2个磁盘,于是乎,问题来了,亲们不知道如何修改为1个磁盘支持。
现在,我就就发一个教学贴手把手教亲们如何修改。
   源代码:战舰板 寄存器版本  实验50  USB 读卡器实验。
     目标:只要1个磁盘,且是SPI FLASH盘。
     知识点:
     1,MAX_LUN 用于表示多少多少个磁盘,0,表示1个,1表示2个,2,表示3个.... 以此类推
     2,
[mw_shl_code=c,true]extern long long Mass_Memory_Size[MAX_LUN+1]; extern u32 Mass_Block_Size[MAX_LUN+1]; extern u32 Mass_Block_Count[MAX_LUN+1];[/mw_shl_code]
          这三个数组,非常重要,用来表征磁盘的信息,Mass_Memory_Size表示磁盘大小,Mass_Block_Size表示磁盘块大小(扇区大小),Mass_Block_Count用于表示块数目,即扇区个数。
        3,MAL_Write函数和MAL_Read函数。用来实现底层磁盘的读写操作。也就是USB读写的接口,必须实现。

         有了以上知识点,再来看看修改方法:
       步骤1,修改MAX_LUN 为0(原来是1),表示只有一个磁盘。MAX_LUN 在mass_mal.h文件。
        步骤2,修改MAL_Write函数和MAL_Read函数,修改后代码如下:
[mw_shl_code=c,true]/******************************************************************************* * Function Name : MAL_Write * Description : Write sectors * Input : None * Output : None * Return : 0,OK 1,FAIL *******************************************************************************/ u16 MAL_Write(u8 lun, u32 Memory_Offset, u32 *Writebuff, u16 Transfer_Length) { u8 STA; switch (lun) { case 0: STA=0; SPI_Flash_Write((u8*)Writebuff, Memory_Offset, Transfer_Length); //STA=SD_WriteDisk((u8*)Writebuff, Memory_Offset>>9, Transfer_Length>>9); break; case 1: STA=0; SPI_Flash_Write((u8*)Writebuff, Memory_Offset, Transfer_Length); break; default: return MAL_FAIL; } if(STA!=0)return MAL_FAIL; return MAL_OK; } /******************************************************************************* * Function Name : MAL_Read * Description : Read sectors * Input : None * Output : None * Return : 0,OK 1,FAIL *******************************************************************************/ u16 MAL_Read(u8 lun, u32 Memory_Offset, u32 *Readbuff, u16 Transfer_Length) { u8 STA; switch (lun) { case 0: STA=0; SPI_Flash_Read((u8*)Readbuff, Memory_Offset, Transfer_Length); //STA=SD_ReadDisk((u8*)Readbuff, Memory_Offset>>9, Transfer_Length>>9); break; case 1: STA=0; SPI_Flash_Read((u8*)Readbuff, Memory_Offset, Transfer_Length); break; default: return MAL_FAIL; } if(STA!=0)return MAL_FAIL; return MAL_OK; } [/mw_shl_code]
           可以看到,我们将switch case0,改为了SPI FLASH的操作,这样,只有一个磁盘的情况,switch永远只可能是0,然后操作的就是SPI FLASH了。
          步骤3,修改main函数对Mass_Memory_Size等三个数组的初始化,修改后代码如下:
[mw_shl_code=c,true]// if(SD_Initialize())LCD_ShowString(60,130,200,16,16,"SD Card Error!"); //检测SD卡错误 // else //SD 卡正常 // { // LCD_ShowString(60,130,200,16,16,"SD Card Size: MB"); // Mass_Memory_Size[0]=(long long)SD_GetSectorCount()*512;//得到SD卡容量(字节),当SD卡容量超过4G的时候,需要用到两个u32来表示 // Mass_Block_Size[0] =512;//因为我们在Init里面设置了SD卡的操作字节为512个,所以这里一定是512个字节. // Mass_Block_Count[0]=Mass_Memory_Size[0]/Mass_Block_Size[0]; // LCD_ShowNum(164,130,Mass_Memory_Size[0]>>20,5,16); //显示SD卡容量 // } if(SPI_FLASH_TYPE!=W25Q64)LCD_ShowString(60,130,200,16,16,"W25Q64 Error!"); //检测SD卡错误 else //SPI FLASH 正常 { Mass_Memory_Size[0]=1024*1024*6;//前6M字节 Mass_Block_Size[0] =512;//因为我们在Init里面设置了SD卡的操作字节为512个,所以这里一定是512个字节. Mass_Block_Count[0]=Mass_Memory_Size[0]/Mass_Block_Size[0]; LCD_ShowString(60,150,200,16,16,"SPI FLASH Size:6144KB"); }[/mw_shl_code]
         可以看到,我们将SD卡部分屏蔽了,然后Mass_Memory_Size,Mass_Block_Size和Mass_Block_Count等三个数组,我们将数组元素0,改为了SPI  flash的相关信息(原来是SD卡的),这样,就完成了对例程的修改。
         修改完这几个地方,重新编译,下载,即可看到,电脑只识别一个磁盘了。且是SPI FLASH磁盘。
        完整源码见附件。
实验50 USB读卡器实验(单磁盘).rar (357.34 KB, 下载次数: 2408)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2018-1-4
在线时间
31 小时
发表于 2018-5-12 20:33:04 | 显示全部楼层
原子哥,我把USB读卡器实验和FATFS实验合了一下,现在情况是,当电脑读取到内存卡后在内存卡新建文件,用单片机可以查询到内存卡新建的文件,但是用单片机对内存卡执行新建文件,单片机可以查询到目录内有改文件,电脑无法看到内存卡新建的文件,我拔掉USB线再插上后就可以显示了,我用程序断开再连接也可以实现,刷新一次就像U盘插拔一次似的, 我感觉这不是个解决办法,原子哥可以提供个思路吗。
回复 支持 2 反对 0

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-11-23 11:01:35 | 显示全部楼层
军哥说的对,有时候帮人想多了也是种痛苦
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2014-11-23 12:13:44 | 显示全部楼层
mark,谢谢
回复 支持 反对

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2014-11-23 14:22:15 | 显示全部楼层
顶!!!!!!
回复 支持 反对

使用道具 举报

70

主题

6729

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12892
金钱
12892
注册时间
2012-11-26
在线时间
3762 小时
发表于 2014-11-23 15:56:21 | 显示全部楼层
mark  mark
学无止境
回复 支持 反对

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2014-11-24 13:40:45 | 显示全部楼层
原子哥真心累啊
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复 支持 反对

使用道具 举报

5

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2013-6-8
在线时间
2 小时
发表于 2014-11-24 16:57:29 | 显示全部楼层
其实每天都能看到好多不动脑筋的帖子,PWM怎么捕获啦,程序又编译出错啦,
这个IO口又不能输出波形啦,大神求助啦.........各种.......

懒人太多了,原子哥都不够用了 Σ( ° △ °|||)︴
即使爬到最高的山上,一次也只能脚踏实地地迈一步。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
 楼主| 发表于 2014-11-25 00:34:52 | 显示全部楼层
回复【7楼】倒拔萝卜:
---------------------------------
还请大家多多支持。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2013-4-10
在线时间
16 小时
发表于 2014-11-26 16:09:38 | 显示全部楼层
原子兄,请教你个问题?
我有块407的板子,flash用的W25Q64,我把fatfs的大小设置为前4M,参考您的程序能正确识别和更新字库.但是在做读卡器实验时发现容量还是12M,我在下面
int8_t STORAGE_GetCapacity (uint8_t lun, uint32_t *block_num, uint32_t *block_size)
{     
if(lun==1)
{
*block_size=512;  
*block_num=SDCardInfo.CardCapacity/512;
}else
{
*block_size=512;  
*block_num=1024*1024*4/512; //SPI FLASH的前面4M字节,文件系统用
}
return 0; 

里修改了block_num但是电脑上查看还是12M。。?
能提示一下还要修改那里么?不胜感激
回复 支持 反对

使用道具 举报

5

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2012-8-10
在线时间
40 小时
发表于 2014-11-26 16:11:44 | 显示全部楼层
唉, 原子哥操碎了心
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
 楼主| 发表于 2014-11-26 16:28:52 | 显示全部楼层
回复【9楼】shower.xu:
---------------------------------
重新格式化一下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2013-4-10
在线时间
16 小时
发表于 2014-11-27 09:57:10 | 显示全部楼层
格式化后搞定,谢谢版主

回复 支持 反对

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-3-31
在线时间
1 小时
发表于 2015-4-7 17:20:38 | 显示全部楼层
mark!!
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2015-5-9 18:06:26 | 显示全部楼层
奇怪,下载原子哥这个程序进去也还是不行,还是提示格式化,但又格式化不了。不知到底是什么原因,搜遍论坛也有人出现这样的问题,但好像没有有效的解决办法啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
 楼主| 发表于 2015-6-1 22:07:48 | 显示全部楼层
回复【14楼】zzj:
---------------------------------
换卡试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

138

主题

362

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2012-9-17
在线时间
29 小时
发表于 2015-8-11 10:20:25 | 显示全部楼层
非常感谢原子哥,做成了!
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-11-29
在线时间
7 小时
发表于 2015-12-11 19:17:50 | 显示全部楼层
原子哥,我知道我问的很蠢。可是我把您的这个读卡器实验修改后,只用USB读SD卡部分,去掉了SPI,结果识别出SD卡来要15s的时间,而且写的速度只有170KB。我的芯片是stm32f103ret6。我也追踪到了是MAL_READ这个函数的问题,插上USB以后,PC一直在读SD卡里面的内容,不是目录,是所有的内容,您觉得这会是什么原因呢?能给些建议改进这些问题么?我用的是15年的例程,麻烦你了。
嘿嘿。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
 楼主| 发表于 2015-12-16 23:38:40 | 显示全部楼层
回复【17楼】aniu360:
---------------------------------
可能和系统有关,我也遇到过读卡很慢的情况,不同系统,不一样。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-11-29
在线时间
7 小时
发表于 2015-12-25 16:36:49 | 显示全部楼层
和PC的操作系统?
嘿嘿。
回复 支持 反对

使用道具 举报

0

主题

0

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2012-4-19
在线时间
7 小时
发表于 2016-3-19 15:14:35 | 显示全部楼层
原子哥,有没有什么方法可以实现插入不同的电脑都是相同的盘符?比如是说U:
回复 支持 反对

使用道具 举报

10

主题

147

帖子

0

精华

高级会员

Rank: 4

积分
602
金钱
602
注册时间
2015-7-11
在线时间
94 小时
发表于 2016-9-17 17:55:02 | 显示全部楼层
谢谢
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-12-23
在线时间
5 小时
发表于 2016-12-23 23:02:36 | 显示全部楼层
原子哥,用USB读卡实验,我只想在电脑上显示SD卡的U盘,怎么修改呢
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-12-23
在线时间
5 小时
发表于 2016-12-23 23:09:36 | 显示全部楼层
aniu360,你好
只用USB读SD卡部分,去掉了SPI,怎么修改的呢

回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-12-23
在线时间
5 小时
发表于 2016-12-23 23:14:20 | 显示全部楼层
17楼的兄弟,只用USB读SD卡部分,去掉了SPI,这部分怎么修改
回复 支持 反对

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-2-28 20:46:06 | 显示全部楼层
Mark
回复 支持 反对

使用道具 举报

1

主题

17

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2017-7-29
在线时间
18 小时
发表于 2017-8-1 20:09:24 | 显示全部楼层
mark!!
回复 支持 反对

使用道具 举报

1

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2017-8-21
在线时间
32 小时
发表于 2017-8-21 11:40:48 | 显示全部楼层
真的很不错
回复 支持 反对

使用道具 举报

1

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2014-8-11
在线时间
76 小时
发表于 2017-8-21 16:43:19 | 显示全部楼层
mark。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
 楼主| 发表于 2017-9-14 16:42:13 | 显示全部楼层
更新了一个
回复 支持 反对

使用道具 举报

5

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2016-11-1
在线时间
27 小时
发表于 2017-9-26 11:04:38 | 显示全部楼层
提前学习,
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-1-20
在线时间
7 小时
发表于 2018-3-8 18:35:04 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2018-8-6
在线时间
17 小时
发表于 2018-11-13 17:12:16 | 显示全部楼层
喜仔追梦人 发表于 2018-5-12 20:33
原子哥,我把USB读卡器实验和FATFS实验合了一下,现在情况是,当电脑读取到内存卡后在内存卡新建文件,用单 ...

我也遇到了这个问题,这个USB库有BUG啊
回复 支持 反对

使用道具 举报

1

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2018-4-24
在线时间
53 小时
发表于 2019-9-30 17:09:34 | 显示全部楼层
mark     
回复 支持 反对

使用道具 举报

22

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2016-5-23
在线时间
118 小时
发表于 2021-12-17 17:07:43 | 显示全部楼层
SD_ReadDisk((u8*)Readbuff, Memory_Offset>>9, Transfer_Length>>9);
这里为什么要右移9次?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-1-31 15:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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