OpenEdv-开源电子网

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

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

[复制链接]

3

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-6-14
在线时间
0 小时
发表于 2015-3-11 23:46:32 | 显示全部楼层 |阅读模式
5金钱
使用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]
其它的文件没有修改!

USB读卡器(Slave)实验.zip

895.09 KB, 下载次数: 1452

最佳答案

查看完整内容[请看2#楼]

已解决,见:http://www.openedv.com/forum.php?mod=viewthread&tid=66755
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-11 23:46:33 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-6-14
在线时间
0 小时
 楼主| 发表于 2015-3-12 22:06:42 | 显示全部楼层
是需要改某个描述符吗?还是说最大只能支持LUN=2呢,但从手册CD00289278.pdf上没有说LUN最大是多少啊,求帮助!!!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-12 22:33:04 | 显示全部楼层
回复【2楼】mantishell:
---------------------------------
STORAGE_Inquirydata
里面继续添加LUN 3的描述.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-6-14
在线时间
0 小时
 楼主| 发表于 2015-3-13 09:09:23 | 显示全部楼层
回复【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 是什么意义呢,网上还查不出来
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-6-14
在线时间
0 小时
 楼主| 发表于 2015-3-13 09:10:12 | 显示全部楼层
回复【2楼】mantishell:
---------------------------------
今天看到《圈圈教你玩USB》里面写到LUN最大可以达到16个
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-13 23:06:43 | 显示全部楼层
回复【4楼】mantishell:
---------------------------------
可能其他地方还要改,呵呵,没有研究啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-6-14
在线时间
0 小时
 楼主| 发表于 2015-3-20 20:31:38 | 显示全部楼层
搞了几天,还是没有找到具体位置,不过通过抓包工具可以看到大容量存储设备的标准查询数据的前两次主机可以收到,但第三次主机没有收到,然后设备被挂起

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-1-19 18:59:18 | 显示全部楼层
mantishell 发表于 2015-3-20 20:31
搞了几天,还是没有找到具体位置,不过通过抓包工具可以看到大容量存储设备的标准查询数据的前两次主机可以 ...

现在我也遇到这个问题.
也是进入挂起状态.
头大.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2021-12-17
在线时间
3 小时
发表于 2016-5-19 10:37:53 | 显示全部楼层
添加lun==2的init和容量,读写
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2015-12-28
在线时间
3 小时
发表于 2016-8-11 13:14:23 | 显示全部楼层
请问有人解决了吗? 我的现象是, 插入USB插头后, 提示格式化, 然后整个单片机处于假死状态, 等N久后, 电脑提示格式化不成功。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2017-6-28
在线时间
2 小时
发表于 2017-9-13 14:08:06 | 显示全部楼层
原子哥,你好。
我现在模拟2个盘,结果只出来一个盘。
步骤:

1,修改STORAGE_LUN_NBR的值为2;
2,修改STORAGE_Inquirydata数组,添加2个磁盘的描述;
3,修改磁盘初始化/磁盘读取/磁盘写入等函数,增加对2个磁盘D:\捕获.PNG的操作;

最终驱动有识别。
D:\捕获.PNG
磁盘却没有挂上
D:\捕获1.PNG

这个是什么问题?
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-10-29
在线时间
5 小时
发表于 2020-11-11 09:30:26 | 显示全部楼层
正点原子 发表于 2015-3-11 23:46
已解决,见:http://www.openedv.com/forum.php?mod=viewthread&tid=66755

原子哥,请教个问题,我现在想只挂sd卡的盘符,需要再电脑上只显示SD卡的盘符。
问题:
1. 屏蔽spi flash 之后 ,会显示一个无效的盘符,存在。
2.如果将 源码中的case1:改成case0 会出现程序异常情况
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 12:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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