logo资料库

STM32 USB Mass Storage学习资料.pdf

第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
资料共15页,剩余部分请下载后查看
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挂起模式的唤醒事件触发。
图 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)
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 传输。
图 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
寄存器),在 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();) 清除中断标志; 获取端点标识符; 控制端点处理:读端点寄存器,用来判断是数据输入、输出还是建 立包。 非控制端点处理:下一节介绍。 详见软件流程图。
图 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 -> Mass_Storage_Out()) 图 4、端点 2 输出中断 (2)CBW 包解析软件流程图(usb_bot.c -> CBW_Decode())
分享到:
收藏