基于单片机控制的扩展USB接口对U盘的读写Word文档格式.docx

上传人:b****1 文档编号:14232592 上传时间:2022-10-20 格式:DOCX 页数:56 大小:760.41KB
下载 相关 举报
基于单片机控制的扩展USB接口对U盘的读写Word文档格式.docx_第1页
第1页 / 共56页
基于单片机控制的扩展USB接口对U盘的读写Word文档格式.docx_第2页
第2页 / 共56页
基于单片机控制的扩展USB接口对U盘的读写Word文档格式.docx_第3页
第3页 / 共56页
基于单片机控制的扩展USB接口对U盘的读写Word文档格式.docx_第4页
第4页 / 共56页
基于单片机控制的扩展USB接口对U盘的读写Word文档格式.docx_第5页
第5页 / 共56页
点击查看更多>>
下载资源
资源描述

基于单片机控制的扩展USB接口对U盘的读写Word文档格式.docx

《基于单片机控制的扩展USB接口对U盘的读写Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机控制的扩展USB接口对U盘的读写Word文档格式.docx(56页珍藏版)》请在冰豆网上搜索。

基于单片机控制的扩展USB接口对U盘的读写Word文档格式.docx

3.4.2基于SL811的USB底层传输函数实现要点9

3.4.3usbXfer()函数10

3.4.4ep0Xfer()函数20

3.5块传输(Bulk)22

3.6SCSI命令24

3.6.1跟U盘初始化有关的SCSI命令24

3.6.2Read和WriteU盘的命令27

3.7U盘兼容性问题的探讨29

第4章微软的文件系统34

4.1FAT16文件系统简介34

4.1.1保留区34

4.1.2FAT区37

4.1.3根文件夹40

4.1.4数据区40

4.2FAT32文件系统简介40

4.3FAT文件系统的局限性41

第5章编码实例分析42

5.1需求简述42

5.2文件结构42

5.3Main.c42

5.4USB.c43

5.5timer.c44

5.6filesys.c44

5.6.1变量说明44

5.6.2扇区读写函数44

5.6.3询问下一簇号函数45

5.6.4FAT初始化函数(BPB信息分析)45

5.6.5OpenFiles47

5.6.6创建文件50

5.6.7写入文件51

第6章使用CH375的解决方案52

6.1只作简单介绍52

结论53

参考文献54

致谢55

千万不要删除行尾的分节符,此行不会被打印。

在目录上点右键“更新域”,然后“更新整个目录”。

打印前,不要忘记把上面“Abstract”这一行后加一空行

硬件设计

硬件概述

先详细介绍基于Cypress公司的SL811芯片的扩展方案,基于国内南京沁恒电子的CH375芯片的方案最后介绍。

本文尽量介绍关于USB、U盘和文件系统等平台无关的内容,SL811硬件平台方面的内容不可避免要涉及到一点,但尽量控制到最少。

硬件很简单,详见protel文件(省略了无关的部分,比较粗糙,凑合看…)。

主要是扩展一片32K的外部RAM62256作为数据缓冲,同时分配好SL811的地址。

通过51单片机的A15地址线分别连接到外部RAM62256和SL811的片选CS端,来区分两者的地址,可见RAM占据低32K地址空间,而SL811依“写地址”和“读写数据地址”分别占据8000H和8001H两个字节的地址空间。

U盘的逻辑结构

U盘可以看成是以扇区(1扇区=512Bytes)为单位线性排列的实体,即0号扇区,1号扇区,2号扇区,……这样按顺序地排列下去。

U盘是flash,对flash的操作总是以块为单位的,因此单片机对U盘的操作是以扇区为单位,整个扇区地读取,或整个扇区地写入。

USB通信协议

USB设备开工的机理

USB是即插即用的,涵盖海量存储器(如U盘、移动硬盘)、人机交互设备(如鼠标键盘游戏杆)、扫描仪、打印机等等各种各样功能的设备,那么USB主机是如何判断目前接入的设备到底是怎么样的呢?

