本帖最后由 木九十 于 2019-1-31 16:45 编辑
这里自己整理了一下USB设备开发的一些要点,参考了网上一些资料和 圈圈的书。
一个USB接口设备的开发主要涉及USB固件程序(单片机程序)、USB驱动程序、上位机程序这三个方面。 这里我们用的处理器stm32F103自带的USB为USB2.0全速版本(理论上最快12Mb/s)。 当我们光谱仪采样频率为200k时,AD转换为12位,按16位算,大约是3.2Mbps/s的速率,此时stm32的USB全速接口的批量传输模式是可以满足要求的。但是如果速率再增加的话要么用高速USB。(理论上最快480Mb/s) 我最近看的USB虚拟串口程序,它的固件部分就是批量传输,在主机端,USB驱动程序将USB口模拟成了一个 COM口,因此我们可以像串口一样的使用USB通信,但无论外观,信号的物理特征,通信协议,全部都是USB。而且这样就可以直接使用串口调试助手作为上位机,不用再开发新的上位机程序了。 下面来大致介绍一下。 一. USB设备的固件程序 USB的硬件功能主要在stm32上实现。我们在USB设备上编写的固件程序主要包含了设备描述符,配置描述符(包含了接口描述符,端点描述符),字符串描述符等。这些描述符里的信息就记录了设备的类型,厂商ID,产品ID(依靠这两个ID来加载主机上的对应的驱动程序),端点情况,版本号等众多信息。 设备描述符主要记录了:设备所使用的USB版本协议号、设备类型、端点0的最大包大小、厂商ID(VID)、产品ID(PID)、版本协议号、厂商字符串、字符串索引、设备序列号索引、可能的配置数等。 配置描述符:配置所包含的接口数、配置的编号、供电方式、是否支持远程唤醒、电流需求量等。 接口描述符:接口的编号、接口的端点数、接口所使用的类、子类、协议等。 端点描述符:端点号及信号传输方向、端点的传输类型、最大包长度、查寻时间间隔等。 字符串描述符:主要提供一些方便供人们阅读的信息(如生产设备的公司名称等),并不是必须的。 file:///C:/temp/msohtmlclip1/01/clip_image002.jpg Device Descriptor 设备描述符 Configuration Descriptor 配置描述符 String Descriptor 字符串描述符 枚举就是从设备读取各种设备描述符,这样主机就可以根据这些信息来加载合适的驱动程序,从而知道设备是个什么样的设备,需要如何进行通信。 USB总线上传输数据是以包为基本单位的。一个包是由域组成的。不同类型的包,所包含的域是不一样的。 包分为这么几种:令牌包,数据包,握手包,特殊包。 a. 令牌包分为输出(OUT),输入(IN),建立(SETUP)和帧起始(SOF,Start Of Frame)这四种。这里说明一下,这里的输出输入都是依据主机的,输出就是主机到设备传送信号,输入就是设备到主机。 b. 数据包顾名思义就是用来传输数据的。 c. 握手包用来表示一个传输是否被对方确认。握手包有ACK,NAK,STALL和NYET。这四个握手包表示不同的回应。 d. 特殊包是一些在特数场合使用的包。总共有4中:PRE,ERR,SPLIT和PING。其中PRE,SPLIT,PING是令牌包,ERR为握手包。 下面介绍一下事务。 事务通常由两个或三个包组成:令牌包,数据包,握手包。 令牌包用来启动一个事务,总是由主机发送。 数据包传送数据,方向由令牌包决定。 握手包的发送者通常为数据接受者,当数据正确接收后,发送握手包。设备也可以使用NAK握手包表示数据还未准备好。 批量传输使用批量事务传输数据。一次批量事务由三个阶段:令牌包阶段 阶段和握手包阶段。 在USB协议中,规定了4种传输类型:批量传输,等时传输,中断传输和控制传输。 批量传输使用批量事务传输数据。一次批量事务由三个阶段:令牌包阶段,数据包阶段和握手包阶段。批量传输没有规定数据的意义和结构,具体的数据结构要由设备自己定义。批量传输通常用在数据量大,对数据的实时性要求不高的场合,例如USB打印机,扫描仪,大容量存储设备等。 我们目前光谱仪使用的传输类型就是批量传输。 中断传输是一种保证查询频率的传输。中断端点在端点描述符中要报告它的查询间隔,主机会保证在小于这个时间间隔的范围内安排一次传输。中断传输通常用在数据量不大,但对时间要求较严格的设备中,如人机接口设备(HID)中的鼠标,键盘,轨迹球等。中断传输也可以用来不断地检测某个状态,当条件满足后再使用批量传输来传送大量数据。 等时传输用在数据量大,对实时性要求高地场合,例如音频设备,视频设备等。 控制传输最复杂。我们之前讲得USB设备枚举就是用的控制传输。 二. USB驱动程序开发和上位机开发 USB驱动程序是连接USB硬件和上位机程序的桥梁。 不同的设备插上主机后,主机会选择不同的驱动来运行这个设备。电脑上默认已经有的驱动有存储设备、键盘、鼠标、游戏杆、网络设备和调制解调器。如果是其他的设备,则需要自己写驱动了。举个例子,,手机通过USB线连接到PC上后,可以选择几个不同的模式,当选择仅限充电时,Host的USB设备驱动就走充电的驱动,当选择传输文件(MTP)时,Host的USB设备驱动就走传输文件的驱动。 因此,要做我们这个光谱仪,就需要写出相应的驱动来采集下位机传来的数据,然后上位机通过折线图的形式把数据显示出来。 USB驱动开发平台的选择直接关系到上位机开发平台的选择。如果上位机选择Visual Studio开发平台,则可以使用Microsoft的DDK开发驱动程序,可以选择DriverStudio软件。如果上位机选择LabVIEW开发平台,则需要使用NI-VISA开发平台。
|