本文PDF文档下载
了解了USB Mass Storage BOT的规范。接下来学习一下Microchip 单片机实现USB Mass Storage设备的经典Application Notes。
MICROCHIP AN1003 :USB Mass storage Device Using a PIC MCU
本文描述了使用SD卡来设计实现USB Mass storage设备(MSD)。本文对USB Mass storage方案的开发人员会有很大的帮助。这个应用可以作为独立的MSD或一个SD卡读写器。
本设计有下列组件构成:
<!--[if !supportLists]-->● <!--[endif]-->PIC<?xml:namespace prefix = st1 />18F4550 MCU
<!--[if !supportLists]-->● <!--[endif]-->PICDEM FS USB Demo板
<!--[if !supportLists]-->● <!--[endif]-->PICtail 板(SD和MMC卡)
<!--[if !supportLists]-->● <!--[endif]-->Windows操作系统
<?xml:namespace prefix = o />
枚举过程
下面总结了USB设备的枚举步骤而且说明了在枚举过程中设备如何从Powered到Default,Address和Configured状态。
<!--[if !supportLists]-->1. <!--[endif]-->用户将USB设备插入USB口。Hub给端口供电,设备处于Powered状态。
<!--[if !supportLists]-->2. <!--[endif]-->Hub识别设备。
<!--[if !supportLists]-->3. <!--[endif]-->Hub通过一个终端PIPE去向Host报告event。
<!--[if !supportLists]-->4. <!--[endif]-->Host 发送 Get_Port_Status 请求获得关于设备更详细的信息。
<!--[if !supportLists]-->5. <!--[endif]-->Hub识别设备是LowSpeed或FullSpeed。并且将Get_Port_Status的响应信息发送给主机。
<!--[if !supportLists]-->6. <!--[endif]-->主机发送Set_Port_Feature请求,要求Hub去复位端口port。
<!--[if !supportLists]-->7. <!--[endif]-->Hub复位设备。
<!--[if !supportLists]-->8. <!--[endif]-->主机获悉Full-Speed 设备是否支持High-Speed操作(使用Chirp K信号)。
<!--[if !supportLists]-->9. <!--[endif]-->主机利用Get_Port_Status判断设备是否已经推出Reset状态。
<!--[if !supportLists]-->10. <!--[endif]-->此时,设备处于Default状态(设备已经准备好通过缺省Pipe的Endpoint0响应控制传输,缺省地址是00h。而且设备可以从总线获得最大100mA)。
<!--[if !supportLists]-->11. <!--[endif]-->主机发送Get_Descriptor 来获得最大封包大小(注意:设备描述符的第八个字节是bMaxPacketSize)
<!--[if !supportLists]-->12. <!--[endif]-->主机通过发送Set_Address 请求为设备分配地址。设备现在处于Address状态。
<!--[if !supportLists]-->13. <!--[endif]-->主机发送Get_Descriptor来获得设备的更多的信息。
<!--[if !supportLists]-->14. <!--[endif]-->主机分配并调用一个设备驱动。
<!--[if !supportLists]-->15. <!--[endif]-->主机的设备驱动通过发送一个Set_Configuration请求来选择一个配置。现在设备处于Configured状态。
<!--[if !supportLists]-->16. <!--[endif]-->主机为复合设备的接口分配驱动。
<!--[if !supportLists]-->17. <!--[endif]-->如果hub检测到过流状态,或主机响应hub关闭电源。设备将从USB总线上下电。这时,设备和主机不能通讯而且设备处于Attached状态。
<!--[if !supportLists]-->18. <!--[endif]-->如果设备在总线上有3ms没有动作。它将进入Suspend状态。此时,设备消耗总线上最小的功耗。
注:这篇AN里,这部分枚举过程的描述比较经典呀!
控制传输
控制传输允许主机和设备交换关于设备配置和其它控制消息的信息。控制传输是由Setup Stage,可选的Data Stage和Status Stage组成。
“Standard USB Device Requests”总共有11个USB 标志控制传输请求。所有的USB设备都必须响应这些请求(即使仅响应了STALL)。处理标志的请求,每个USB类也会定义本类的设备请求。例如:Mass Storage设备要实现Get_Max_LUN请求来使主机能够知道设备支持的逻辑单元数。
Mass Storage类
Mass Storage类支持两个传输协议:
<!--[if !supportLists]-->● <!--[endif]-->Bulk-Only 传输(BOT)
<!--[if !supportLists]-->● <!--[endif]-->Control/Bulk/Interrupt传输(CBI)
Mass Storage类规范定义了两个类规定的请求:Get_Max_LUN和Mass Storage Reset,所有的Mass Storage类设备都必须支持这两个请求。
Bulk-Only Mass Storage Reset(bmRequestType=00100001b and bRequest= 11111111b)用来复位Mass Storage设备及其相关接口。
Get_Max_LUN(bmRequestType= 10100001b and bRequest= 11111110b)用来确认设备支持的逻辑单元数。Max LUN的值必须是0~15。注意:LUN是从0开始的。主机不能向不存在的LUN发送CBW。
支持BOT传输的Mass Storage设备接口描述符要求如下:
bInterfaceClass=08h,表示为Mass Storage设备;
bInterfaceSubClass=06h,表示设备支持SCSI Primary Command-2(SPC-2);
bInterfaceProtocol=50h,表示实现BOT传输。
支持BOT的设备必须支持最少3个endpoint:Control, Bulk-In和Bulk-Out。USB2.0的规范定义了控制端点0。Bulk-In端点用来从设备向主机传送数据。Bulk-Out端点用来从主机向设备传送数据。
Bulk-Only传输(BOT)
像控制传输一样,BOT也是由Command阶段,可选的数据阶段和状态阶段组成。所有的command请求都可能有或没有Data阶段。下图说明了BOT的Command传输,Data-In,Data-Out传输及Status传输。
CBW是由31个字节组成的短包。CBW和后续的数据以及CSW都是从新封包开始的。要注意的是所有CBW传输都是little-endian模式。
在CBW中,dCBWSignature必须是“43425355h”,表示是CBW封包。dCBWTag是CB标签,会通过对应的CSW的标签反馈回来。
SD卡
SD卡是便携设备中最常见的存储媒介。SD卡支持SD总线和SPI总线。PIC18F4550
支持SPI方式读写SD卡。除了电源和地,SPI总线有CS,SDI,SDO和SCLK信号组成。SD卡在时钟的上升沿采集输入数据,在时钟的下降沿发送输出数据。在上电后,SD卡缺省处于SD总线模式。因此,初试阶段应该将SD置于SPI模式。可以通过接收CMD0(Reset命令)阶段将CS信号置低。不像SD总线模式,在SPI模式下,被选中的SD卡总是响应命令。
待续.......
用户154709 2009-1-13 17:13
用户154709 2009-1-13 17:13
用户461174 2008-7-18 11:56
zhaoliang_0801_926809075 2007-12-20 00:00
博主 看来 很忙啊,这也叫博客吗?
看了你的几个文章,都是草草了事,图片简单的文字,
大篇幅的文章都是转载的吧 !