原创 bulk-only传输

2009-3-11 13:58 4918 4 4 分类: MCU/ 嵌入式

1.bulk-only传输定义:


通过设备端点将包含CBW(共31字节)通过数据封包发送至OUT端点,如果有命令需要传送至主机,则向IN端点发送IN令牌,再通过控制传输接受所需要的数据,传输完成后,再接收CSW.


      注意:所有的CBW包必须按低字节在前的方式传送


 


2.  在BULK-ONLY协议中,有三种类型数据需要在USB总线中传输,它们是命令块包(CBW),命令执行状态包(CSW)和普通数据包。CBW是主机发往设备的命令。格式如下: 


4349_2_0801111633.jpg


第0~3字节:         dCBWSignature


第4~7字节:        DCBWTag


 第8-11字节:      DCBWDataTransferLength


第12字节:          BmCBWFlags        


第13个字节:     bCBWLun


第14个字节:     bCBWLength


第15到30个字节: SCSI 指令集


上述字节含义:
dCBWSignature   :


         表示当前发送的是一个CBW,是CBW的标志,固定值为0x43425355,所有CBW的值在USB总线上传输的时候都是按照LSB顺发送的,即最先发送低位,然后发送高位。



DCBWTag:


      由主机产生的并发送给设备,设备会将此值填入CSW的dCSWTag,以此返回给主机。



DCBWDataTransferLength:主机希望在批量端点上传输数据的大小。



BmCBWFlags:


        位D7=“0”时表示主机输出数据,反之主机接受数据,D6没有用到,D5-D0保留位。 


 BCBWCBLength:


            表示命令的长度。为后续字符串中命令字节的长度    
CBWCB:


         表示本次磁盘操作命令,也即是SCSI命令。当设备从主机收到CBW块以后,它会把SCSI命令从CBW中分离出来,然后根据要求执行,执行的结果又以CSW的形式发给主机。CBW是以二进制位发送的,每个包必须是精确的31个字节,不满足的要补0。


 


SCSI命令内容:


4349_4_0801111636.jpg


Operation Code:


                           是SCSI命令操作代码。
Logical Block Address:


                          逻辑块地址,对U盘而言应是扇区。前面已经讲过:通用海量存储设备是一个基于块/扇区存储的设备,因此在SCSI中要提供这个参数是很显然的。
transfer length:  为要传送的扇区数



SCSI中直接存取类型的存储介质的传输命令有很多,如:
INQUIRY:其操作码为12H
Test Unit Ready:其操作码为00H
Format Unit:其操作码为04H

CSW的格式如下:
dCSWSignature:


        CSW的标志,表示当前发送的是一个CSW,固定值为0x53425355,CSW的值也都是按LSB顺序发送。
DCSWTag:


               必须CBW中dCBWTag一样。
DCSWDataResidue:


               还要传送的数据。即CBWDataTransferLength字段中主机希望的数据长度与实际发送的数据长度之间的差额。
BCSWStatue:


        命令执行状态,命令正确执行时,为0。命令错误执行失败1,命令错误执行是2其他保留


/****以下为批量传输返回的数据*************/


发UFI_CMD_INQUIRY命令:


buf[0]=0x00;  直接存储设备


buf[1]=0x80; 设备是可移动设备


buf[2]=0x02;


buf[3]=0x02;...........


注意:一般U盘的一个扇区为512字节,而Bulk端点最大包长为64字节,即一个扇区的读写操作需要8个循环才能完成。



 


    


          


 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条