一、问题起因
近来有几个客户反映STM3210E的开发板的USB Mass Storage 例程有点问题,组长安排我来调试。Mass Storage例程在PC上实现两个U盘,一个是SD盘,一个是NAND Flash盘,把程序下载到开发板后,PC上能够检测到NAND Flash盘和SD盘,却提示磁盘要格式化,按照提示操作,格式化不成功,可用磁盘空间和已用磁盘空间都为0。
调试前的准备
二、调试前准备
调试之前花了三天的时间,大致的看了一下USB的框架,后来才发现,没什么必要,不过多学点知识总是好的。
1.USB只提供一个数据通道,USB总线并不知道设备具体是怎么操作,有什么状态,USB设备的状态是设备自己来决定的,这就是USB描述符的功能了。描述符中记录了设备的类型、厂商、产品ID、端点信息等。描述符主要要:设备描述符、接口描述符、端点描述符、字符串描述符等。设备描述符记录了该设备使用的USB版本号、厂商ID、产品ID、可能的配置数等与设备相关的信息;配置描述符记录了配置包含的接口数、供电方式、是否支持远程唤醒等;接口描述符记录了接口的端点数、接口使用的类、协议等;端点描述符记录了端点号、数据传输的方向、传输类型、最大包长度等;字符串描述符记录了一些文字信息,方便客户理解。
USB协议中规定了四种传输类型:批量传输、同步传输、中断传输和控制传输
MassStorage例程中只用到了批量传输和控制传输,所以这里只介绍这两种方式
(1)批量传输使用bulk transaction传输数据,主要应用在数据大量数据传输和接受数据上同时又没有带宽和间隔时间要求的情况下。特点:要求保证传输。打印机、大容量存储设备和扫描仪属于这种类型这种类型的设备。适合于传输非常慢和大量被延迟的传输,可以等到所有其它类型的数据的传输完成之后再传输和接收数据。
一次批量事物有三个阶段:令牌包阶段、数据包阶段和握手包阶段。
第一阶段 令牌包阶段
Host端发出一个Bulk的令牌请求、令牌包中包含了设备地址、端点号。
如果令牌是IN请求 ,则是从Device到Host的请求;
如果令牌是OUT请求,则是从Host到Device端的请求。
第二阶段 数据包阶段
根据先前请求的令牌的类型,数据传输有可能是IN方向,也有可能是OUT方向。传输数据的时候用DATA0和DATA1令牌携带着数据交替传送。
数据传输格式DATA1和DATA0,这两个是重复数据,确保在1数据丢失时0可以补上,不至于数据丢失。
第三阶段 握手包阶段
如果数据是IN 方向,握手信号应该是Host端发出;
如果数据是OUT方向,握手信号应该是Device端发出。
握手信号可以为ACK, 表示正常响应,
NAK, 表示没有正确传送。
STALL,表示出现主机不可预知的错误。
(2)控制传输
作用:USB系统用来主要进行查询配置和给USB设备发送通用的命令,它要保证数据传输过程的数据完整性。设备枚举过程中的各种设备描述符的获取以及设置地址、设置配置都是通过控制传输来实现的。特点:控制传输是双向传输,数据量通常较小;数据传送是无损性的。
控制传输也分为三个阶段,即令牌阶段、数据传送阶段、握手阶段
2.USB协议中规定了一类大容量存储设备 mass storage device,包括u盘、移动硬盘等。大容量存储设备接口类代码(bInterfaceClass)为0x08,U盘接口子类代码(bInterfaceSubClass)使用0x06,表示使用SCSI透明指令集.协议代码(bInterfaceProtocol)有三种:0x01、0x00和0x50,前面两种需要使用中断传输,这里使用的是最后一种协议,即协议使用仅批量传输(bulk only transport)。
仅批量传输协议中规定了两个特殊的类请求:bulk-only Mass Storage Reset 和Get Max LUN,前者是复位到命令状态的请求,后者是获取最大逻辑单元的请求。
1.Get Max LUN的格式如下图
usb协议中采用的是小端格式,这一点要格外注意,比如ASCII 0x55、0x53,用小端格式表示就是0x5355
bmRequestType为0xa1,表示它是发送到接口的类输入请求,bRequest为0xfe,wIndex为请求的接口号,传输的数据长度为1字节,设备将在数据过程返回1字节的数据,表示设备有多少个逻辑单元,0表示1个逻辑单元,1表示有两个。
2.bulk-only Mass Storage Reset 的格式如下图
bulk-only Mass Storage Reset请求是通知设备接下来的批量端点输出数据为命令快封装包CBW(Command Block Wrapper),在这个请求中,仅需要设置一下状态,说明接下来的数据是CBW,然后返回一个长度为0的状态数据包。
3.仅批量传输的的数据流
类请求完成后,就进入了数据传输过程,在仅批量数据传输协议中规定,数据传输分为三个阶段:命令阶段、数据阶段和