STM32F4的usb_device的MSC里面添加一个lun后枚举不成功

2019-07-20 12:00发布

使用STM32F4探索者板子,练习USB_DEVICE_MSC
因为没有sd卡,所以我将spi flash作为usb msc。
现在想把LUN的大小改为3,然后问题出现了,USB枚举不成功,求帮助!
代码:
[mw_shl_code=c,true] //最大支持的设备数,3个 #define STORAGE_LUN_NBR 3 ////////////////////////////自己定义的一个标记USB状态的寄存器/////////////////// //bit0:表示电脑正在向SD卡写入数据 //bit1:表示电脑正从SD卡读出数据 //bit2:SD卡写数据错误标志位 //bit3:SD卡读数据错误标志位 //bit4:1,表示电脑有轮询操作(表明连接还保持着) vu8 USB_STATUS_REG=0; //////////////////////////////////////////////////////////////////////////////// //USB Mass storage 标准查询数据(每个lun占36字节) const int8_t STORAGE_Inquirydata[] = { /* LUN 0 */ 0x00, 0x80, 0x02, 0x02, (USBD_STD_INQUIRY_LENGTH - 4), 0x00, 0x00, 0x00, /* Vendor Identification */ 'M', 'L', 'I', 'E', 'N', 'T', 'E', 'K', '1',//9字节 /* Product Identification */ 'S', 'P', 'I', ' ', 'F', 'l', 'a', 's', 'h',//15字节 ' ','D', 'i', 's', 'k', ' ', /* Product Revision Level */ '1', '.', '0', ' ', //4字节 /* LUN 1 */ 0x00, 0x80, 0x02, 0x02, (USBD_STD_INQUIRY_LENGTH - 4), 0x00, 0x00, 0x00, /* Vendor Identification */ ' ', 'L', 'I', 'E', 'N', 'T', 'E', 'K',' ', //9字节 /* Product Identification */ 'S', 'D', ' ', 'F', 'l', 'a', 's', 'h', ' ',//15字节 'D', 'i', 's', 'k', ' ', ' ', /* Product Revision Level */ '1', '.', '0' ,' ', //4字节 /* LUN 2 */ 0x00, 0x80, 0x02, 0x02, (USBD_STD_INQUIRY_LENGTH - 4), 0x00, 0x00, 0x00, /* Vendor Identification */ 'M', 'A', 'N', 'T', 'I', 'S', 'H', 'E', '1',//9字节 /* Product Identification */ 'N', 'A', 'N', 'D', 'F', 'l', 'a', 's', 'h',//15字节 ' ',' ', 'i', 's', 'k', ' ', /* Product Revision Level */ '1', '.', '0', ' ', //4字节 }; int8_t STORAGE_Init (uint8_t lun); int8_t STORAGE_GetCapacity (uint8_t lun,uint32_t *block_num,uint32_t *block_size); int8_t STORAGE_IsReady (uint8_t lun); int8_t STORAGE_IsWriteProtected (uint8_t lun); int8_t STORAGE_Read (uint8_t lun,uint8_t *buf,uint32_t blk_addr,uint16_t blk_len); int8_t STORAGE_Write (uint8_t lun,uint8_t *buf,uint32_t blk_addr,uint16_t blk_len); int8_t STORAGE_GetMaxLun (void); //USB Device 用户回调函数接口 USBD_STORAGE_cb_TypeDef USBD_MICRO_SDIO_fops = { STORAGE_Init, STORAGE_GetCapacity, STORAGE_IsReady, STORAGE_IsWriteProtected, STORAGE_Read, STORAGE_Write, STORAGE_GetMaxLun, (int8_t *)STORAGE_Inquirydata, }; USBD_STORAGE_cb_TypeDef *USBD_STORAGE_fops=&USBD_MICRO_SDIO_fops;//指向USBD_MICRO_SDIO_fops结构体. //初始化存储设备 //lun:逻辑单元编号,0,SD卡;1,SPI FLASH //返回值:0,成功; // 其他,错误代码 int8_t STORAGE_Init (uint8_t lun) { // SD_Init(); W25QXX_Init(); W25QXX_Init(); W25QXX_Init(); return 0; } //获取存储设备的容量和块大小 //lun:逻辑单元编号,0,SD卡;1,SPI FLASH //block_num:块数量(扇区数) //block_size:块大小(扇区大小) //返回值:0,成功; // 其他,错误代码 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; // } if(lun==1) { *block_size=512; *block_num=1024*1024*12/512; // } else if(lun==2) { *block_size=512; *block_num=1024*1024*12/512; // } else { *block_size=512; *block_num=1024*1024*12/512; //SPI FLASH的前面12M字节,文件系统用 } return 0; } //查看存储设备是否就绪 //lun:逻辑单元编号,0,SD卡;1,SPI FLASH ;2,SPI FLASH //返回值:0,就绪; // 其他,未就绪 int8_t STORAGE_IsReady (uint8_t lun) { USB_STATUS_REG|=0X10;//标记轮询 return 0; } //查看存储设备是否写保护 //lun:逻辑单元编号,0,SD卡;1,SPI FLASH //返回值:0,没有写保护; // 其他,写保护(只读) int8_t STORAGE_IsWriteProtected (uint8_t lun) { return 0; } //从存储设备读取数据 //lun:逻辑单元编号,0,SD卡;1,SPI FLASH //buf:数据存储区首地址指针 //blk_addr:要读取的地址(扇区地址) //blk_len:要读取的块数(扇区数) //返回值:0,成功; // 其他,错误代码 int8_t STORAGE_Read (uint8_t lun,uint8_t *buf,uint32_t blk_addr,uint16_t blk_len) { int8_t res=0; USB_STATUS_REG|=0X02;//标记正在读数据 // if(lun==1) // { // res=SD_ReadDisk(buf,blk_addr,blk_len); // if(res)USB_STATUS_REG|=0X08;//SD卡读错误! // } if(lun==1) { W25QXX_Read(buf,blk_addr*512,blk_len*512); } else if(lun==2) { W25QXX_Read(buf,blk_addr*512,blk_len*512); } else { W25QXX_Read(buf,blk_addr*512,blk_len*512); } return res; } //向存储设备写数据 //lun:逻辑单元编号,0,SD卡;1,SPI FLASH //buf:数据存储区首地址指针 //blk_addr:要写入的地址(扇区地址) //blk_len:要写入的块数(扇区数) //返回值:0,成功; // 其他,错误代码 int8_t STORAGE_Write (uint8_t lun,uint8_t *buf,uint32_t blk_addr,uint16_t blk_len) { int8_t res=0; USB_STATUS_REG|=0X01;//标记正在写数据 // if(lun==1) // { // res=SD_WriteDisk (buf,blk_addr,blk_len); // if(res)USB_STATUS_REG|=0X04;//SD卡写错误! // } if(lun==1) { W25QXX_Write(buf,blk_addr*512,blk_len*512); } else if(lun==2) { W25QXX_Write(buf,blk_addr*512,blk_len*512); } else { W25QXX_Write(buf,blk_addr*512,blk_len*512); } return res; } //获取支持的最大逻辑单元个数 //返回值:支持的逻辑单元个数-1 int8_t STORAGE_GetMaxLun (void) { return (STORAGE_LUN_NBR - 1); }[/mw_shl_code] 其它的文件没有修改!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
正点原子
1楼-- · 2019-07-20 16:53
mantishell
2楼-- · 2019-07-20 19:39
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-07-21 01:28
回复【2楼】mantishell:
---------------------------------
STORAGE_Inquirydata
里面继续添加LUN 3的描述.
mantishell
4楼-- · 2019-07-21 05:36
回复【3楼】正点原子:
---------------------------------
原子哥,在上面贴的代码里可以看到,我已经添加了LUN3的描述符了呀


还有原来我以为是枚举过程失败,晚上睡觉在想怎么枚举呢,然后起床后用bus hound 看了下数据,原来枚举已经成功了。最后的数据显示在
  29.1  USTS   c0000004                                            stall pid         131us       127.1.0(2)     
  29.1  RESET                                                                         46us       128.1.0(2)     
  29.1  IN     55 53 42 53  e8 99 23 85  12 00 00 00  01           USBS..#......     1.1ms       131.1.0        
  29    RESET                                                                        268us       132.1.0        
  29    ok
然后就停止了。
另外, 29.1  IN     55 53 42 53  e8 99 23 85  12 00 00 00  01 是什么意义呢,网上还查不出来
mantishell
5楼-- · 2019-07-21 05:52
 精彩回答 2  元偷偷看……
正点原子
6楼-- · 2019-07-21 11:49
回复【4楼】mantishell:
---------------------------------
可能其他地方还要改,呵呵,没有研究啊。

一周热门 更多>