打印

【转】USB Mass Storage学习笔记

[复制链接]
4367|58
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunmeat|  楼主 | 2015-2-25 14:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

一、            内容概述

采用STM32内部自带USB控制器外加大页NAND FLASH K9F1G08U0A实现一个128M的U盘。


沙发
sunmeat|  楼主 | 2015-2-25 14:09 | 只看该作者
1、STM32的USB控制器

    STM32F103的MCU自带USB从控制器,符合USB规范的通信连接;PC主机和微控制器之间的数据传输是通过共享一专用的数据缓冲区来完成的,该数据缓冲区能被USB外设直接访问。这块专用数据缓冲区的大小由所使用的端点数目和每个端点最大的数据分组大小所决定,每个端点最大可使用512字节缓冲区,最多可用于16个单向或8个双向端点。USB模块同PC主机通信,根据USB规范实现令牌分组的检测,数据发送/接收的处理,和握手分组的处理。整个传输的格式由硬件完成,其中包括CRC的生成和校验。

使用特权

评论回复
板凳
sunmeat|  楼主 | 2015-2-25 14:09 | 只看该作者
每个端点都有一个缓冲区描述块,描述该端点使用的缓冲区地址、大小和需要传输的字节数。

使用特权

评论回复
地板
sunmeat|  楼主 | 2015-2-25 14:09 | 只看该作者
当USB模块识别出一个有效的功能/端点的令牌分组时,(如果需要传输数据并且端点已配置)随之发生相关的数据传输。USB模块通过一个内部的16位寄存器实现端口与专用缓冲区的数据交换。在所有的数据传输完成后,如果需要,则根据传输的方向,发送或接收适当的握手分组。

使用特权

评论回复
5
sunmeat|  楼主 | 2015-2-25 14:10 | 只看该作者
在数据传输结束时,USB模块将触发与端点相关的中断,通过读状态寄存器和/或者利用不同的中断来处理。

使用特权

评论回复
6
sunmeat|  楼主 | 2015-2-25 14:11 | 只看该作者
USB的中断映射单元:将可能产生中断的USB事件映射到三个不同的NVIC请求线上:

(1)USB低优先级中断(通道20):可由所有USB事件触发(正确传输,USB复位等)。固件在处理中断前应当首先确定中断源。

(2)USB高优先级中断(通道19):仅能由同步和双缓冲批量传输的正确传输事件触发,目的是保证最大的传输速率。

(3)USB唤醒中断(通道42):由USB挂起模式的唤醒事件触发。

使用特权

评论回复
7
sunmeat|  楼主 | 2015-2-25 14:11 | 只看该作者
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。

使用特权

评论回复
8
sunmeat|  楼主 | 2015-2-25 14:11 | 只看该作者
由于写数据至FLASH时,只能将指定的位变为0,而不能将指定的位变位1。因此在写一个页的数据前,必须先擦除(将所有的位全部置1),否则写数据会失败。

使用特权

评论回复
9
sunmeat|  楼主 | 2015-2-25 14:12 | 只看该作者
在编制FLASH的读写程序时,需要传递三个参数,要操作的地址,要操作的数据缓存,要操作的数据长度;在写操作时,还要有擦写和坏块管理。

使用特权

评论回复
10
sunmeat|  楼主 | 2015-2-25 14:12 | 只看该作者
3、USB Mass storage Bulk Only

Mass Storage类支持两个传输协议:

1、Bulk-Only 传输(BOT)

2、Control/Bulk/Interrupt传输(CBI)

使用特权

评论回复
11
sunmeat|  楼主 | 2015-2-25 14:13 | 只看该作者
Mass Storage类规范定义了两个类规定的请求:Get_Max_LUN和Mass Storage Reset,所有的Mass Storage类设备都必须支持这两个请求。

使用特权

评论回复
12
sunmeat|  楼主 | 2015-2-25 14:13 | 只看该作者
Bulk-Only Mass Storage Reset(bmRequestType=00100001b and bRequest= 11111111b)用来复位Mass Storage设备及其相关接口。

使用特权

评论回复
13
sunmeat|  楼主 | 2015-2-25 14:13 | 只看该作者
Get_Max_LUN(bmRequestType= 10100001b and bRequest= 11111110b)用来确认设备支持的逻辑单元数。Max LUN的值必须是0~15。注意:LUN是从0开始的。主机不能向不存在的LUN发送CBW。

使用特权

评论回复
14
sunmeat|  楼主 | 2015-2-25 14:14 | 只看该作者
支持BOT传输的Mass Storage设备接口描述符要求如下:

接口类代码bInterfaceClass=08h,表示为Mass Storage设备;

接口类子代码bInterfaceSubClass=06h,表示设备支持SCSI Primary Command-2(SPC-2);

协议代码bInterfaceProtocol有3种:0x00、0x01、0x50,前两种需要使用中断传输,最后一种仅使用批量传输(BOT)。

使用特权

评论回复
15
sunmeat|  楼主 | 2015-2-25 14:14 | 只看该作者
支持BOT的设备必须支持最少3个endpoint:Control, Bulk-In和Bulk-Out。USB2.0的规范定义了控制端点0。Bulk-In端点用来从设备向主机传送数据。Bulk-Out端点用来从主机向设备传送数据。

使用特权

评论回复
16
sunmeat|  楼主 | 2015-2-25 14:16 | 只看该作者
Bulk-Only传输(BOT)

像控制传输一样,BOT也是由Command阶段,可选的数据阶段和状态阶段组成。所有的command请求都可能有或没有Data阶段。下图说明了BOT的Command传输,Data-In,Data-Out传输及Status传输。

使用特权

评论回复
17
sunmeat|  楼主 | 2015-2-25 14:17 | 只看该作者
Bulk-Only传输(BOT)

像控制传输一样,BOT也是由Command阶段,可选的数据阶段和状态阶段组成。所有的command请求都可能有或没有Data阶段。下图说明了BOT的Command传输,Data-In,Data-Out传输及Status传输。

使用特权

评论回复
18
sunmeat|  楼主 | 2015-2-25 14:17 | 只看该作者
CBW是由31个字节组成的短包。CBW和后续的数据以及CSW都是从新封包开始的。要注意的是所有CBW传输都是little-endian模式。

使用特权

评论回复
19
sunmeat|  楼主 | 2015-2-25 14:17 | 只看该作者
在CBW中,dCBWSignature必须是“43425355h”,表示是CBW封包。dCBWTag是CB标签,会通过对应的CSW的标签反馈回来。

在CSW中,dCSWSignature必须是“53425355h”,表示是CSW包。

使用特权

评论回复
20
sunmeat|  楼主 | 2015-2-25 14:18 | 只看该作者
二、            系统的初始化

1、初始化系统时钟,设置USB时钟为48MHz;

2、USB中断配制,

选择通道、设置优先级、使能中断。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

208

主题

2132

帖子

13

粉丝