在单片机上实现USB移动存储.docx
- 文档编号:18544385
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:19
- 大小:100.51KB
在单片机上实现USB移动存储.docx
《在单片机上实现USB移动存储.docx》由会员分享,可在线阅读,更多相关《在单片机上实现USB移动存储.docx(19页珍藏版)》请在冰点文库上搜索。
在单片机上实现USB移动存储
在单片机上实现US屜动存储
在单片机上实现USB移动存储
第1章主要硬件芯片介绍
1.1系统总体设计
USB主机系统设计是一个软、硬件结合的整体,宏观上主要包括三个层次的设计:
USB总线物理层接口设计、USB
核心系统设计和USB客户系统设计。
总线接口主要处理主机与设备之间的电气及协议层的互连,是信息包进出的物理桥
梁;USB核心系统主要管理和协调主机与从机间的逻辑数据传输,解析双方联系的握手协议,是验证信息包的逻辑关卡;
客户系统是最终用户直接和USB设备功能交互的逻辑平台,
不同的USB设备归属于不同的类,是利用相关的类协议来实现的,所以客户系统驱动程序具有多变性,需要为专门的类定制专门的驱动程序。
在单片机上实现USB移动存储功能,具体包括USB主机接口的硬件设计和整机USB驱动固件的设计。
其中驱动固件的设计具体又包含几个协议的实现:
USB1.1控制传输协议、
USBBULK专输协议、USB海量存储类协议、UFI磁盘操作命令和FAT文件系统标准等。
1.2硬件设计
1.2.1USB主控制器
USB主控制器主要是完成底层物理接口设计,是
USB系统架构的必要部分,是USB数据包进出的必经通道。
本系统采用的USB主机芯片是Cypress公司的SL811HSCypress公司是最早从事USB芯片开发的公司之一,其EZ-USB系列芯片在业界有非常好的口碑。
SL811HS是当经第一个支
持USB主从机的接口芯片,性能稳定,资料全面。
(1)芯片特性
SL811HS是自动兼容USB全速或者低速的嵌入式USB主从机的接口芯片,它支持微处理器、微控制器或者DSP的USB接口设计,同时也可以直接连到ISA、PCMICA等其它总线[8],芯片使用标准的USB1.1协议。
SL811HS通过内部集成的全/低速传输引擎产生USB串行接口功能,在全速时带宽为12Mbps,低速时为1.5Mb
ps。
芯片支持8位并行数据端口或者I/O口的设计,同时也支持DMA自动中断检测连接口,可以非常容易地在MCS-51系列微处理器、摩托罗拉微控制器或者其它控制芯片上完成设计。
总的来说具有如下特性:
1.可在软件控制下,单一地实现主机或者从机功能,28
脚PLCC48脚TQFP封装
2•低速1.5Mbps,高速12Mbps,主从模式下都一样。
3.自动检测连接设备是否为高速或者低速。
4.支持8位双向并口传输,或者I/O口,DMA传输。
5.片上集成SIE和USB传输器。
6.片上集成了一个USB根集线器。
7.256字节内部SRAM支持乒乓传输。
8.工作频率在12M或者48M,3.3伏供电,最高5伏耐压接口。
9.支持总线挂起、唤醒和掉电模式。
10.自动产生SOF和循环冗余校验,自动地址增长模式,保存读写周期。
SL811HS内部电路结构见图1.1
很
集—►
线
器
主以控制廉
串行接口引擎
Ram缓祐
处
理
器
接
口
41WR
11CStiRST57
(2)相关寄存器介绍
USB系统驱动的编程,实质上就是对SL811HS的寄存
器和一些缓存区的读写,SL811HS内部一共有256个字节的缓存,高端240个字节作为通用内存,可以随意访问,低端16个字节是特殊功能寄存器,USB的一些规范就融合在里面SL811HS有A、B两套并行的寄存器,功能和使用完全一样,见表1.1。
表1.1SL811HS功能寄存器
地址
简称
描述
OXC0
EPOControle
USB-Ahost端点寄存器
0X01
EPOAddress
USB-Ahost地址寄存器
0x02
EPOXferLen
USB-Ahost包长度
0x03
EPCGtatus
USB-Ahost设备端点写/USB状态读
0x04
EPOCaunter
USB-Ahost设备地址写
CX05
CtrR^g
芯片模式寄存器
0x06
IntEna
中断使能寄存器
0X07
「一
保解
0x08
EPlContral
USB-Bhost端点寄存器
0x09
EPlAddress
USB-Bhost地址寄存器
OxOA
EPlXferlen
USB-Bhost包长度
OXOB
EPlStatus
USB-Bhost设备端点写/US日状态读
OXCC
EPIOqunter
USB-Bhost设备地址写
OXDD
IntStatus
状怂寄存器
OXOE
SOFLOW
SOF计数器LOW1
OXCF
SOFHIGH
SOF计数器HIGH
0X10-0XFF
Memory
缓存区
(3)接口电路
SL811HS既可以作为嵌入式的主机又可以作为设备,灵活性非常大。
它可以直接连到处理器或者按内存映射的方式接到ARM处理器上。
硬件设计时候主要注意几个关键引脚的处理:
1.nCS低电平有效,使能SL811HS接口和读写寄存器与
内存。
必须使nCS在一个传输周期中至少要保持65纳
秒以上才能进行有效的通信。
2.nWR低电平有效,要使数据有效nWF也至少需要持续
65个纳秒以上。
一但nWR为低时,总线上的信息至少要保持5个纳秒。
3.nRD低电平有效,读取数据之前,必须先写入地址,n
RD的最小周期是65个纳秒。
一但nRD为低时,总线上的信息至少要保持5个纳秒。
4.A0:
低电平时代表地址,高电平时代表数据。
A0至少
要保持10个纳秒以上才能保证数据正确写入。
5.INTRQ高电平有效,当传输事务完成,或者有外部设备接入时,就会触发中断。
通过写入中断寄存器可以清除中断。
6.nRest:
低电平有效,SL811HS上电后需要复位。
常见8位嵌入式处理器和SL811HS的连接见图1.2。
SL811H
S读时序见图1.3,写时序见图1.4。
8位处理器
SLSUHS
D[7:
0]
——►
D[7:
0]
A[15:
0]
AQ^-
——►
A0
—AU-
——►
nCS
nWR
——►
nWR
nRD
nRD
1MT1
U-<
厂
INTRQ
P1.0
——>
nRest
►
other
A0_
ADOft
mta淫noo日
图1.2SL811HS连接&位处理器
图1-3SL811HS读时序
i>WH
nRO
AO
/
ADD»
图1.4SL811HS写时序
122微处理器
本设计的主要目的是在普通单片机下能够使用USB
移动存储,同时通过该系统的串口能够完成让外部的嵌入式设备也能使用USB移动存储。
主机处理器芯片选用兼容MCS
-51指令的AT89C52并外扩一个32K的RAM系统的功能设
计见图1.5
图1.5系统功能设计
AT89C52控制器主要是通过SL811HS对USB移动存储
进行操作,外部控制按钮(小键盘)输入不同的值可以实现不同的功能,比如写文件、读文件、建立目录或删除文件等。
RS232接口,主要是留给外部系统使用,其它的嵌入式系统只要接上该系统的串口,按照一定的命令格式就可以通过串
口使用USB移动存储。
根据SL811HS容错报告所知,SL811H
S的内部锁相环非常敏感,易受高频噪声干扰,从而导致时钟抖动,进而会使SOF不准确(标准周期为1毫秒)。
解决这个问题有两种措施:
1.尽量使用有源的48M晶体
2.备选方案是使用无源48M晶振,同时在SL811HS的VDD
脚加上适当的滤波电容,并注意PCB的布线
1.3固件程序设计
USB主机系统固件的编写比较繁琐,主要涉及到USB
控制传输、USB批量传输、海量存储类协议、UFI磁盘操作
命令和FAT文件系统的编写,全部都是最底层的程序操作,没有现成的类库支持,故程序整体框架的搭建和具体协议的
数据结构的组织是非常关键的。
基于以上因素,构建了系统的总体逻辑设计,见图1.6。
这些协议或者命令层层相扣,每一层开发的优劣不
仅直接影响功能的实现,更会直接影响数据传输的稳定性和速度。
该系统设计的主要难点在于软件程序的编写,由于牵涉的协议多,在编写程序时要重视模块化的思想,每一个具体的协议尽量都编写在一个源文件里,数据结构和常量、变量最好定义在每个模块的头文件中。
在调试USB底层的控制
传输时,可以充分利用BusHound工具抓取USB移动存储刚插入计算机时与计算机通信的数据来分析、对比和参考开发,加深对USB整个底层信息交互的理解。
1.3.1USB总线枚举协议的实现
任何USB设备连上USB主机后,都必须经过USB主机的枚举配置后才能正确使用。
USB总线枚举的步骤和方法,
对于所有USB设备来说都是一样的,必须遵守标准的USB协议过程,通过控制传输的“一问一答”来实现主机和从机必要的几个数据交流:
获取设备描述符、分配设备地址和配置设备。
控制传输的核心是SETUP包,其结构见表1.2。
表1.2SETUP包结构
偏移壘
0
1
2
4
u
命令
bnRequestType
bRequest
uiValue
wlndex
wLength
大小(字节)
1
1
2
2
2
1.bmRequestType:
共一个字节,每一位代表一定的意义。
第7位D7代表数据传输方向:
D7=“0”,代表主机到
设备(OUT,D7=“1”,代表设备到主机(IN);D6
和D5表示命令类型:
D6D5“00”表示标准请求,D6D
5=“01”表示类请求,D6D5“10”表示用户定义的请求,D6D5“11”保留值;D4-D0表示命令的接受者类型:
D4D3D2D1D0=00000”表示接受者为设备,D4D3D
2D1D0=“00001”表示接受者为接口,D4D3D2D1D0=00011”表示为其它接受者,D4D3D2D1D0的其它值保留。
2.bRequest:
请求命令代码,在标准的请求命令中USB为
每一个命令编了一个代号,见表3.3。
3.wValue:
共2个字节,用户自定义。
4.wlndex:
共2个字节,用户自定义。
总线枚举的所有命令都是通过SETUP包发送出去的,
在SL811HS中就是通过启动DATA0把命令包发送出去。
如果命令要求有数据传输,那么SETUP包后接着还有IN包或者OUT包可选数据发送,此时由于前面SETUP包已经启动了DATA0,这里就必须开启DATA1如果数据大于端点的最大数据载荷,那么就用DATA1/DATA(的方式交替来发送。
主机和设备在接收到USB包时,首先就要根据包标识域(PID)进行
解码,进而区分出是什么包。
USB空制传输主要是SETUP包,同时还有相应的IN包或OUT包;在控制传输完成之后接着是批量传输(BULK,这就是纯粹的IN包或OUT包的传输了。
这些包在主机固件里具体如何区分、实现呢?
根据表2.
1可以知道检验PID的值可以区分出SETUPIN和OUT包。
那么IN和OUT包到底是控制传输中的呢?
还是批量传输中的呢?
此时要明白,控制传输是所有USB主机或者设备开发中的必要传输,并且只能由默认端点0来完成,所以可以在
固件中判断当前信息交互的端点号就可以区分出IN和OUT
包到底归属于哪一种传输。
如果是批量传输中的IN包或者OUT包,那么可以直接启动DATA0/DATA侏发送数据。
USB枚举程序底层数据包传输设计结构见图1.7。
图1.7数据包发送的乒乓设计
形象点讲USB主机枚举的过程就是:
首先获取设备属性,设备会返回18个数值(值中对固件有用的是最大包端点长度),然后为设备分配一个操作地址,地址范围可以根据实际情况而定,并且配置设备,最后列举设备端点,获取设备的每一个端点号(地址)。
枚举的实质目的就是想获取设备的端点地址,靠它来完成数据包的收发。
获取设备属性、分配地址等枚举请求命令都有标准说明(见表1.3)
表3.3标准瑪求命令
请求命令
编号
GETSWUS
o
CLEARFEATURE
1
SETFEATURE
2
SETADDRESS
3
GET一DESCRIPTOR
5
SETDESCRIPTOR
6
GETOOWRCURATION
7
SETCONFIGURATIOhf
8
GETJNTEREACE
9
SETJNTERFACE
10
SL811HS芯片必须初始化、复位后才能对设备进行枚举操作,实践表明对SL811HS寄存器初始化的顺序和延迟时间非常关键,会影响到整个系统的稳定性和速度。
经测试比较好的初始代码如下:
voidS811lnit(void)
{
SL811Write(cDATASet,0xe0);//
设定SOF计数器低
8位
式
SL811Write(cSOFcnt,Oxae);
//设定主机工作模
SL811Write(CtrlReg,0x5);
//开SOF
Delay(150);
//延
时
SL811Write(EP0Counter,0);
//写中断寄存器
SL811Write(lntEna,0x20);
中断
}
132USB批量传输和海量存储类协议的实现
USB主机系统实现目的是使用USB移动存储,涉及到大
量文件数据的传输,所以应该选择USB批量传输(BULK。
批量传输用BULK端点进行命令、数据和状态的传输[4],其
流程结构见图1.8。
CBW1命令块封装包,CSW1命令状态封状包,都是一系列包的集合。
图1角命令、数据和状态流程图
(1)CBW
CBW勺长度为31字节,包含了海量存储类协议的磁盘操作命令,其结构见图1.9。
7&5
3210
0-3
dCBWSignature
4-7
dCBWTag
8-11
dCBWDataTrarrsferLength
12
bmCBWFIags
13
Reserved(0|
bCBWLUN
14
Reserved⑼
bCBWCBLength
15-30
CBWCB
图1ECBW的结构
dCBWSignature:
是CBW勺标志,固定值为0x43425355,所有
CBW勺值在USB总线上传输的时候都是按照LSB顺发送的,
即最先发送低位,然后发送高位。
1.dCBWTag由主机产生的并发送给设备,设备会将此值填
入CSW勺dCSWTag以此返回给主机。
2.dCBWDataTransferLength:
主机希望在批量端点上传输数据的大小。
3.bmCBWFlag一个字节的位图,D7=“0”时表示主机输出
数据,反之主机接受数据,D6没有用到,D5-D0保留位。
4.bCBWLUf接受命令的设备逻辑单元号。
5.bCBWCBLength表示了CBWC的长度,也就是磁盘操作命令的长度。
6.CBWCB填入磁盘操作命令。
CBW是以二进制位发送的,每个包必须是精确的31个字节,
不满足的要补0。
⑵CSW
CSW的长度为13字节,其结构见图1.10
才’
6
5
4
a
2
1
0
03
dCSWSignature
4-7
dCSWTag
8-11
dCSWDatsTransferLength
12
bCSWStatus
图1.10CSW0?
结构
1.dCSWSignature:
是CSW勺标志,固定值为0x53425355,
CSW勺值也都是按LSB顺序发送。
2.dCSWTag命令状态标签,该值与CBW中的dCBWTa值相同。
3.dCSWDataResidue:
该字段表示dCBWDataTransferLeng
th字段中主机希望的数据长度与实际发送的数据长度之间的差额。
4.bCSWStatus:
表示命令执行情况,见表1.4
表1.4bCSWStatus的命令执厅情况
bCSWStatus字段值
命令执行惰况
0x00
成功:
0X01
失败
0x02
错误—
0x03和0XD4
保留
0x06—Orff
保留
(3)UFI
UFI是MassStorage类的子类,支持海量存储类的
USB主机应该实现这些子类命令。
UFI子类命令是基于SFF-
80701和SCSI-2的,每个命令块的长度均为12字节,UFI
的各种命令及操作码如表3.5。
对USB移动存储的所有操作
都是经过这些命令来完成的,UFI命令封装于CBV中的CBWC
B块中,靠CBW传输出去,命令结果的状态保存于CSV中,通过读CSW相关结构中的数值,就可以了解命令的最终执行情况。
UFI命令是标准的12字节,命令结构见图1.11o
表1.5UFI命令圧其操作码
命令
说明
操作码
FormatUnit
格式化存储介Jfi
0X04
inquiry
获骯设备信息
0x12
ModeSense
主机谙求设备琴数
0x5a
Read(lO)
读魏据
0x28
ReadCapacity
读介质容量
0x25
ReadFormatCapcity
格式化后的容重
P0x23'
RequestSense
请求判别参数
0X03
Seek
磁头定位于特定磁道
0x2b
SendDiagnostic
诊断和复位
Cxld
TestUnitReady
查词设备是否淮备好
0x00
Write(10!
写数据
0x2a
5
4
0
2
0
0
OperationCode
1
LogicalUnitNumber
Reserved
2
(MSBJ
3
LogicalBlockAddress(ifrequired)
4
5
(LSB)
6
Reserved
7
(MSBJ
3
Trarsferor卩arameterListorAllocationLength(ifrequired)(LSB)
9
Reserved
10
Reserved
11
Reserved
图1.11UFI命令结构
其中操作码与表1.5中每一种命令相对应。
LgicalUnitNumber(LUN,每一个设备上可能有很多个逻辑单元共享着该设备功能特性,设备上的逻辑单元都被连续从0X0
-0XFF进行编号;LogicalBlockAddress(LBA),LBA的值从逻辑块0连续递增到最后一个逻辑块,系统中LBA代表
的就是移动存储介质的绝对扇区。
注意LUN和LBA的字节发
送顺序都是MSB在8位单片机里保持正常顺序即可,CBW
结构定义如下:
typedefstruct_COMMAND_BLOCK_WRAPPER{
DWORDdCBW_Signature;
DWORDdCBW_Tag;
DWORDdCBW_DataXferLen;
BYTEbCBW_Flag;
BYTEbCBW_LUN;BYTEbCBW_CDBLen;
CBWCBCBWCommand;
BYTEResverd[4];
}CBW,*PCBW;
CBWC是具体的磁盘操作命令,大小为12字节,用联合体定义如下:
typedefunion_CBWCB{
READ
fi_Read;
READ_CAPACITY
pacity;
WRITE
i_Write;
INQUIRY
Inquiry;
REQUEST_SENSE
tSense;
TEST_UNIT
stUnit;
}CBWCB,*PCBWCB;
U
Ufi_ReadCa
Uf
Ufi_
Ufi_Reques
Ufi_Te
CSW状态返回值填充在各个字段域里面,定义如下:
typedefstruct_COMMAND_STATUS_WRAPPER{
DWORD
dCSW_Signature;
DWORD
dCSW_Tag;
DWORD
dCSW_DataResidue;
BYTE
bCSW_Status;
}CSW,*PCSW;
为了节约存储空间和提高效率再把CB俯口CSW定义在一个联
合体里面,如下:
typedefunion_Block{
CBW
CbwBlock;
CSW
CswBlock;
}BLOCK,*pBlock;
在程序中定义BLOCKidataBlockCommand,就可以访问C
BW和CSWTo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实现 USB 移动 存储