打印
[STM32F4]

[求助]STM32F4的USB mass storage例程,无法支持2个以上磁盘.

[复制链接]
1785|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
正点原子|  楼主 | 2016-1-20 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在调试STM32F4的USB Mass storage例程.
以前只用到最多虚拟出2个磁盘.一直用着,没什么问题.
不过,这次由于项目需要,得虚拟出3个磁盘.结果就出问题了.

修改步骤:
1,修改STORAGE_LUN_NBR的值为3:
#define STORAGE_LUN_NBR                  3  


2,修改STORAGE_Inquirydata数组,添加3个磁盘的描述
如下:
/* USB Mass storage Standard Inquiry Data */
int8_t STORAGE_Inquirydata[] = { /* 36 */
  /* LUN 0 */
  0x00,               
  0x80,               
  0x02,               
  0x02,
  (STANDARD_INQUIRY_DATA_LEN - 5),
  0x00,
  0x00,       
  0x00,
  'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer: 8 bytes  */
  'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product     : 16 Bytes */
  ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
  '0', '.', '0','1',                      /* Version     : 4 Bytes  */
  /* LUN 1 */
  0x00,               
  0x80,               
  0x02,               
  0x02,
  (STANDARD_INQUIRY_DATA_LEN - 5),
  0x00,
  0x00,       
  0x00,
  'S', 'T', 'M', '3', '2', ' ', ' ', ' ', /* Manufacturer: 8 bytes  */
  'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product     : 16 Bytes */
  ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
  '0', '.', '0','1',                      /* Version     : 4 Bytes  */
  /* LUN 2 */
  0x00,               
  0x80,               
  0x02,               
  0x02,
  (STANDARD_INQUIRY_DATA_LEN - 5),
  0x00,
  0x00,       
  0x00,
  'S', 'T', 'M', '3', '2', ' ', ' ', ' ', /* Manufacturer: 8 bytes  */
  'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product     : 16 Bytes */
  ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
  '0', '.', '0','1',                      /* Version     : 4 Bytes  */
};


3,修改磁盘初始化/磁盘读取/磁盘写入等函数,增加对3个磁盘的操作.


修改完以后,下载.发现直接进入Suspend状态了.
而一旦将STORAGE_LUN_NBR的数值改为2或者1,就没有任何问题.可以正常识别2个或者1个磁盘出来.
只要改为3,就进入Suspend状态.


我试过使用STM32_USB-Host-Device_Lib_V2.2.0和stm32cubef4的例程,都测试过.同样都只支持最大2个磁盘,只要定义3个,立即进入Suspend状态.

然后,我试过103的USB例程,却是可以支持3个磁盘.所以,想请教下有没有搞过F407 USB MSC支持2个以上磁盘的? 希望能指导下. 谢谢.



沙发
正点原子|  楼主 | 2016-1-21 15:22 | 只看该作者
自己解决了
解决办法:
static void  MSC_BOT_CBW_Decode (USB_OTG_CORE_HANDLE  *pdev)
{

  MSC_BOT_csw.dTag = MSC_BOT_cbw.dTag;
  MSC_BOT_csw.dDataResidue = MSC_BOT_cbw.dDataLength;
  
  if ((USBD_GetRxCount (pdev ,MSC_OUT_EP) != BOT_CBW_LENGTH) ||
      (MSC_BOT_cbw.dSignature != BOT_CBW_SIGNATURE)||
        (MSC_BOT_cbw.bLUN > USBD_MSC_MaxLun) ||
          (MSC_BOT_cbw.bCBLength < 1) ||
            (MSC_BOT_cbw.bCBLength > 16))
  {
   
    SCSI_SenseCode(MSC_BOT_cbw.bLUN,
                   ILLEGAL_REQUEST,
                   INVALID_CDB);
     MSC_BOT_Status = BOT_STATE_ERROR;   
    MSC_BOT_Abort(pdev);

  }

使用特权

评论回复
板凳
qq245868243| | 2016-1-21 16:29 | 只看该作者
哥们 可见你真的很急 各大论坛都见你发帖了

使用特权

评论回复
地板
正点原子|  楼主 | 2016-1-22 15:13 | 只看该作者
qq245868243 发表于 2016-1-21 16:29
哥们 可见你真的很急 各大论坛都见你发帖了

还是靠自己解决了.

使用特权

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

本版积分规则

个人签名:我的STM32开发板店铺:http://openedv.taobao.com 我的技术论坛论坛:www.openedv.com

91

主题

264

帖子

71

粉丝