答案是USB描述符,以及USB的枚举。

USB描述符

这个概念很简单,就是对各种纷繁芜杂的USB外设按功能划分大类(class),大类下又再细分小类(subclass),每个类别给予一串特定的符号(Descriptor)供主机辨识。

每个USB设备只能有一个DEVICE描述符,它指明了该设备属于哪一大类,是海量存储器类,还是人机交互设备类,还是打印机或者扫描仪类,等等。

每个DEVICE下可以有1个或多个配置描述符(configuration),以说明该设备含有哪些功能。

如一个USB接口的CDROM可以同时具有读写光盘的功能和播放CD的功能。

有几个功能,就有几个配置描述符。

每种配置对应若干个接口描述符(Interface),以描述该配置使用哪些接口与主机进行通信。

每个Interface又都是端点(EndPoint)的集合,端点就是设备与USB主机交换数据的最原子单位了。

每个Interface用到的端点可以是一个或多个。

下图摘自USBMASSSTORAGECBITransportSpecification第6页,清楚说明各种描述符的组织情况。

USB设备的枚举过程(开工过程)

有了完善的分类后,USB设备上电即可通过枚举过程告诉USB主机自己的详细信息,这很类似一个一问一答的过程,如下:

主机(下称H):

你是甚么设备?

设备(下称D):

我是12010100……(这就是DEVICE描述符了)

H:

你有几种功能?

D:

我有090209……(配置描述符)

每种功能有几个接口?

090400……(接口描述符)

每个接口用到哪些端点?

070581……(端点描述符)

好了,我知道你是谁了,开始传数据吧!

OK.READYGO!

具体而言,USB枚举过程有以下步骤:

(1)集线器检测新设备

主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。

(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。

当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。

(2)主机知道了新设备连接后

每个集线器用中断传输来报告在集线器上的事件。

当主机知道了这个事件,它给集线器发送一个Get_Status请求来了解更多的消息。

返回的消息告诉主机一个设备是什么时候连接的。

(3)集线器重新设置这个新设备

当主机知道有一个新的设备时,主机给集线器发送一个Set_Feature请求,请求集线器来重新设置端口。

集线器使得设备的USB数据线处于重启(RESET)状态至少10ms。

(4)集线器在设备和主机之间建立一个信号通路

主机发送一个Get_Status请求来验证设备是否激起重启状态。

返回的数据有一位表示设备仍然处于重启状态。

当集线器释放了重启状态,设备就处于默认状态了,即设备已经准备好通过Endpoint0的默认流程响应控制传输。

即设备现在使用默认地址0x0与主机通信。

(5)集线器检测设备速度

集线器通过测定那根信号线(D+或D-)在空闲时有更高的电压来检测设备是低速设备还是全速设备。

(全速和高速设备D+有上拉电阻,低速设备D-有上拉电阻)。

以下,需要USB的firmware进行干预

(6)获取最大数据包长度

PC向address0发送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。

(5)单片机向新地址2重新发送Get_Device_Descriptor命令,此次读取U盘设备描述符的全部字段,以了解该设备的总体信息,如VID,PID。

(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协议一些更细节的内容,请往下看。

否则可以直接跳到第四章的文件系统部分。

USB1.1协议

本节内容主要涵盖USB1.1Specification的第4、5、8、9章。

并且主要描述代码中无法注释或者在代码中注释会太麻烦的内容。

USB是一种主从的结构。

所有传输由Host来发起。

当主机发起一次传输时,这次传输的包(Packets)通常包括三个阶段。

主机首先是发送一个TokenPacket,内里包含本次传输的命令类型(type)、方向(direction)、设备的地址(deviceaddress)以及端点号(Endpoint)。

紧接着是数据包(datapacket),就是包含数据了。

最后将由device返回握手信号包(handshakepacket),表示是正确收到了(ACK)还是其他的失败原因。

三个包如下图所示。

USB的传输模型:

Host和设备的某个端点之间可以看成有

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 法学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1