学习笔记基于LMS的USB程序开发笔记第一部分.doc
- 文档编号:4904868
- 上传时间:2023-05-07
- 格式:DOC
- 页数:20
- 大小:468KB
学习笔记基于LMS的USB程序开发笔记第一部分.doc
《学习笔记基于LMS的USB程序开发笔记第一部分.doc》由会员分享,可在线阅读,更多相关《学习笔记基于LMS的USB程序开发笔记第一部分.doc(20页珍藏版)》请在冰点文库上搜索。
USB开发指南之基于LM3Sxxx的USB程序开发笔记
基于LM3Sxxx的USB开发笔记
-Triton.zhang
2011-08-30
【摘要】
TI收购LM后继承了LM一系列的cortex-M3的产品,从而弥补了了TI在MCU市场一个空白。
从产品规划来讲,LM的产品还是不错的,特别是带CAN、USB、和集成MAC+PHY的ETH接口,这些外设为开发者提供了一个更方便的连接器解决方案。
本文就通过LM3SXXX的USB应用笔记给大家介绍一个完整的USB系统是如何开发出来的。
LM3Sxxx的几大系列中,其中F3xxx,F5xxx和最新的F9xxx系列都带有USB接口,有的是只支持Device,有的支持HOST+Device,部分芯片支持OTG功能,具体要看数据手册,本文的所有试验都基于TI最新的功能最全的LM3S9B96的评估板。
如果想更详细了解USB应用的朋友可以参看TI的相关文档和USB的协议。
本文中的所有程序都是本人编写,请配合该程序进行学习。
本文提及到的参考资料,请参见后面的参考资料列表,如果是刚刚接触USB,或者LM3Sxxx的同学可以先下载这些资料。
本开发笔记分为三大章节,第一章介绍USB的基础知识,如果对USB协议已经熟悉的同学,可以跳过本章。
第二章介绍如何在LM3SXXX芯片上开发USB程序,第三章介绍如何在PC上开发USB的驱动程序。
希望通过本笔记的学习,能够帮助大家尽快的学会如何进行USB的设计开发。
目录
基于LM3Sxxx的USB开发笔记 1
目录 2
第一章USB开发的必备知识 3
USB系统介绍 3
USB的连接模型 3
USB的拓扑结构 4
USB的电气特性 6
USB总线协议 6
USB数据流分类 7
USB的带宽 7
USB设备的插入检测机制 7
USB的识别过程 8
USB的请求命令 8
USB的描述符 10
USB设备的枚举过程 18
第一章USB开发的必备知识
USB系统介绍
USB是通用串行总线(UniversalSerialBus)的简写。
USB协议先后经历过USB1.0,USB1.1,USB2.0和USB3.0。
由于目前市面上的MCU大多只支持USB2.0,所以本文主要介绍USB2.0的特性。
USB是主从模式的总线结构,设备与设备之间,主机与主机之间是不能互连的,为了解决这个问题,扩大USB的使用范围,在USB2.0之后,出现了USBOTG(onthego)。
USBOTG的做法是同一个设备,在不同的应用场合下可以在主机和从机之间自由切换。
在USB1.0和USB1.1版本中,只支持1.5Mbps的低速模式(lowspeed)和12Mbps的全速模式(Fullspeed)。
在USB2.0中,又加入了480M的高速模式(Highspeed)。
USB的连接模型
USB是一种主从结构的总线,主机叫做host,从机叫做device(也就是我们平时讲的设备)。
一个完整的USB系统主要由三个部分组成:
uUSB的连接器
USB的连接是指USB设备与主机之间进行连接和通信的操作,主要包括以下几个方面:
-总线的拓扑结构:
USB设备与主机之间的各种连接方式
-内部层次关系:
根据性能叠置,USB的任务被分配到系统的每一个层次
-数据流模式:
描述了数据在提供中通过USB从发起端到接收端的流动方式
-USB的调度:
USB提供了一个共享的连接,对可疑使用的连接进行调度以支持同步数据传输
uUSB的主机
在任何USB系统中,只有一个USB的主机,USB和主机系统的接口叫做主机控制器。
主机控制器由硬件,固件和软件综合实现。
uUSB的设备
USB的设备包含两大类:
-网络集线设备:
为USB系统提供更多的连接点
-功能设备:
为USB系统提供具体功能
USB的数据交换只能发生在主机和从机之间,主机和主机,从机和从机之间是不能进行数据交换的。
为了再物理上区分主机和从机,使用不同的插头和插座,这样我们就能轻松的通过连接线来判断出USB系统中,谁处于主机模式,谁处于从机模式。
最早的USB标准中,USB接头只有4根线,USB2.0之后,定义了MiniUSB接口,增加了一个ID线,主要用在OTG的设备上用来标识本设备ID。
标准的USB接口有A型和B型,每一个类型又分为插头和插座。
如下图所示:
USB系统中,所有的数据传输都是由主机主动发起的,从机值是被动地负责应答。
在USBOTG应用中,一个设备可以在从机和主机之间切换,从而实现了设备间的连接,大大地增加了USB的使用范围。
但即使OTG的应用也还是属于主从模式,两个设备之间一个作为主机,一个作为从机。
USB的拓扑结构
USB的拓扑结构为金字塔型。
USB系统由一个USB主控制器出发,下面接USB的集线器,USB集线器将一个USB接口扩展为多个USB接口,多个USB接口又可通过集线器扩展更多的接口。
USB协议中对集线器的层数有限制,USB1.1规定USB的集线器层数最多是4层,USB2.0规定最多为6层。
图1.USB的拓扑结构
USB主控制器通过7位地址对挂接在总线上的设备进行寻址,理论上一个主控制器上最多可以接128个设备,但实际应用中接不了这么多。
在PC机上,一般有一个(或多个)USB集线器,它叫根集线器,直接连接在USB的主控制器上。
打开电脑的设备管理器,我们可以看到USB的主控制器和根集线器。
如下图所示:
图2.PC机上的USB控制器和集线器
USB的电气特性
标准的USB使用4根线:
5V电源线(Vbus),差分数据线负(D-),差分数据线正(D+),地(Gnd)。
在USBOTG中,又增加了一种mini接口,使用的是5根线,比标准的USB多了一根身份识别(ID)线。
如下图所示:
USB使用的是差分传输模式,有两根数据先,分别是D-和D+。
在USB低速和全速模式中,采用的是电压传输模式,在高速模式下,则是电流传输模式。
为了避免长时间出现全0或全1的信号,在发送数据前,要经过位填充处理。
然后将数据串行化,发送到数据总线上,由两根数据线的差分值来表示0和1。
在接收端恰恰相反,接收端采样数据总线,将数据并行话,然后去白化处理(即去掉填充位),在解析数据。
在USB协议中规定,设备可以通过USB总线供电,在未配置之前,设备可以从VBUS上获取100mA的电流,配置之后,最多可以从VBUS上获取500mA的电流。
关于USB的的电气特性有如下几点需要注意:
-电缆中包括VBUS、GND二条线,向设备提供电源;
-VBUS使用+5V电源。
USB对电缆长度要求很宽,最长可为几米;
-为了保证足够的输入电压和终端阻抗,重要的终端设备应位于电缆的尾部;
-低速模式需要更少的EMI保护;
-两种模式可在用同一USB总线传输的情况下自动地动态切换。
-过多的低速模式的使用将降低总线的利用率;
USB总线协议
USB总线属于轮询方式的总线,始终由主机控制端口初始化所有的数据传输。
每一个USB总线执行动作最多传送三个数据包。
按照传输前制定好的原则,在每次传送开始时,主机控制器发送一个描述传输操作的种类、方向,USB设备地址和终端号的USB数据包,这个数据包通常称为标志包(tokenpacket)。
USB设备从数据包中取出属于自己的数据。
数据传输方向不是从主机到设备就是从设备到主机。
在传输开始时,由标志包来标识数据的传输方向,然后发送端开始发送包含信息的数据包或表明没有数据传送。
接收端也要相应发送一个握手的数据包表明是否传送成功。
发送端和接收端之间的USB数据传输,在主机和设备的端口之间可视为一个管道(PIPE)。
USB存在两种类型的管道:
-数据流管道
数据流管道的数据没有USB协议规定的结构。
管道与数据宽、传输服务类型、端口特性(如缓冲区大小)有关。
数据流管道在USB设备初始化设置完成就存在了。
-消息管道:
消息通道是USB协议中特殊的一个管道,也成为控制管道。
设备上电启动后,该管道就存在,为设备的设置、查询状态和输入控制信息提供了一个入口。
USB数据流分类
在USB主机和设备通道之间的数据传输,我们叫做数据流,USB的结构包含四个基本的数据流传输类型:
-控制数据传送
在设备连接时用来对设备进行设置,还可对指定设备进行控制,如通道控制;
-批量数据传送
大批量产生并使用的数据,在传输约束下,具有很广的动态范围;通常用在打印机和扫描仪等有大量数据需求的传输。
-中断数据的传送
用来描述或匹配人的感觉或对特征反应的回馈;中断数据传输是针对少量数据的传输需求,数据延迟时间也是有限范围内的。
-同步数据的传送
由预先确定的传送延迟来填满预定的USB带宽;同步数据的建立、传输和使用时时连续且实时的,同步数据时以稳定的速率发送和接收实时信息,同步数据要使接受者与发送者保持相同的时间安排,出了传输速率,同步数据对延迟非常敏感。
对于任何指定的USB设备而言,一个通道只能支持上述一种方式的数据流传输。
USB的带宽
USB的带宽分配给各个通道,当一个通道建立后,USB主机就分配给它一定的带宽,USB设备需要提供一些数据缓冲区,若USB提供了更多的带宽,则需要更多的缓冲区。
USB的体系要保证缓冲引导的硬件的延迟限定在几毫秒内。
USB设备的插入检测机制
当USB设备插上主机时,主机是如何检测到设备插入的呢?
首先,在每个USB的集线器下游端口D+和D-上,分别接了一个15K欧姆的下拉电阻到地。
当集线器的端口悬空时,D+和D-被这两个下拉电阻拉到地,同为低电平。
在低速USB的设备上,DD-被接上1.5K欧姆的上拉电阻,在全速和高速USB设备上,D+被接上一个1.5K欧姆的上拉电阻。
当设备插入集线器是,由于1.5k欧姆的上拉和下拉电阻分压,就将D+或D-其中的一条线拉高了。
集线器检测到这个状态后,就上报USB主控制器,检测到设备的插入。
通过对D+,D-电平的识别可以判断出是低速设备还是高速或全速的设备。
高速和全速的设备需要主机和从机进一步数据交换后才能确定。
USB的识别过程
当USB主机检测到USB设备插入后,主机就通过一系列的动作来对设备进行枚举配置(配置是属于枚举的一个态,态表示暂时的状态),这些态如下:
-接入态(Attached)
设备接入主机后,主机通过检测信号线上的电平变化来发现设备的接入;
-供电态(Powered)
就是给设备供电,分为设备接入时的默认供电值,配置阶段后的供电值(按数据中要求的最大值,可通过编程设置)
-缺省态(Default)
USB在被配置之前,通过缺省地址0与主机进行通信
-地址态(Address)
经过了配置,USB设备被复位后,就可以按主机分配给它的唯一地址来与主机通信,这种状态就是地址态;
-配置态(Configured)
通过各种标准的USB请求命令来获取设备的各种信息,并对设备的某此信息进行改变或设置。
-挂起态(Suspended)
总线供电设备在3ms内没有总线操作,即USB总线处于空闲状态的话,该设备就要自动进入挂起状态,在进入挂起状态后,总的电流功耗不超过280UA。
USB的请求命令
控制传输过程中,初始化设置USB的设备时会涉及到USB的请求命令。
标准的USB设备请求命令总共有11个,每个命令由8个字节(5个字段)组成,具有相同的数据结构。
数据结构如下图所示:
表1、USB命令的结构
偏移量
域
长度(半字)
值
描述
0
bmRequestType
1
位图
请求特征:
D7:
传输方向
0=主机至设备
1=设备至主机
D6..5:
种类
0=标准
1=类
2=厂商
3=保留
D4..0:
接收者
0=设备
1=接口
2=端点
3=其他
4..31保留
1
bRequest
1
值
命令类型编码值(见表3)
2
wValue
2
值
根据不同的命令,含义也不同
4
wIndex
2
索引或偏移
根据不同的命令,含义也不同,主要用于传送索引或偏移
6
wLength
2
如有数据传送阶段,此为数据字节数
下表列出了USB的11种标准命令
表2、USB的11种标准命令
命令
bmRequestType
bRequest
wVaule
wIndex
wLength
Data
Clear_Feature
00000000B
00000001B
00000010B
CLEAR_FEATURE
特性选择符
零
接口号
端点号
零
无
Get_Configuration
10000000B
GET_CONFIGURATION
零
零
-
配置值
Get_Descriptor
10000000B
GET_DESCRIPTOR
描述表种类(高字节,见表5)和索引(低字节)
零或语言标志
描述表长
描述表
Get_Interface
10000001B
GET_INTERFACE
零
接口号
-
可选设置
Get_Status
10000000B
10000001B
10000010B
GET_STATUS
零
零(返回设备状态)
接口号(对像是接口时)
端点号(对象是端点时)
二
设备,
接口,或端点状态
Set_Address
00000000B
SET_ADDRESS
设备地址
零
零
无
Set_Configuration
00000000B
SET_CONFIGURATION
配置值(高字节为0,低字节表示要设置的配置值)
零
零
无
Set_Descriptor
00000000B
SET_DESCRIPTOR
描述表种类(高字节,见表5)和索引(低字节)
零或语言标志
描述表长
描述表
Set_Feature
00000000B
00000001B
00000010B
SET_FEATURE
特性选择符(1表示设备,0表示端点)
零,
接口号,
端点号
零
无
Set_Interface
00000001B
SET_INTERFACE
可选设置
接口号
零
无
Synch_Frame
10000010B
SYNCH_FRAM
零
端点号
二
帧号
其中bRequest为命令编码值,含义见表3:
表3、USB标准命令的编码值
bRequest
Value
GET_STATUS
0
CLEAR_FEATURE
1
RESERVED
2
SET_FEATURE
3
RESERVED
4
SET_ADDRESS
5
GET_DESCRIPTOR
6
SET_DESCRIPTOR
7
GET_CONFIGURATION
8
SET_CONFIGURATION
9
GET_INTERFACE
10
SET_INTERFACE
11
SYNCH_FRAME
12
这里就不详细介绍这11个命令了,如果有感兴趣的同学请自己去看USB2.0的协议。
控制传输是USB的重点,而控制传输就是依靠这11个命令来完成的,所以这11个命令搞明白了,USB就算是入门了。
USB的描述符
USB协议为USB设备定义了一套描述设备功能和属性的有固定结构的描述符,包括标准的描述符即设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符,还有百标准描述符,如类描述符。
USB设备通过这些描述符向USB主机汇报设备的各种各样属性,主机通过对这些描述符的访问对设备进行类型识别、配置并为其提供相应的客户端驱动程序。
USB设备通过描述符反映自己的设备特性。
USB描述符是由特定格式排列的一组数据结构组成。
在USB设备枚举过程中,主机端的协义软件需要解析从USB设备读取的所有描述符信息。
在USB主向设备发送读取描述符的请求后,USB设备将所有的描述符以连续的数据流方式传输给USB主机。
主机从第一个读到的字符开始,根据双方规定好的数据格式,顺序地解析读到的数据流。
USB描述符包含标准描述符、类描述符和厂商特定描述3种形式。
任何一种设备必须USB标准描述符(队字符串描述符可选外)。
在USB1.X中,规定了5种标准描述符:
设备描述符(DeviceDescriptor)、配置描述符(ConfigurationDescriptor)、接口描述符(InterfaceDescriptor)、端点描述符(EndpointDescriptor)和字符串描述符(StringDescriptor)。
每个USB设备只有一个设备描述符,而一个设备中可包含一个或多个配置描述符,即USB设备可以有多种配置。
设备的每一个配置中又可以包含一个或多个接口描述符,即USB设备可以支持多种功能(接口),接口的特性通过描述符提供。
在USB主机访问USB设备的描述符时,USB设备依照设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符顺序将所有描述符传给主机。
一设备至少要包含设备描述符、配置描述符和接口描述符,如果USB设备没有端点描述符,则它仅仅用默认管道与主机进行数据传输。
u设备描述符
设备描述符给出了USB设备的一般信息,包括对设备及在设备配置中起全程作用的信息,包括制造商标识号ID、产品序列号、所属设备类号、默认端点的最大包长度和配置描述符的个数等。
一个USB设备必须有且仅有一个设备描述符。
设备描述符是设备连接到总线上时USB主机所读取的第一个描述符,它包含了14个字段,结构如下:
表4、USB设备描述符的结构
偏移量
域
大小
值
描述
0
bLength
1
数字
此描述表的字节数
1
bDescriptorType
1
常量
描述符的类型(此处应为0x01,即设备描述符)
2
BcdUSB
2
BCD码
此设备与描述表兼容的USB设备说明版本号(BCD码)
4
bDeviceClass
1
类
设备类码:
如果此域的值为0则一个设置下每个接口指出它自己的类,各个接口各自独立工作。
如果此域的值出于1~FEH之间,则设备在不同的接口上支持不同的类。
并这些接口可能不能独立工作。
此值指出了这些接口集体的类定义。
如果此域设置FFH,则此设备的类由厂商定义。
5
bDeviceSubClass
1
子类
子类挖码
这些码值的具体含义根据bDeviceClass域来看。
如bDeviceClass域为零,此域也须为零
如bDeviceClass域为FFH,此域的所有值保留
6
bDevicePortocol
1
协议
协议码
这些码得值是bDeviDDDDDDDDDDDDDDDDDDDDDDceClass和bDeviceSubClass的值而定。
如果设备支持设备类相关的协议,此码标志了设备类的值。
如果此域的值为零,则此设备不支持设备类相关的协议,然而,肯它的接口支持设备类相关的协议。
如果此域的值为FFH,此设备使用厂商定义的协议。
7
bMaxPacketSize0
1
数字
端点0的最大包大小(仅8,16,32,64为合法值)
8
idVendor
2
ID
厂商标志(由USB-IF组织赋值)
10
idProduct
2
ID
产品标志(由厂商赋值)
12
bcdDevice
2
BCD码
设备发行码(BCD码)
14
iManufacture
1
索引
描述厂商信息的字符串描述的索引值
15
iProduct
1
索引
描述产品信息的字符串描述符的索引值
16
iSerialNumber
1
索引
描述设备序列号信息的字符串描述符的索引值
17
bNumConfigurations
1
数字
可能的配置描述符数目
其中bDescriptorType为描述符的类型,其含义可查下表(此表也适用于标准命令Get_Descriptor中wValue域高字节的取值含义):
表5、USB描述符的类型值
类型
描述符
描述符值
标志描述符
设备描述符(DeviceDescriptor)
0x01
配置描述符(ConfigurationDescriptor)
0x02
字符串描述符(StringDescriptor)
0x03
接口描述符(InterfaceDescriptor)
0x04
端点描述符(EndPortDescriptor)
0x05
类描述符
集线器类描述符(HubDescriptor)
0x29
人机接口类描述符(HID)
0x21
厂商定义的描述符
0Xff
设备类代码bDeviceClass可查下表:
表5、USB设备的类别(bDeviceClass)
值(十进制)
值(十六进制)
说明
0
0x00
接口描述符中提供类的值
2
0x02
通信类
9
0x09
集线器类
220
0xDC
用于诊断用途的设备类
224
0xE0
无线通信设备类
255
0xFF
厂商定义的设备类
设备描述符在程序中的结构体表示如下:
1.struct_DEVICE_DEscriptOR_STRUCT
2.{
3.BYTEbLength; //设备描述符的字节数大小,为0x12
4.BYTEbDescriptorType; //描述符类型编号,为0x01
5.WORDbcdUSB; //USB版本号
6.BYTEbDeviceClass; //USB分配的设备类代码,0x01~0xfe为标准设备类,
7.//0xff为厂商自定义类
8.//0x00不是在设备描述符中定义的,如HID
9.BYTEbDeviceSubClass; //usb分配的子类代码,同上,值由USB规定和分配的
10.BYTEbDeviceProtocl; //USB分配的设备协议代码,同上
11.BYTEbMaxPacketSize0; //端点0的最大包的大小
12.WORDidVendor; //厂商编号
13.WORDidProduct; //产品编号
14.WORDbcdDevice; //设备出厂编号
15.BYTEiManufacturer; //描述厂商字符串的索引
16.BYTEiProduct; //描述产品字符串的索引
17.BYTEiSerialNumber; //描述设备序列号字符串的索引
18.BYTEbNumConfigurat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学习 笔记 基于 LMS USB 程序 开发 第一 部分