主讲:冯坤出品:天祥电子网址:和学单片机一样简单第五讲:USB主从设备USB是什么呢?USB到底是什么呢?学ARM和学单片机一样简单USB是通用串行总线(UniversalSerialBus)的简写,它已经有了10多年的历史了。USB协议出现过的版本有USB1.0,USB1.1,USB2.0。学ARM和学单片机一样简单USB具有很多优点,例如即插即用,容易使用,方便携带,传输速度快,可扩展性强,标准统一,价格便宜等等。目前流行的USB设备有移动硬盘,数码相机,MP3,U盘,USB鼠标、键盘、游戏杆,USBMIDI键盘,USB摄相头,USB打印机,USB扫描仪,USB声卡,USB话筒,USB网卡,USB显示器,USB电话,具有USB口的各种仪表仪器等等,只要是能跟电脑打交道的,就基本上可以通过USB来实现,足见USB功能的强大。当然USB也有一些缺点,例如传输距离短,开发、调试较困难等等。学ARM和学单片机一样简单USB的拓扑模型学ARM和学单片机一样简单它主要包括了USB连接、USBhostcontroller和USBdevice三个部分。而USBdevice还包括了hub和功能设备,也就是上图里的Func学ARM和学单片机一样简单什么是USBcontroller?学ARM和学单片机一样简单那么hub是什么?学ARM和学单片机一样简单而USB连接指的就是连接device和host(或hub)的四线电缆。电缆中包括VBUS(电源线)、GND(地线)还有两根信号线。在USBOTG中,又增加了一种mini接口,使用的是5根线,比标准的USB多了一根身份识别(ID)线。USB系统就是通过VBUS和GND向设备提供电源的。USB设备可以使用主机提供的电源,也可以使用外接电源供电。学ARM和学单片机一样简单USB的电气特性5V电源线(Vbus),差分数据线负(D-),差分数据线正(D+),地(Gnd)。USB使用的是差分传输模式,有两根数据线,分别是D+和D-。学ARM和学单片机一样简单由于USB是主从模式,设备与设备之间、主机与主机之间不能互连,为了解决这个问题,扩大USB的使用范围,就出现了USBOTG(OnTheGo)。USBOTG的做法是,同一个设备,在不同的场合下可以在主机或从机之间切换。在USB1.0和USB1.1版本中,只支持1.5Mbps的低速(LowSpeed)模式和12Mbps的全速(FullSpeed)模式。在USB2.0中,又加入了480Mbps的高速(HighSpeed)模式。学ARM和学单片机一样简单USB通信最基本形式是通过USB设备里一个叫endpoint,而主机和endpoint之间的数据传输是通过pipe。endpoint就是通信的发送或者接收点,你要发送数据,那你只要把数据发送到正确的端点那里就可以了。端点是有方向的,从usb主机到设备称为out端点,从设备到主机称为in端点。学ARM和学单片机一样简单USBendpoint有四种类型,也就分别对应了四种不同的数据传输方式。它们是控制传输(ControlTransfers),中断传输(InterruptDataTransfers),批量传输(BulkDataTransfers),等时传输(IsochronousDataTransfers)。控制传输用来控制对USB设备不同部分的访问,通常用于配置设备,获取设备信息,发送命令到设备,或者获取设备的状态报告。总之就是用来传送控制信息的,每个USB设备都会有一个endpoint0的控制端点。学ARM和学单片机一样简单协议里规定,所有的USB设备必须具有端点0,它可以作为in端点,也可以作为out端点,USB系统软件利用它来实现缺省的控制管道,从而控制设备。端点也是限量供应的,不是想有多少就有多少的,除了端点0,低速设备最多只能拥有2个端点,高速设备也最多只能拥有15个in端点和15个out端点。这些端点在设备内部都有唯一的端点号,这个端点号是在设备设计时就已经指定的。学ARM和学单片机一样简单中断传输用来以一个固定的速率传送少量的数据,USB键盘和USB鼠标使用的就是这种方式,USB的触摸屏也是,传输的数据包含了坐标信息。批量传输用来传输大量的数据,确保没有数据丢失,并不保证在特定的时间内完成。U盘使用的就是批量传输,咱们用它备份数据时需要确保数据不能丢,而且也不能指望它能在一个固定的比较快的时间内拷贝完。等时传输同样用来传输大量的数据,但并不保证数据是否到达,以稳定的速率发送和接收实时的信息,对传送延迟非常敏感。显然是用于音频和视频一类的设备,这类设备期望能够有个比较稳定的数据流,比如你在网上QQ视频聊天,肯定希望每分钟传输的图像/声音速率是比较稳定的,不能说这一分钟对方看到你在向她向你深情表白,可是下一分钟却看见画面停滞在那里,只能看到你那傻样一动不动,你说这不浪费感情嘛。学ARM和学单片机一样简单管道,实际上只是为了让我们能够找到端点,就相当于我们日常说的邮编地址,pipe另一端是usb主机,即前面说的那个host,pipes代表着一种在主机和设备上的端点之间移动数据能力学ARM和学单片机一样简单USB设备的枚举过程系统上电识别USB设备过程:首先是主机对设备的枚举,该过程是USB协议软件自动完成的。当USB连接时,主机将使用缺省控制管道向其发出标准USB设备请求,为识别设备,USB设备部分需要通过编写固件代码或者芯片内部自动实现响应请求功能。主机部分需提供相应设备驱动程序和INF文件。该部分资源芯片厂商会提供实例程序和相应的INF文件,可在此基础上进行修改。详细过程分为以下六步:学ARM和学单片机一样简单把USB设备连接至某集线器的下行端口,集线器马上会提供电源。集线器监视其D-D+线上的电压,当达到一定值时,认为有设备连接。集线器使用中断输入管道向主机报告其USB设备的连接,主机会向集线器发出GetPortStatus请求以了解更多信息。为确保连接的机械特性和电气特性稳定,主机至少要等待100ms,USB设备在接收到任何请求前,其电源已经稳定工作了100ms。主机向集线器发出SetPortStatus请求,以复位这个USB设备。并通过检测USB设备连接在D-D+上的上拉电阻来确定设备的传输速度:低速、全速或高速。为确保USB设备复位操作的完成,主机需提供10ms的复位恢复时间。学ARM和学单片机一样简单自动枚举并配置设备USB总线驱动程序有一个专门的功能:集线器驱动程序,它负责监视集线器下行端口状态的变化,发现USB设备连接后,就会使用非USB主机软件和USB设备驱动程序识别和配置设备。配置分为以下三种:1)设备配置:建立设备的所有USB参数,并为其分配总线资源。该操作通过设置USB设备的配置值完成。2)USB配置:客户软件获取USB设备的管道信息,如传输速率、传输类型等,已与该设备进行正确的数据传输学ARM和学单片机一样简单3)功能配置:从USB的角度来看,在设备配置和USB配置完成后,客户软件就可以和指定的设备通信了,但有些USB设备还需要设备类或供应商的特定设置操作。设备配置过程首先读取USB设备的设备描述符,然后请求每种配置的配置信息,最后USB设备驱动程序会从中选择一个作为当前配置。设备配置之后,配置软件会把USB设备接口信息返回给客户软件,使其拥有一组可进行USB数据传输的管道,USB配置对这些管道进行初始化,如设置服务间隔、最大数据包长度等。之后界面应用程序就可以使用这些管道和USB设备的功能单元进行数据传输了。学ARM和学单片机一样简单主机向设备发出GetDescriptor(Device)请求,以取得缺省管道所支持的最大数据包长度。该长度包含在设备描述符bMaxPacketSize0字段中,其地址偏移量为7,所以这时主机只需要读取该描述符的前8字节。主机向设备发出SetAddress请求,为其分配一个唯一的设备地址。之后它不再使用缺省设备地址,而将使用这个新的地址和主机进行通信,该地址在USB设备断开或系统断电时丢失。主机使用新地址向设备发出GetDescriptor(Device)请求,并读取其设备描述符的全部字段,以了解该设备的总体信息,如供应商ID,产品ID等。学ARM和学单片机一样简单主机向设备循环发出GetDescriptor(Configuration)请求,以取得其全部配置信息(其个数由设备描述符bNumConfiguration字段指出),包括配置描述符、接口描述符、端点描述符以及各种设备类定义描述符和供应商自定义描述符等。学ARM和学单片机一样简单主机根据USB设备的配置信息,如供应商ID,产品ID等,寻找到主机中相应INF文件(标识出设备驱动程序名称和位置的文件)为其选择一个合适的USB设备驱动程序。它通常需要由开发人员自己编写,但有时也可以使用设备类或供应商提供的通用驱动程序。在加载了USB设备驱动程序后,主机将发出SetConfiguration(x)请求为该设备选择一个合适的配置。为USB设备选择一个配置值、一个接口和一个可替换设置值,并确定相应端点特性,如所支持的传输类型,最大数据包常数等。USB系统软件会判断当前USB是否有足够的帧时间来满足该配置的总线带宽请求,不满足,主机尝试使用其他配置值。满足,配置成功。USB设备可从USB总线获取其配置描述符中所指出的最大总线电流,并可以和客户软件进行数据传输。学ARM和学单片机一样简单学ARM和学单片机一样简单#defineUSB_REQUEST_GET_STATUS0x00#defineUSB_REQUEST_CLEAR_FEATURE0x01#defineUSB_REQUEST_SET_FEATURE0x03#defineUSB_REQUEST_SET_ADDRESS0x05#defineUSB_REQUEST_GET_DESCRIPTOR0x06#defineUSB_REQUEST_SET_DESCRIPTOR0x07#defineUSB_REQUEST_GET_CONFIGURATION0x08#defineUSB_REQUEST_SET_CONFIGURATION0x09#defineUSB_REQUEST_GET_INTERFACE0x0A#defineUSB_REQUEST_SET_INTERFACE0x0B学ARM和学单片机一样简单USB的描述符一个USB设备有一个设备描述符,设备描述符里面决定了该设备有多少种配置,每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符;端点描述符定义了端点的大小,类型等等。由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。其中可能还会有获取设备序列号,厂商字符串,产品字符串等。学ARM和学单片机一样简单在控制管道发起USB设备请求,其中很常见的请求是USB_REQUEST_GET_DESCRIPTOR,即请求USB设备回答设备或者管道描述符。在请求描述符时,bmRequestType可以指定是针对设备还是针对管道的。当请求设备描述符后,设备会回答主机该设备的设备描述符,设备描述符是一种固定的数据结构学ARM和学单片机一样简单1.设备描述符//定义标准的设备描述符结构typedefstruct_DEVICE_DCESCRIPTOR_STRUCT{BYTEblength;//设备描述符的字节数大小BYTEbDescriptorType;//设备描述符