电脑读取U盘时遇到的问题

∈·⊥·π 2022-08-10 16:30:59 编辑

我计划用嵌入式系统模拟U盘的功能,目前成功识别设备,进行了格式化,但是在断电之后重新连接电脑,电脑再次识别U盘的时候出了问题,无法识别设备,用BusHound读取到的信息显示一开始的get descriptor和inquiry等指令都通过了,识别到了MSD设备,但是在后面电脑在大批量发送READ指令读取数据的时候,在读取的过程中电脑又插入了一个get descriptor的指令 80 06 00 02 00 00 09 00,之后我的程序就卡在一个地方,无法继续读取了,我怀疑是这个指令导致我的USB驱动卡住了,请问有人知道为什么电脑会发送这个指令吗?

USB中文网 2022-08-11 10:02:50 编辑
80 06 00 02 00 00 09 00

这个命令看着有点不对,数据长度就不正确。设备描述符都是18字节,通过BUSHOUND抓取的都是0x12

第二:”目前成功识别设备,进行了格式化,但是在断电之后重新连接电脑,电脑再次识别U盘的时候出了问题”,这个大概略是你的格式化数据只是写到了缓存中了,没有写以实际的盘中,所以你看到的可以用是假象。

第三INQUIRY命令正确执行了,你得分析其响应的数据是否正确,https://www.usbzh.com/article/detail-1011.html

第四:是否格式化,需要分析READ_CAPACITY命令 https://www.usbzh.com/article/detail-1012.html

∈·⊥·π 2022-08-11 10:52:15 编辑

感谢站长的回复!

这个获取描述符的命令应该没有错,根据我查的资料,02对应的是配置描述符,长度是9个字节。

不好意思我之前没有说清楚,这个工程我之前用FPGA实现过,整个流程都跑通了,底层的NAND FLASH驱动也是我维护的,而且我是用windows里的磁盘管理格式化的,在格式化完成不断电的情况下还可以正常读写文件,所以应该不存在没写到盘中的情况。

我知道在电脑读取USB设备的最开始电脑会发送get descriptor指令,但是按照正常的流程,通过了识别设备这一步之后应该就不会再发送这个指令了,而是在读取了MBR之后按照FAT32的格式去读取MSD设备里的内容,在BUSHOUND上就表现为大量发送READ指令。按照我之前调试的经验,如果电脑不插入get descriptor指令,而是继续发送READ指令,那么读取MSD设备这一步也可以正常完成,在电脑上就会显示一个U盘。我现在想知道的问题是在什么情况下电脑会在对MSD设备多次READ的时候中途又插入一个get descriptor指令,不知道您是否见到过类似的情况?

USB中文网 2022-08-11 12:00:10 编辑

是我搞错了。02确实是配置描述符。
我以前遇到过没有写入,但是U盘确实可以读写的功能,而且数据也正常。这就是因为数据量小所以在缓存中引起的。当时重启完电脑后就发现数据不在了。
另外你说的获取配置描述符能发个抓包的图么,这个是这个设备的吗?
并且发上来的配置描述符的内容和之前一样的吗?

∈·⊥·π 2022-08-11 12:28:19 编辑

感谢站长的回复!

我的设备里的缓存没那么大,而且下面的代码也没有写到缓存里的设计,所以可以确定是存到NAND FLASH里了。

4vT8I.png

这是一开始识别设备的时候的描述符

4vj5R.png

后面开始大量的READ指令

4vhRj.png

这是后面给电脑回复数据的时候插入的指令,跟最开始的一样,回复的内容也一样,从设备号可以看出是一个设备,后面就卡住了。