中国高校课件下载中心 》 教学资源 》 大学文库

《嵌入式应用开发》课程教学资源(文献资料)STM32 USB Mass Storage学习资料

文档信息
资源类别:文库
文档格式:PDF
文档页数:15
文件大小:372.04KB
团购合买:点击进入团购
内容简介
《嵌入式应用开发》课程教学资源(文献资料)STM32 USB Mass Storage学习资料
刷新页面文档预览

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();) 清除中断标志; 获取端点标识符; 控制端点处理:读端点寄存器,用来判断是数据输入、输出还是建 立包。 非控制端点处理:下一节介绍。 详见软件流程图

USB系线中断用定中斯类USBbstro晚用传输正销标记航首标记STRWKUP佳起中斯ISTRSOFISTR.CTR复位期望航首标记错装ISTRRESETISTRESOFISTRERR侯冲区出ISTRDOVR可用调点传输程序挂起使标记N-清标志位FCTR_LPODEVIERO清标志化状态机涵数韩起通数ResumeOrSuspendo)Usb_pwte评菌数Ueh_pwr.eLRESET.Callbock)pRcuh解请通款同通款St/sP Callbacko,WKUP CallbacknINOUT事务IN事务UT提取端点号一是香在感的IN事务IN事务-OUTN内核阶段内数阶段OUT事务内前段发送数报技收数据建定包处理InoProcess)请除发越标惠清除接收标毒Setupo Process()OutoProcessoClearEPCTR TXO;ClearEP_CTR_RXO智有可送授收数据调用批价DEVICEPROF爱送数据调用团国通款博用调拍款成Epx IN_CallbockSETAddres小准带数据请求EnxOUTCallbaelhUsbistrct最后阶段tishtrot标准无数据请求EPRUSET_CONFIGURATIONSETADDRESS注:绿色表示用户实现的函数DBEOUESETFEATIIRE黄色表示内部分Leer SeiDevioeAddClcarFEATUREGETSTATUSSETINTERFACI灰色表示Ub固件部分eaGETCONFIGURATIONGETINTERFACE注2:U%内核部分一些不涉及用户接口的说程及运数据调用已被想略,此图仅表示Uh器件和用户承南清米DEVICE PROP服贷请康DEVICEPROP数的调用关系ProcessNtamsDEVIE PROPCNoDaSeass Data Setu修订三操作威环操作盛坊修订4修订5:起河南工业大字发送0字节数据包可选效据除段应管图3、USB枚举软件流程图四、非控制端点处理(usb_endp.c一>usb.bot.c)端点2输出中断:usb主机传数据或命令包至mcu。端点1输入中断:mcu传数据或描述符至usb主机。1、端点2输出中断

图 3、USB 枚举软件流程图 四、 非控制端点处理(usb_endp.c -> usb.bot.c) 端点 2 输出中断:usb 主机传数据或命令包至 mcu。 端点 1 输入中断:mcu 传数据或描述符至 usb 主机。 1、端点 2 输出中断

(1)将主机传过来的数据从USB端点缓存区copy至MCU内存;(2)判断BOT状态,根据BOT状态做出相应的处理:当BOT状态位为0时,CBW包解析,并处理SCSI命令;当BOT状态为1时,表示数据输出,执行WRITE10命令处理。2、端点1输入中断判断BOT状态,如果BOT状态为2,表示数据输入,执行READ10命令处理;如果BOT状态为4,则表示数据输入完成,则返回CSW,进行到命令状态。3、BOT状态机软件流程图(1)端点2输出中断流程图(usb_bot.c->MassStorage_Out()端点2输出中断端点2输出中断从端点缓存copy数据至内存判断BOT状态其它1:数据输出重新初始化端点判断SCSI命令CBW包解析1和端点2的方向NO是WRITE10?YES重新初始化WRITE10命令处理端点2的方向山置BOT状态为5(出错)返回CSW返回图4、端点2输出中断(2)CBW包解析软件流程图(usbbot.c->CBWDecode()

(1) 将主机传过来的数据从 USB 端点缓存区 copy 至 MCU 内存; (2) 判断 BOT 状态,根据 BOT 状态做出相应的处理:当 BOT 状态位 为 0 时,CBW 包解析,并处理 SCSI 命令;当 BOT 状态为 1 时, 表示数据输出,执行 WRITE10 命令处理。 2、端点 1 输入中断 判断 BOT 状态,如果 BOT 状态为 2,表示数据输入,执行 READ10 命 令处理;如果 BOT 状态为 4,则表示数据输入完成,则返回 CSW,进行 到命令状态。 3、BOT 状态机软件流程图 (1)端点 2 输出中断流程图(usb_bot.c -> Mass_Storage_Out()) 图 4、端点 2 输出中断 (2)CBW 包解析软件流程图(usb_bot.c -> CBW_Decode())

CBW包解析CBW_Decode取出CBW包NO判断取出的CBW包长度为31字节否?YSE判断CBW中SCSI命令为READ10或WRITE否?NOYES计算逻辑块地址★计算数据长度判断CBW签名NO签名正确否?YES读取CBW.CB[0],解析CBW命令置BOT状态为5(出错)返回CSW+SCSI命令处理SCSI REQUEST SENSESCSI_INQUIRYSCSI READCAPACITY10返回

图5、CBW包解析(3)READ10命令软件流程图(usb_scsi.c->SCSI_Read10_Cmd(lun,LBA,BlockNbr))READ10命令处理READ10命令+判断BOT状态NO状态为0?IYESNONOBOT状态为2否个地址越界否?(数据输入)YES判断数据方向YSE读存储器READ_MENORYNO从设备到主机否?YES罩BOT状态为2,设BOT状返回CSW置BOT状态为5(出错)悉为数据输入状态读存储器READ_MEIORY返回图6、READ10命令(4)WRITE10命令软件流程图(usb_scsi.c->SCSI_Write10_Cmd(lun,LBA,BlockNbr))

图 5、CBW 包解析 (3)READ10 命令软件流程图(usb_scsi.c -> SCSI_Read10_Cmd(lun , LBA , BlockNbr)) 图 6、READ10 命令 (4)WRITE10 命令软件流程图(usb_scsi.c -> SCSI_Write10_Cmd(lun , LBA , BlockNbr))

WRITE10命令处理WRITE10命令1判断BOT状态状态为0?LYESNONOBOT状态为1否?地址越界否?(数据输出)YES判断数据方向YSE写存储器WRITE MEHORYNC从主机到设备否?YES返回CSW惠男套福快BOT因置BOT状态为5(出错)返回图7、WRITE10命令(5)端点1输入中断流程图(usbbot.c->Mass_Storage_InO)端点1输入中断开始判断BOT状态为3:数据输入到最后为5:错误为2:数据输入置BOT状态为4初始化BOT状态为0判断SCSI命令返回CSWNO初始化端点2允许接收为READ10YESREAD10命令处理返回

图 7、WRITE10 命令 (5)端点 1 输入中断流程图(usb_bot.c -> Mass_Storage_In())

共15页,试读已结束,阅读完整版请下载
刷新页面下载完整文档
VIP每日下载上限内不扣除下载券和下载次数;
按次数下载不扣除下载券;
注册用户24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
相关文档