没有合适的资源?快使用搜索试试~ 我知道了~
单片机读写U盘FAT32或FAT16文件系统.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 113 浏览量
2022-07-14
17:58:20
上传
评论
收藏 3.09MB PDF 举报
温馨提示
试读
47页
单片机读写U盘FAT32或FAT16文件系统.pdf
资源推荐
资源详情
资源评论
第1章 U 盘的逻辑结构
1.1 U 盘的逻辑结构
U 盘可以看成是以扇区( 1 扇区= 512Bytes)为单位线性排列的实体,即 0 号扇区, 1
号扇区, 2 号扇区, ,, 这样按顺序地排列下去。 U 盘是 flash,对 flash 的操作总是以块为
单位的,因此单片机对 U 盘的操作是以扇区为单位,整个扇区地读取,或整个扇区地写入。
第2章 USB 通信协议
2.1 USB 设备开工的机理
USB 是即插即用的,涵盖海量存储器(如 U 盘、移动硬盘) 、人机交互设备(如鼠标键
盘游戏杆)、扫描仪、 打印机等等各种各样功能的设备, 那么 USB 主机是如何判断目前接入
的设备到底是怎么样的呢?答案是 USB 描述符,以及 USB 的枚举。
2.2 USB 描述符
这个概念很简单,就是对各种纷繁芜杂的 USB 外设按功能划分大类 (class),大类下又
再细分小类 (subclass),每个类别给予一串特定的符号( Descriptor )供主机辨识。
每个 USB 设备只能有一个 DEVICE 描述符,它指明了该设备属于哪一大类,是海量存
储器类,还是人机交互设备类,还是打印机或者扫描仪类,等等。
每个 DEVICE 下可以有 1 个或多个配置描述符( configuration ),以说明该设备含有哪
些功能。如一个 USB 接口的 CDROM 可以同时具有读写光盘的功能和播放 CD 的功能。有
几个功能,就有几个配置描述符。
每种配置对应若干个接口描述符 (Interface ),以描述该配置使用哪些接口与主机进行通
信。
每个 Interface 又都是端点( End Point)的集合,端点就是设备与 USB 主机交换数据的
最原子单位了。每个 Interface 用到的端点可以是一个 或多个。下图摘自 USB MASS
STORAGE CBI Transport Specification 第 6 页,清楚说明各种描述符的组织情况。
2.3 USB 设备的枚举过程(开工过程)
有了完善的分类后, USB 设备上电即可通过枚举过程告诉 USB 主机自己的详细信息,
这很类似一个一问一答的过程,如下:
主机(下称 H):你是甚么设备?
设备(下称 D):我是 12 01 0100,, (这就是 DEVICE 描述符了)
H:你有几种功能?
D:我有 09 02 09 ,, (配置描述符)
H:每种功能有几个接口?
D: 09 04 00 ,, (接口描述符)
H:每个接口用到哪些端点?
D: 07 05 81 ,, (端点描述符)
H:好了,我知道你是谁了,开始传数据吧!
D: OK. READY GO!
具体而言, USB 枚举过程有以下步骤:
(1) 集线器检测新设备
主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。 (集线器端口的两根
信号线的每一根都有 15kΩ的下拉电阻,而每一个设备在 D+ 都有一个 1.5kΩ的上拉电阻。
当用 USB 线将 PC 和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线
器检测到。)
(2) 主机知道了新设备连接后
每个集线器用中断传输来报告在集线器上的事件。 当主机知道了这个事件, 它给集线器发送
一个 Get_Status 请求来了解更多的消息。返回的消息告诉主机一个设备是什么时候连接的。
(3) 集线器重新设置这个新设备
当主机知道有一个新的设备时,主机给集线器发送一个 Set_Feature 请求,请求集线器来重
新设置端口。集线器使得设备的 USB 数据线处于重启( RESET)状态至少 10ms。
(4) 集线器在设备和主机之间建立一个信号通路
主机发送一个 Get_Status 请求来验证设备是否激起重启状态。 返回的数据有一位表示设备仍
然处于重启状态。 当集线器释放了重启状态, 设备就处于默认状态了, 即设备已经准备好通
过 Endpoint 0 的默认流程响应控制传输。即设备现在使用默认地址 0x0 与主机通信。
(5) 集线器检测设备速度
集线器通过测定那根信号线( D+ 或 D-)在空闲时有更高的电压来检测设备是低速设备还是
全速设备。(全速和高速设备 D+ 有上拉电阻,低速设备 D- 有上拉电阻)。
以下,需要 USB 的 firmware 进行干预
(6) 获取最大数据包长度
PC 向 address 0 发送 USB 协议规定的 Get_Device_Descriptor 命令,以取得缺省控制管道所
支持的最大数据包长度,并在有限的时间内等待 USB 设备的响应,该长度包含在设备描述
符的 bMaxPacketSize0 字段中,其地址偏移量为 7,所以这时主机只需读取该描述符的前 8
个字节。 注意, 主机一次只能列举一个 USB 设备, 所以同一时刻只能有一个 USB 设备使用
缺省地址 0。
(7) 主机分配一个新的地址给设备
主机通过发送一个 Set_Address 请求来分配一个唯一的地址给设备。设备读取这个请求,返
回一个确认,并保存新的地址。从此开始所有通信都使用这个新地址。
(8) 主机向新地址重新发送 Get_Device_Descriptor 命令, 此次读取其设备描述符的全部
字段,以了解该设备的总体信息,如 VID ,PID 。
(9) 主机向设备循环发送 Get_Device_Configuration 命令,要求 USB 设备回答,以读取
全部配置信息。
(10) 主机发送 Get_Device_String 命令, 获得字符集描述 (unicode),比如产商、 产品描
述、型号等等。
(11) 如果主机是 PC 电脑,此时主机将会弹出窗口,展示发现新设备的信息,产商、产
品描述、型号等。
(12) 根据 Device_Descriptor 和 Device_Configuration 应答, PC 判断是否能够提供 USB
的 Driver ,一般 win2k 能提供几大类的设备,如游戏操作杆、存储、打印机、扫描仪等,操
作就在后台运行。
(13) 加载了 USB 设备驱动以后,主机发送 Set_Configuration (x)命令请求为该设备选
择一个合适的配置 (x 代表非 0 的配置值 )。如果配置成功, USB 设备进入“配置”状态,并
可以和客户软件进行数据传输。此时,常规的 USB 完成了其必须进行的配置和连接工作。
查看注册表,能够发现相应的项目已经添加完毕,至此设备应当可以开始使用。
以上是 PC 电脑为主机的枚举过程,对于单片机作为主机的情形,过程要简单一些,以
枚举 U 盘为例:
(1) 芯片 SL811 监视 USB 总线电平,当发现有 U 盘插入后,给单片机一个中断信号。
(2) 单片机给 SL811 发出端口复位命令,持续 100 毫秒以上。
(3) 单片机发出 Get_Device_descriptor 命令,从默认的端口 0 和地址 0 发出。该命令先
假设了包传送的大小是 64 字节,在获得命令返回时修正 MaxPacketSize。此步同 PC。
(4) 单片机发送 Set_Address 请求来分配一个唯一的地址给 U 盘,我们实际应用中固定
分配了地址 2。此步同 PC。
(5) 单片机向新地址 2 重新发送 Get_Device_Descriptor 命令,此次读取 U 盘设备描述符
的全部字段,以了解该设备的总体信息,如 VID , PID。此步同 PC。
(6) 单片机发送 Get_Configuration_Descriptor 命令获取配置描述符。
(7) 根据获取的配置信息,单片机发送 SetConfig 和 SetInterface 命令对 U 盘进行配置。
(8) 对获取的 Interface 描述符和 Endpoint 描述符进行分析,判断是否大容量存储设备、
是否支持 SCSI 命令集、是否 BULK_ONLY 传输、端口的最大包长等内容。
(9) 发送 Get_Max_LUN 命令获取 U 盘的进一步信息(根据协议看此步非必须,有些 U
盘此步会返回 STALL ,即不支持,也没有关系) 。但是建议在枚举过程中不省略此步,因为
不同品牌 U 盘其固件可能不一样,有些固件可能不允许省略此步。
(10) 完成上述步骤后, U 盘的枚举过程完成, 接着需要发送几条 SCSI 命令来对 U 盘进
行初始化,这几条命令依次是 Inquiry 、ReadFormatCapacity 、ReadCapacity。完成后, U 盘
已经准备好接收单片机发出的任何读写命令(读写命令也是来自 SCSI 命令集)。
如果你有兴趣知道 USB 协议一些更细节的内容,请往下看。否则可以直接跳到第四章
的文件系统部分。
2.4 USB1.1 协议
本节内容主要涵盖 USB 1.1 Specification 的第 4、5、8、9 章。并且主要描述代码中无法
注释或者在代码中注释会太麻烦的内容。
USB 是一种主从的结构。所有传输由 Host 来发起。当主机发起一次传输时,这次传输
的包( Packets)通常包括三个阶段。主机首先是发送一个 Token Packet,内里包含本次传输
的命令类型 (type)、方向(direction )、设备的地址 (device address)以及端点号 ( Endpoint)。
紧接着是数据包 (data packet),就是包含数据了。 最后将由 device 返回握手信号包 (handshake
packet),表示是正确收到了( ACK )还是其他的失败原因。三个包如下图所示。
USB 的传输模型: Host 和设备的某个端点之间可以看成有一条逻辑管道( pipe)。Pipe
分两种: 业务数据流和信令消息。 业务流即指纯粹的数据, 信令流指控制信息。 其实通信协
议很多都如此,分业务流和信令流,例如电信网中的 7 号信令。
在信令管道中,有一条默认的管道,那就是零地址处的零号端点,这条管道在 USB 设
备上电复位或总线复位后就存在了, 便于 Host 统一利用这个地址向 USB 设备进行配置。 显
然对于 USB 集线器,即使同时插入几个设备, Host 也只能一次对一个设备进行配置。 USB
设备只有配置( configured )后,才可使用。
USB 的传输类型有四种:
控制传输( control transfer ),通常只用于在设备复位后 Host 通过端点 0 进行配置。
块传输 (Bulk Transfer) ,譬如 U 盘的大量数据传输即用此方式。
中断传输 (Interrupt Transfer) ,一般用于人机设备如 USB 鼠标键盘等。
等时传输 (Isochronous Transfer) ,可以进行带宽控制的实时传输形式。
2.4.1重新认识枚举过程
枚举过程事实上是 USB 设备复位后,恢复到 0 地址 0 号端点,然后主机通过一系列控
制传输命令对 USB 设备进行配置,同时也获取一些信息。
使用 BUS hound 这个工具可以把完整的 USB 设备枚举过程抓下来。网上很容易找到安
装包。 BUS 软件的设置如下:可以确保抓下所有的数据包信息。
剩余46页未读,继续阅读
资源评论
dtd13961139571
- 粉丝: 1
- 资源: 6万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功