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条回答
mantishell
1楼-- · 2019-07-21 17:30
搞了几天,还是没有找到具体位置,不过通过抓包工具可以看到大容量存储设备的标准查询数据的前两次主机可以收到,但第三次主机没有收到,然后设备被挂起

正点原子
2楼-- · 2019-07-21 21:09
 精彩回答 2  元偷偷看……
Exactly
3楼-- · 2019-07-22 02:01
请问有人解决了吗? 我的现象是, 插入USB插头后, 提示格式化, 然后整个单片机处于假死状态, 等N久后, 电脑提示格式化不成功。
chenwe
4楼-- · 2019-07-22 04:21
 精彩回答 2  元偷偷看……

一周热门 更多>