USBMassStorage学习笔记一STM32十FLASH实现U盘内容概述采用STM32内部自带USB控制器外加大页NANDFLASHK9F1G08U0A实现一个128M的U盘。1、STM32的USB控制器STM32F103的MCU自带USB从控制器,符合USB规范的通信连接;PC主机和微控制器之间的数据传输是通过共享一专用的数据缓冲区来完成的,该数据缓冲区能被USB外设直接访问。这块专用数据缓冲区的大小由所使用的端点数目和每个端点最大的数据分组大小所决定,每个端点最大可使用512字节缓冲区,最多可用于16个单向或8个双向端点。USB模块同PC主机通信,根据USB规范实现令牌分组的检测,数据发送/接收的处理,和握手分组的处理。整个传输的格式由硬件完成,其中包括CRC的生成和校验。每个端点都有一个缓冲区描述块,描述该端点使用的缓冲区地址、大小和需要传输的字节数。当USB模块识别出一个有效的功能/端点的令牌分组时,(如果需要传输数据并且端点已配置)随之发生相关的数据传输。USB模块通过一个内部的16位寄存器实现端口与专用缓冲区的数据交换。在所有的数据传输完成后,如果需要,则根据传输的方向,发送或接收适当的握手分组。在数据传输结束时,USB模块将触发与端点相关的中断,通过读状态寄存器和或者利用不同的中断来处理。USB的中断映射单元:将可能产生中断的USB事件映射到三个不同的NVIC请求线上:(1)USB低优先级中断(通道2O):可由所有USB事件触发(正确传输,USB复位等)。固件在处理中断前应当首先确定中断源。(2)USB高优先级中断(通道19):仅能由同步和双缓冲批量传输的正确传输事件触发,目的是保证最大的传输速率。(3)USB唤醒中断(通道42):由USB挂起模式的唤醒事件触发
USB Mass Storage 学习笔记-STM32+FLASH 实现 U 盘 一、 内容概述 采 用 STM32 内部自带 USB 控制器外加大页 NAND FLASH K9F1G08U0A 实现一个 128M 的 U 盘。 1、STM32 的 USB 控制器 STM32F103的MCU自带USB从控制器,符合USB规范的通信连接;PC主 机和微控制器之间的数据传输是通过共享一专用的数据缓冲区来完成的,该数据 缓冲区能被USB外设直接访问。这块专用数据缓冲区的大小由所使用的端点数 目和每个端点最大的数据分组大小所决定,每个端点最大可使用512字节缓冲 区,最多可用于16个单向或8个双向端点。USB模块同PC主机通信,根据USB 规范实现令牌分组的检测,数据发送/接收的处理,和握手分组的处理。整个传 输的格式由硬件完成,其中包括CRC的生成和校验。 每个端点都有一个缓冲区描述块,描述该端点使用的缓冲区地址、大小和 需要传输的字节数。 当USB模块识别出一个有效的功能/端点的令牌分组时,(如果需要传输数据 并且端点已配置)随之发生相关的数据传输。USB模块通过一个内部的16位寄存 器实现端口与专用缓冲区的数据交换。在所有的数据传输完成后,如果需要,则 根据传输的方向,发送或接收适当的握手分组。 在数据传输结束时,USB模块将触发与端点相关的中断,通过读状态寄存 器和/或者利用不同的中断来处理。 USB的中断映射单元:将可能产生中断的USB事件映射到三个不同的NVIC 请求线上: (1)USB低优先级中断(通道20):可由所有USB事件触发(正确传输, USB复位等)。固件在处理中断前应当首先确定中断源。 (2)USB高优先级中断(通道19):仅能由同步和双缓冲批量传输的正 确传输事件触发,目的是保证最大的传输速率。 (3)USB唤醒中断(通道42):由USB挂起模式的唤醒事件触发
4D+AD.USBClock(48MHz)AnalogTransceiverPCLK1AAZUSBControlClockRX-TXregisters&logicSuspendRecoveryTimerControlEndpointInterruptSelectionS.I.Eregisters&logicPacketBufferEndpointEndpointInterfaceRegistersRegistersPacketRegisterInterruptBufferArbiterMapperMapperMemory全+APB1wrapperAPB1InterfaceRIRQstoNVICPCLK1APB1,bus图1、USB设备框图2、大页NANDK9F1G08Nandflash以页为单位读写数据,而以块为单位擦除数据。根据NAND的容量等级又将NANDFLASH分为大页NAND和小页NAND:K9F1GO8就是大页NAND,它的页大小为(2K+64)Byte,块大小为(128K十4K)Byte。K9F1208U0M为小页NAND,它的页大小为(512+16)Byte,块大小为(16K+512)Byte。由于写数据至FLASH时,只能将指定的位变为O,而不能将指定的位变位1。因此在写一个页的数据前,必须先擦除(将所有的位全部置1),否则写数据会失败。在编制FLASH的读写程序时,需要传递三个参数,要操作的地址,要操作的数据缓存,要操作的数据长度:在写操作时,还要有擦写和坏块管理。3、USBMassstorageBulkOnlyMassStorage类支持两个传输协议:1、Bulk-Only传输(BOT)2、Control/Bulk/Interrupt传输(CBI)
图 1、USB设备框图 2、大页NAND K9F1G08 Nand flash 以页为单位读写数据,而以块为单位擦除数据。根据NAND 的容量等级又将NANDFLASH分为大页NAND和小页NAND;K9F1G08就是大页 NAND,它的页大小为(2K+64)Byte,块大小为(128K+4K)Byte。K9F1208U0M 为小页NAND,它的页大小为(512+16)Byte,块大小为(16K+512)Byte。 由于写数据至FLASH时,只能将指定的位变为0,而不能将指定的位变位 1。因此在写一个页的数据前,必须先擦除(将所有的位全部置1),否则写数 据会失败。 在编制FLASH的读写程序时,需要传递三个参数,要操作的地址,要操 作的数据缓存,要操作的数据长度;在写操作时,还要有擦写和坏块管理。 3、USB Mass storage Bulk Only Mass Storage 类支持两个传输协议: 1、Bulk-Only 传输(BOT) 2、Control/Bulk/Interrupt 传输(CBI)
MassStorage类规范定义了两个类规定的请求:Get_Max_LUN和MassStorageReset,所有的MassStorage类设备都必须支持这两个请求。Bulk-Only Mass Storage Reset(bmRequestType=00100001b and bRequest=11111111b)用来复位MassStorage设备及其相关接口。Get_Max_LUN(bmRequestType=10100001bandbRequest=11111110b)用来确认设备支持的逻辑单元数。MaXLUN的值必须是0~15。注意:LUN是从0开始的。主机不能向不存在的LUN发送CBW。支持BOT传输的MassStorage设备接口描述符要求如下:接口类代码bInterfaceclass=08h,表示为MassStorage设备:接口类子代码bInterfaceSubClass=06h,表示设备支持SCSIPrimaryCommand-2(SPC-2);协议代码bInterfaceProtocol有3种:Ox00、Ox01、Ox50,前两种需要使用中断传输,最后一种仅使用批量传输(BOT)。支持BOT的设备必须支持最少3个endpoint:Control,Bulk-In和Bulk-0ut。USB2.0的规范定义了控制端点0。Bulk-In端点用来从设备向主机传送数据。Bulk-Out端点用来从主机向设备传送数据。Bulk-Only传输(BOT)像控制传输一样,BOT也是由Command阶段,可选的数据阶段和状态阶段组成。所有的command请求都可能有或没有Data阶段。下图说明了BOT的Command传输,Data-In,Data-Out传输及Status传输
Mass Storage 类规范定义了两个类规定的请求:Get_Max_LUN 和 Mass Stor age Reset,所有的 Mass Storage 类设备都必须支持这两个请求。 Bulk-Only Mass Storage Reset(bmRequestType=00100001b and bReques t= 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 Com mand-2(SPC-2); 协议代码 bInterfaceProtocol 有 3 种:0x00、0x01、0x50,前两种需要使 用中断传输,最后一种仅使用批量传输(BOT)。 支持 BOT 的设备必须支持最少 3 个 endpoint:Control, Bulk-In 和 Bulk-O ut。USB2.0 的规范定义了控制端点 0。Bulk-In 端点用来从设备向主机传送数据。 Bulk-Out 端点用来从主机向设备传送数据。 Bulk-Only 传输(BOT) 像控制传输一样,BOT 也是由 Command 阶段,可选的数据阶段和状态阶段组 成。所有的 command 请求都可能有或没有 Data 阶段。下图说明了 BOT 的 Comman d 传输,Data-In,Data-Out 传输及 Status 传输
FIGURE3:COMMAND/DATA/STATUSFLOWINBULK-ONLYTRANSPORTReady咖CommandTransport(CBW)Data-OutData-In(fromhost)(to host)StatusTransport(CSW)图2、Bulk-Only传输示意图CBW是由31个字节组成的短包。CBW和后续的数据以及CSW都是从新封包开始的。要注意的是所有CBW传输都是little-endian模式。在CBW中,dCBWSignature必须是“43425355h”,表示是CBW封包。dCBWTag是CB标签,会通过对应的CSW的标签反馈回来。在CSW中,dCSwSignature必须是“53425355h”,表示是CSW包。系统的初始化二、1、初始化系统时钟,设置USB时钟为48MHz;2、USB中断配制,选择通道、设置优先级、使能中断。3、USB初始化:连接USB、USB硬件复位、配制CNTR寄存器使能和屏蔽中断、清零中断状态寄存器。4、FLASH初始化。USB的枚举三、当USB连接时,进入USB低优先级中断。首先获取中断状态(读ISTR
图 2、Bulk-Only 传输示意图 CBW 是由 31 个字节组成的短包。CBW 和后续的数据以及 CSW 都是从新封包开始的。 要注意的是所有 CBW 传输都是 little-endian 模式。 在 CBW 中,dCBWSignature 必须是“43425355h”,表示是 CBW 封包。dCBWTag 是 CB 标签,会通过对应的 CSW 的标签反馈回来。 在 CSW 中,dCSWSignature 必须是“53425355h”,表示是 CSW 包。 二、 系统的初始化 1、初始化系统时钟,设置 USB 时钟为 48MHz; 2、USB 中断配制, 选择通道、设置优先级、使能中断。 3、USB 初始化:连接 USB、USB 硬件复位、配制 CNTR 寄存器使能和屏蔽 中断、清零中断状态寄存器。 4、FLASH 初始化。 三、 USB 的枚举 当 USB 连接时,进入 USB 低优先级中断。首先获取中断状态(读 ISTR
寄存器),在MASSSTORAGE中有USB复位中断、USB挂起中断和正确的数据传输中断。注:在usb_istr.c 的void USB_Istr(void)函数中。1、USB总线复位:设置分组缓冲区描述表起始地址;初始化端点:端点0为控制端点、端点1、2为批量端点;设置发送和接收状态,设置发送和接收缓冲区地址。设置CBW签名,CBW.dSignature=0x43425355;初始化BOT状态机。注:在usb_prop.c的voidMASS_Reset()函数中。2、USB总线挂起:XmS总线上无数据传输,USB总线挂起,进入低功耗模式。注:在usb_pwr.c的voidSuspend()函数中。3、正确的数据传输中断(usb_int.cCTR LPO,清除中断标志;获取端点标识符;控制端点处理:读端点寄存器,用来判断是数据输入、输出还是建立包。非控制端点处理:下一节介绍。详见软件流程图
寄存器),在 MASS STORAGE 中有 USB 复位中断、USB 挂起中断和正确的 数据传输中断。 注:在 usb_istr.c 的 void USB_Istr(void)函数中。 1、USB 总线复位: 设置分组缓冲区描述表起始地址; 初始化端点:端点 0 为控制端点、端点 1、2 为批量端点;设置发 送和接收状态,设置发送和接收缓冲区地址。 设置 CBW 签名, CBW.dSignature=0x43425355; 初始化 BOT 状态机。 注:在 usb_prop.c 的 void MASS_Reset()函数中。 2、USB 总线挂起:Xms 总线上无数据传输,USB 总线挂起,进入低功 耗模式。 注:在 usb_pwr.c 的 void Suspend()函数中。 3、正确的数据传输中断(usb_int.c CTR_LP();) 清除中断标志; 获取端点标识符; 控制端点处理:读端点寄存器,用来判断是数据输入、输出还是建 立包。 非控制端点处理:下一节介绍。 详见软件流程图