USB学习笔记

一、背景

最近在做一个关于USB通信的项目,下位机是采用STM32F407为主控芯片。PC作为主机,下位机作为设备,PC通过上位机发送数据给下位机,下位机接收数据并回传相应的数据。刚开始都不确定从机用HID还是CDC来实现,由于之前没有接触过USB,这几天一直在看关于USB的资料,在网上也搜索了很多资料,看完资料还是感觉一头雾水,所以对所看的内容做一下归纳总结,方便自己以后查看,同时把我的想法分享给大家,文中可能有理解偏差的地方,随着时间和学习的深入我也会对文中有错误的地方进行更改,如果您看到我的博客并能指出错误,我将感激不尽。

二、正文

1USB简介:Universal Serial BUS(通用串行总线) 简称通串线

USB一个外部总线标准,用于规范电脑与外部设备的连接和通讯USB 接口支持设备的即插即用和热插拔功能。USB 发展到现在已经有 USB1.0/1.1/2.0/3.0 等多个版本。 STM32F407 自带的 USB 符合 USB2.0 规范。

标准 USB 四根线组成,VCC/GND外,另外为D+D-,这两根数据线采用的是差分电压的方式进行数据传输的。在USB主机上,D-D+都是接了15K的电阻到地的,所以在没有设备接入的时候,D+D-均是低电平。而在USB设备中,如果是高速设备,则会在D+上接一个1.5K的电阻到VCC,而如果是低速设备,则会在D-上接一个1.5K 的电阻到VCC。这样当设备接入主机的时候,主机就可以判断是否有设备接入,并能判断设备是高速设备还是低速设备。 

 

2USB常用术语

USB开发主要包括:USB主机、USB设备(从机)、USB OTG系统开发

、什么是OTG技术?

ON-THE-GO是近年发展起来的技术,主要应用于各种不同设备或移动设备间的连接,进行数据交换。OTG技术就是在没有HOST的情况下,实现设备间的数据传输。OTG补充协议:增加了电源管理(节省功耗)功能,允许设备既可以作主机也可以作为外设操作。既有主机功能又有设备功能。如:平板电脑

参考:http://baike.baidu.com/view/146799.htm

、什么是集线器?

集线器(Hub:扩展USB主机所能连接的设备数量,主要用于扩展。

SIE:串行接口引擎,主要USB总线上传输的数据进行编码和解码,检测与产生信息包的起始SOP标志和信息包的结束EOP标志,对数据进行串/并转换,检测接收信息包、传送信息包等功能。

端点:是主机和设备之间通信的目的或来源。控制端点可以双向传输数据,而其他端点只能单向传输数据。

4、枚举

USB主机通过一系列命令要求USB设备发送描述符信息,从而知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及数据量的大小。

所以枚举对主机与设备进行通信是非常重要的,枚举不成功,主机就无法了解设备,USB设备也不能成其为USB设备。

枚举过程:上电检测获取设备描述符设置设备地址再次获取设备描述符获取配置描述符获取字符串描述符枚举成功

对于不同的系统枚举的过程是不一样的。

5USB电源

USB规范要求在任何情形下,电压均不能超过5.25V,在最坏的情形下电压均不能低于4.375V,一般情形电压会接近5V,一个USB的跟集线器最多只能提供500mA的电流。

 

3、USB设备有4种传输方式与主机进行通信

控制方式

中断方式

批量方式

同步方式

 

4STM32F407USB OTG FS主要特性可分为三类:通用特性、主机模式特性和从机模式特性。由于项目用到的是从机模式,所以主要了解从机模式。学习就是这样,需要用到什么就学什么,因为要学的东西太多,不可能面面俱到,正如人们常说的有舍才有得

从机(Slave/Device)模式的特点:

  • 1个双向控制端点0
  • 3IN端点(EP),可配置为支持批量传输、中断传输和同步传输
  • 3OUT端点(EP),可配置为支持批量传输、中断传输和同步传输
  • 管理一个共享RxFIFO和一个Tx-OUT FIFO,以高效实用USB数据RAM
  • 管理多达4个专用Tx-IN FIFO,降低应用程序负荷支持软断开功能。 

ST提供的 USB OTG  http://www.stmcu.org/download/index.php?act=ziliao&id=150 

5、ST官方库中提供了USB10种应用,本项目主要是作为从设备,用到HIDHID所需要的文件如下:

其中DeviceDriver中的文件基本不需要改,只需要改APP中的几个文件即可。

这里主要讲一下USB_APP里面的文件:

Usb_bsp.c:主要包括GPIO配置,中断配置,端口供电配置以及延时函数等

Usbd_desc.c:提供了USB设备类描述符,直接决定了USB设备的类型、断点、接口、字符串、制造商等重要信息。这里面的内容我们一般不需要修改,直接用官方的即可。

Usbd_usr.c:提供用户应用层接口函数。USB设备类的一些回调函数,当USB状态机处理完不同事务的时候,会调用这些回调函数,我们通过这些回调函数,就可以知道USB 当前状态,比如:是否枚举成功了?是否连接上了?是否断开了?等,根据这些状态,用户应用程序可以执行不同操作,完成特定功能。 

以上文件基本上都是以回调函数的形式,被 USB 驱动库调用的。 

Usbd_conf.h文件里面的内容需要根据具体的应用写不一样的宏定义。

原文地址:https://www.cnblogs.com/zengxy/p/7161039.html