打印
[STM32F1]

USB设备开发概述 巨佬们帮我看看有没有理解错什么东西

[复制链接]
924|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 木九十 于 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开发平台。

沙发
木九十|  楼主 | 2019-1-31 16:38 | 只看该作者
枚举图片补上

USB枚举.png (99.08 KB )

USB枚举.png

使用特权

评论回复
板凳
木九十|  楼主 | 2019-1-31 16:42 | 只看该作者
有巨佬来指点一下 接下来要做的驱动和上位机的 吗,现在还没怎么了解这方面的东西

使用特权

评论回复
地板
xtoolbox| | 2019-2-3 00:38 | 只看该作者
应用程序在Windows上运行的话,也可以不用写驱动程序,Windows上提供了通用USB设备驱动WinUSB,像串口一样只需写一个INF文件就可以使用这个驱动了
如果你的系统是Win8以后的,这个INF文件也可以不用写,USB设备插上电脑就能自动识别并驱动成功

Windows上免驱动的USB设备具体做法见这里:
http://blog.xtoolbox.org/custom_usb_device_without_driver/

有了驱动之后可以通过Windows提供的WinUSB API来操作设备
libusb对WinUSB进行了封装,还可以通过libusb来操作
如果是用Qt开发应用程序的话,还可以用我封装的QLibUsb来操作

使用特权

评论回复
5
八层楼| | 2019-3-2 12:27 | 只看该作者
感谢楼主的分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

19

帖子

0

粉丝