OpenEdv-开源电子网

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

USB Slave 读卡器 改为单个SD卡 电脑无法识别

[复制链接]

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2020-2-17
在线时间
25 小时
发表于 2020-6-23 15:06:40 | 显示全部楼层 |阅读模式
1金钱
各位大佬,

经过各种尝试,usbd_storage_msd.c文件,只要按原子哥的贴子改完,电脑就变为无法识别。但恢复到原来的例程,两个盘都能识别到。其他的代码都不动。已经懵逼了,请大佬们帮忙看下,是不是还需要改其他地方?


代码如下:注释掉的部分是原来的。
参考原子哥的原帖:http://www.openedv.com/forum.php?mod=viewthread&tid=99154
  1. //#include "usbd_msc_mem.h"
  2. //#include "usb_conf.h"
  3. //#include "w25qxx.h"                         
  4. //#include "sdio_sdcard.h"                 
  5. ////////////////////////////////////////////////////////////////////////////////////         
  6. ////本程序只供学习使用,未经作者许可,不得用于其它任何用途
  7. ////ALIENTEK STM32开发板
  8. ////USB读卡器  驱动代码          
  9. ////正点原子@ALIENTEK
  10. ////技术论坛:www.openedv.com
  11. ////创建日期:2016/1/21
  12. ////版本:V1.0
  13. ////版权所有,盗版必究。
  14. ////Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  15. ////All rights reserved                                                                          
  16. ////*******************************************************************************
  17. ////修改信息
  18. ////无
  19. ////////////////////////////////////////////////////////////////////////////////////           
  20. //
  21. ////最大支持的设备数,2个
  22. //#define STORAGE_LUN_NBR         2

  23. //////////////////////////////自己定义的一个标记USB状态的寄存器///////////////////
  24. ////bit0:表示电脑正在向SD卡写入数据
  25. ////bit1:表示电脑正从SD卡读出数据
  26. ////bit2:SD卡写数据错误标志位
  27. ////bit3:SD卡读数据错误标志位
  28. ////bit4:1,表示电脑有轮询操作(表明连接还保持着)
  29. //vu8 USB_STATUS_REG=0;
  30. //////////////////////////////////////////////////////////////////////////////////
  31. //

  32. ////USB Mass storage 标准查询数据(每个lun占36字节)
  33. //const int8_t  STORAGE_Inquirydata[] = {
  34. //  
  35. //        /* LUN 0 */
  36. //        0x00,               
  37. //        0x80,               
  38. //        0x02,               
  39. //        0x02,
  40. //        (USBD_STD_INQUIRY_LENGTH - 4),
  41. //        0x00,
  42. //        0x00,       
  43. //        0x00,
  44. //    /* Vendor Identification */
  45. //    'A', 'L', 'I', 'E', 'N', 'T', 'E', 'K', ' ',//9字节
  46. //    /* Product Identification */
  47. //    'S', 'P', 'I', ' ', 'F', 'l', 'a', 's', 'h',//15字节
  48. //    ' ','D', 'i', 's', 'k', ' ',
  49. //    /* Product Revision Level */       
  50. //    '1', '.', '0', ' ',                                                        //4字节               
  51. //               
  52. //        /* LUN 1 */
  53. //        0x00,
  54. //        0x80,               
  55. //        0x02,               
  56. //        0x02,
  57. //        (USBD_STD_INQUIRY_LENGTH - 4),
  58. //        0x00,
  59. //        0x00,       
  60. //        0x00,
  61. //        /* Vendor Identification */
  62. //        'A', 'L', 'I', 'E', 'N', 'T', 'E', 'K',' ',        //9字节
  63. //        /* Product Identification */                               
  64. //        'S', 'D', ' ', 'F', 'l', 'a', 's', 'h', ' ',//15字节
  65. //        'D', 'i', 's', 'k', ' ', ' ',  
  66. //    /* Product Revision Level */
  67. //        '1', '.', '0' ,' ',                              //4字节
  68. //};

  69. //int8_t STORAGE_Init (uint8_t lun);
  70. //int8_t STORAGE_GetCapacity (uint8_t lun,uint32_t *block_num,uint32_t *block_size);
  71. //int8_t  STORAGE_IsReady (uint8_t lun);
  72. //int8_t  STORAGE_IsWriteProtected (uint8_t lun);
  73. //int8_t STORAGE_Read (uint8_t lun,uint8_t *buf,uint32_t blk_addr,uint16_t blk_len);
  74. //int8_t STORAGE_Write (uint8_t lun,uint8_t *buf,uint32_t blk_addr,uint16_t blk_len);
  75. //int8_t STORAGE_GetMaxLun (void);


  76. ////USB Device 用户回调函数接口
  77. //USBD_STORAGE_cb_TypeDef USBD_MICRO_SDIO_fops =
  78. //{
  79. //        STORAGE_Init,
  80. //        STORAGE_GetCapacity,
  81. //        STORAGE_IsReady,
  82. //        STORAGE_IsWriteProtected,
  83. //        STORAGE_Read,
  84. //        STORAGE_Write,
  85. //        STORAGE_GetMaxLun,
  86. //        (int8_t *)STORAGE_Inquirydata,
  87. //};
  88. //USBD_STORAGE_cb_TypeDef  *USBD_STORAGE_fops=&USBD_MICRO_SDIO_fops;//指向USBD_MICRO_SDIO_fops结构体.

  89. ////初始化存储设备
  90. ////lun:逻辑单元编号,0,SD卡;1,SPI FLASH
  91. ////返回值:0,成功;
  92. ////    其他,错误代码
  93. //int8_t STORAGE_Init (uint8_t lun)
  94. //{
  95. //        u8 res=0;
  96. //        switch(lun)
  97. //        {
  98. //                case 0://SPI FLASH
  99. //                        W25QXX_Init();
  100. //                        break;
  101. //                case 1://SD卡
  102. //                        res=SD_Init();
  103. //                        break;
  104. //        }
  105. //        return res;
  106. //}

  107. ////获取存储设备的容量和块大小
  108. ////lun:逻辑单元编号,0,SPI FLASH;1,SD
  109. ////block_num:块数量(扇区数)
  110. ////block_size:块大小(扇区大小)
  111. ////返回值:0,成功;
  112. ////    其他,错误代码
  113. //int8_t STORAGE_GetCapacity (uint8_t lun, uint32_t *block_num, uint32_t *block_size)
  114. //{     
  115. //        switch(lun)
  116. //        {
  117. //                case 0://SPI FLASH
  118. //                        *block_size=512;  
  119. //                        *block_num=1024*1024*12/512;        //SPI FLASH的前面12M字节,文件系统用
  120. //                        break;
  121. //                case 1://SD卡
  122. //                        *block_size=512;  
  123. //                        *block_num=((uint64_t)(SDCardInfo.LogBlockNbr)*(uint64_t)(SDCardInfo.LogBlockSize))/512;
  124. //                        break;
  125. //        }         
  126. //        return 0;
  127. //}

  128. ////查看存储设备是否就绪
  129. ////lun:逻辑单元编号,0,SD卡;1,SPI FLASH
  130. ////返回值:0,就绪;
  131. ////    其他,未就绪
  132. //int8_t  STORAGE_IsReady (uint8_t lun)
  133. //{
  134. //        USB_STATUS_REG|=0X10;//标记轮询
  135. //        return 0;
  136. //}

  137. ////查看存储设备是否写保护
  138. ////lun:逻辑单元编号,0,SD卡;1,SPI FLASH
  139. ////返回值:0,没有写保护;
  140. ////    其他,写保护(只读)
  141. //int8_t  STORAGE_IsWriteProtected (uint8_t lun)
  142. //{
  143. //        return  0;
  144. //}

  145. ////从存储设备读取数据
  146. ////lun:逻辑单元编号,0,SD卡;1,SPI FLASH
  147. ////buf:数据存储区首地址指针
  148. ////blk_addr:要读取的地址(扇区地址)
  149. ////blk_len:要读取的块数(扇区数)
  150. ////返回值:0,成功;
  151. ////    其他,错误代码
  152. //int8_t STORAGE_Read (uint8_t lun,uint8_t *buf,uint32_t blk_addr,uint16_t blk_len)
  153. //{
  154. //        int8_t res=0;
  155. //        USB_STATUS_REG|=0X02;//标记正在读数据
  156. //        switch(lun)
  157. //        {
  158. //                case 0://SPI FLASH
  159. //                        W25QXX_Read(buf,blk_addr*512,blk_len*512);
  160. //                        break;
  161. //                case 1://SD卡
  162. //                        res=SD_ReadDisk(buf,blk_addr,blk_len);
  163. //                        break;
  164. //        }
  165. //        if(res)
  166. //        {
  167. //                USB_STATUS_REG|=0X08;//读错误!
  168. //        }
  169. //        return res;
  170. //}
  171. ////向存储设备写数据
  172. ////lun:逻辑单元编号,0,SPI FLASH;1,SD卡
  173. ////buf:数据存储区首地址指针
  174. ////blk_addr:要写入的地址(扇区地址)
  175. ////blk_len:要写入的块数(扇区数)
  176. ////返回值:0,成功;
  177. ////    其他,错误代码
  178. //int8_t STORAGE_Write (uint8_t lun,uint8_t *buf,uint32_t blk_addr,uint16_t blk_len)
  179. //{
  180. //        int8_t res=0;
  181. //        USB_STATUS_REG|=0X01;//标记正在写数据
  182. //        switch(lun)
  183. //        {
  184. //                case 0://SPI FLASH
  185. //                        W25QXX_Write(buf,blk_addr*512,blk_len*512);
  186. //                        break;
  187. //                case 1://SD卡
  188. //                        res=SD_WriteDisk(buf,blk_addr,blk_len);
  189. //                        break;
  190. //        }  
  191. //        if(res)
  192. //        {
  193. //                USB_STATUS_REG|=0X04;//写错误!         
  194. //        }
  195. //        return res;
  196. //}

  197. ////获取支持的最大逻辑单元个数
  198. ////返回值:支持的逻辑单元个数-1
  199. //int8_t STORAGE_GetMaxLun (void)
  200. //{
  201. //        if(SDCardInfo.LogBlockNbr)return STORAGE_LUN_NBR-1;
  202. //        else return STORAGE_LUN_NBR-2;
  203. //}

  204. #include "usbd_msc_mem.h"
  205. #include "usb_conf.h"
  206. #include "w25qxx.h"                         
  207. #include "sdio_sdcard.h"         
  208. //////////////////////////////////////////////////////////////////////////////////         
  209. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  210. //ALIENTEK STM32开发板
  211. //USB读卡器  驱动代码          
  212. //正点原子@ALIENTEK
  213. //技术论坛:www.openedv.com
  214. //创建日期:2016/1/21
  215. //版本:V1.0
  216. //版权所有,盗版必究。
  217. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  218. //All rights reserved                                                                          
  219. //*******************************************************************************
  220. //修改信息
  221. //无
  222. //////////////////////////////////////////////////////////////////////////////////           

  223. //最大支持的设备数,3个
  224. #define STORAGE_LUN_NBR         1        //改为支持1个

  225. ////////////////////////////自己定义的一个标记USB状态的寄存器///////////////////
  226. //bit0:表示电脑正在向SD卡写入数据
  227. //bit1:表示电脑正从SD卡读出数据
  228. //bit2:SD卡写数据错误标志位
  229. //bit3:SD卡读数据错误标志位
  230. //bit4:1,表示电脑有轮询操作(表明连接还保持着)
  231. vu8 USB_STATUS_REG=0;
  232. ////////////////////////////////////////////////////////////////////////////////


  233. //USB Mass storage 标准查询数据(每个lun占36字节)
  234. const int8_t  STORAGE_Inquirydata[] = {
  235.   
  236.         /* LUN 0 */
  237.         0x00,               
  238.         0x80,               
  239.         0x02,               
  240.         0x02,
  241.         (USBD_STD_INQUIRY_LENGTH - 4),
  242.         0x00,
  243.         0x00,       
  244.         0x00,
  245.     /* Vendor Identification */
  246.     'A', 'L', 'I', 'E', 'N', 'T', 'E', 'K', ' ',//9字节
  247.     /* Product Identification */
  248.     'S', 'P', 'I', ' ', 'F', 'l', 'a', 's', 'h',//15字节
  249.     ' ','D', 'i', 's', 'k', ' ',
  250.     /* Product Revision Level */       
  251.     '1', '.', '0', ' ',                                                        //4字节               
  252.        
  253. //只支持1个,后续的都不用了       
  254. //        /* LUN 1 */
  255. //        0x00,
  256. //        0x80,               
  257. //        0x02,               
  258. //        0x02,
  259. //        (USBD_STD_INQUIRY_LENGTH - 4),
  260. //        0x00,
  261. //        0x00,       
  262. //        0x00,
  263. //        /* Vendor Identification */
  264. //        'A', 'L', 'I', 'E', 'N', 'T', 'E', 'K',' ',        //9字节
  265. //        /* Product Identification */                               
  266. //    'N', 'A', 'N', 'D', ' ', 'F', 'l', 'a', 's', 'h',//15字节
  267. //        ' ','D', 'i', 's', 'k',
  268. //    /* Product Revision Level */
  269. //        '1', '.', '0' ,' ',                              //4字节
  270. //       
  271. //        /* LUN 2 */
  272. //        0x00,
  273. //        0x80,               
  274. //        0x02,               
  275. //        0x02,
  276. //        (USBD_STD_INQUIRY_LENGTH - 4),
  277. //        0x00,
  278. //        0x00,       
  279. //        0x00,
  280. //        /* Vendor Identification */
  281. //        'A', 'L', 'I', 'E', 'N', 'T', 'E', 'K',' ',        //9字节
  282. //        /* Product Identification */                               
  283. //        'S', 'D', ' ', 'F', 'l', 'a', 's', 'h', ' ',//15字节
  284. //        'D', 'i', 's', 'k', ' ', ' ',  
  285. //    /* Product Revision Level */
  286. //        '1', '.', '0' ,' ',                              //4字节
  287. };

  288. int8_t STORAGE_Init (uint8_t lun);
  289. int8_t STORAGE_GetCapacity (uint8_t lun,uint32_t *block_num,uint32_t *block_size);
  290. int8_t  STORAGE_IsReady (uint8_t lun);
  291. int8_t  STORAGE_IsWriteProtected (uint8_t lun);
  292. int8_t STORAGE_Read (uint8_t lun,uint8_t *buf,uint32_t blk_addr,uint16_t blk_len);
  293. int8_t STORAGE_Write (uint8_t lun,uint8_t *buf,uint32_t blk_addr,uint16_t blk_len);
  294. int8_t STORAGE_GetMaxLun (void);


  295. //USB Device 用户回调函数接口
  296. USBD_STORAGE_cb_TypeDef USBD_MICRO_SDIO_fops =
  297. {
  298.         STORAGE_Init,
  299.         STORAGE_GetCapacity,
  300.         STORAGE_IsReady,
  301.         STORAGE_IsWriteProtected,
  302.         STORAGE_Read,
  303.         STORAGE_Write,
  304.         STORAGE_GetMaxLun,
  305.         (int8_t *)STORAGE_Inquirydata,
  306. };
  307. USBD_STORAGE_cb_TypeDef  *USBD_STORAGE_fops=&USBD_MICRO_SDIO_fops;//指向USBD_MICRO_SDIO_fops结构体.

  308. //初始化存储设备
  309. //lun:逻辑单元编号,0,SD卡;1,SPI FLASH
  310. //返回值:0,成功;
  311. //    其他,错误代码
  312. int8_t STORAGE_Init (uint8_t lun)
  313. {
  314.         u8 res=0;
  315.         switch(lun)
  316.         {
  317.                 case 0://SPI FLASH
  318. //                        W25QXX_Init();
  319. //                        break;
  320. //                case 1://NAND FLASH
  321. //                        res=FTL_Init();
  322. //                        break;
  323. //                case 2://SD卡
  324.                         res=SD_Init();
  325.                         break;
  326.         }
  327.         return res;
  328. }

  329. //获取存储设备的容量和块大小
  330. //lun:逻辑单元编号,0,SD卡;1,SPI FLASH
  331. //block_num:块数量(扇区数)
  332. //block_size:块大小(扇区大小)
  333. //返回值:0,成功;
  334. //    其他,错误代码
  335. int8_t STORAGE_GetCapacity (uint8_t lun, uint32_t *block_num, uint32_t *block_size)
  336. {     
  337.         switch(lun)
  338.         {
  339.                 case 0://SPI FLASH
  340. //                        *block_size=512;  
  341. //                        *block_num=1024*1024*25/512;        //SPI FLASH的前面25M字节,文件系统用
  342. //                        break;
  343. //                case 1://NAND FLASH
  344. //                        *block_size=512;  
  345. //                        *block_num=nand_dev.valid_blocknum*nand_dev.block_pagenum*nand_dev.page_mainsize/512;
  346. //                          break;
  347. //                case 2://SD卡
  348.                         *block_size=512;  
  349. //                        *block_num=SDCardInfo.CardCapacity/512;
  350.                 *block_num=((uint64_t)(SDCardInfo.LogBlockNbr)*(uint64_t)(SDCardInfo.LogBlockSize))/512;
  351.                         break;
  352.         }         
  353.         return 0;
  354. }

  355. //查看存储设备是否就绪
  356. //lun:逻辑单元编号,0,SD卡;1,SPI FLASH
  357. //返回值:0,就绪;
  358. //    其他,未就绪
  359. int8_t  STORAGE_IsReady (uint8_t lun)
  360. {
  361.         USB_STATUS_REG|=0X10;//标记轮询
  362.         return 0;
  363. }

  364. //查看存储设备是否写保护
  365. //lun:逻辑单元编号,0,SD卡;1,SPI FLASH
  366. //返回值:0,没有写保护;
  367. //    其他,写保护(只读)
  368. int8_t  STORAGE_IsWriteProtected (uint8_t lun)
  369. {
  370.         return  0;
  371. }

  372. //从存储设备读取数据
  373. //lun:逻辑单元编号,0,SD卡;1,SPI FLASH
  374. //buf:数据存储区首地址指针
  375. //blk_addr:要读取的地址(扇区地址)
  376. //blk_len:要读取的块数(扇区数)
  377. //返回值:0,成功;
  378. //    其他,错误代码
  379. int8_t STORAGE_Read (uint8_t lun,uint8_t *buf,uint32_t blk_addr,uint16_t blk_len)
  380. {
  381.         int8_t res=0;
  382.         USB_STATUS_REG|=0X02;//标记正在读数据
  383.         switch(lun)
  384.         {
  385.                 case 0://SPI FLASH
  386. //                        W25QXX_Read(buf,blk_addr*512,blk_len*512);
  387. //                        break;
  388. //                case 1://NAND FLASH
  389. //                        res=FTL_ReadSectors(buf,blk_addr,512,blk_len);
  390. //                        break;
  391. //                case 2://SD卡
  392.                         res=SD_ReadDisk(buf,blk_addr,blk_len);
  393.                         break;
  394.         }
  395.         if(res)
  396.         {
  397.                 USB_STATUS_REG|=0X08;//读错误!
  398.         }
  399.         return res;
  400. }
  401. //向存储设备写数据
  402. //lun:逻辑单元编号,0,SD卡;1,SPI FLASH
  403. //buf:数据存储区首地址指针
  404. //blk_addr:要写入的地址(扇区地址)
  405. //blk_len:要写入的块数(扇区数)
  406. //返回值:0,成功;
  407. //    其他,错误代码
  408. int8_t STORAGE_Write (uint8_t lun,uint8_t *buf,uint32_t blk_addr,uint16_t blk_len)
  409. {
  410.         int8_t res=0;
  411.         USB_STATUS_REG|=0X01;//标记正在写数据
  412.         switch(lun)
  413.         {
  414.                 case 0://SPI FLASH
  415. //                        W25QXX_Write(buf,blk_addr*512,blk_len*512);
  416. //                        break;
  417. //                case 1://NAND FLASH
  418. //                        res=FTL_WriteSectors(buf,blk_addr,512,blk_len);
  419. //                        break;
  420. //                case 2://SD卡
  421.                         res=SD_WriteDisk(buf,blk_addr,blk_len);
  422.                         break;
  423.         }  
  424.         if(res)
  425.         {
  426.                 USB_STATUS_REG|=0X04;//写错误!         
  427.         }
  428.         return res;
  429. }

  430. //获取支持的最大逻辑单元个数
  431. //返回值:支持的逻辑单元个数-1
  432. int8_t STORAGE_GetMaxLun (void)
  433. {
  434. //        if(SDCardInfo.CardCapacity)return STORAGE_LUN_NBR-1;
  435.         if(SDCardInfo.LogBlockNbr)return STORAGE_LUN_NBR-1;
  436.         else return STORAGE_LUN_NBR-2;
  437. }







复制代码


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

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2020-2-17
在线时间
25 小时
 楼主| 发表于 2020-6-23 23:08:26 | 显示全部楼层
经过查找和搜索,如果把SD_Init()注释掉,就可以单独识别SD卡了,但为何mian里调用两次会出问题呢?没想明白。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-6-25 00:54:22 | 显示全部楼层
我在论坛发过帖子,改单个磁盘的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-1 07:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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