USB学习总结 (一)
上一个周开始学习了USB协议的一些知识,并调试了USB模组,在调试过程中也遇到了很多问题,以前听老师说USB这块很难,所以每次谈到USB这块,我们是没有去尝试过,经过向天的学习,我觉得USB虽然不算简单,但也没有我们想像中那么难,这里主要写一些自己对USB的几点认识(主要写枚举过程相关知识):
1.端点
从硬件的角度来看,端点其实就是USB中一系列实际的物理数据缓冲区,发送和接收的数据都存在这里。一个设备可以有很多种传输方式来与主机进行数据通信,每一种传输中都可以有特定的端点。从设备的角度来说,端点一般都直接由USB接口芯片来提供,功能较强的芯片都会提供多个具有一定容量的端点,开发人员在设计USB程序时一任务就是要合理分配这些端点,而每一次USB的数据传输都是在某一个特定的端点和主机之间进行的。因此,端点号也是第一次USB数据传输非常重要的参数。
USB协议规定,低速设备只能定义两个端点,即端点0和端点1,此外除端点0以外,任何一个端点都可以定义为IN端点或是OUT端点,因此一个全速设备则能定义多个个端点(最多32个)。
USB系统中,每一个端点都有惟一的地址,这是由设备地址和端点号共同决定的。而设备的大小、属性等在设备出场时由厂家定义。所以,每一个USB设备在主机看来就是一系列端点的集合,主机通过端点与设备进行通信。
端点的特性,主要有数据传输方式(用于IN事务的端点、OUT事务的端点和SETUP事务的端点)、总线访问频率、带宽、端口号(由USB接口芯片定义)和数据包最大容量等(也由芯片硬件决定)。
除了端点0(用作控制传输端占)外,端点必须在设备被主机配置后才能使用。
2. 管道
管道并不像端点一样有实在的意义。它只是一种逻辑上的概念。上面说到端点就是数据缓冲区,那么就要以想到:管道就是主机与设备端点之间的连接。管道主是数据传输的管道,代表主机的数据缓冲区与设备端点之间交换数据的能力。设备被配置后,端点就可以使用了,因此管道也就是存在了。
作为USB即插即用特点的典型体现,只要设备连接到主机上,端点就可以被访问,即与之相应的管道也就存在了。管道的概念主要用于PC上驱动程序和用户程序的编写,在设计USB设备时一般不会涉及到。
3. 描述符
描述符是一个完整的数据结构,可以通过C语言等编程实现,并存储在USB设备中,用于描述一个USB的所有属性。USB主机是通过一系列的命令来要求设备发送这些信息的。
USB设备的属性包括很多内容,USB1.1协议将这些信息做了多种分类,定义为多种描述符,其中标准的描述符包括以下几种:
1) 设备描述符 (Device Descriptor)
2) 配置描述符 (Cofngiuration Descriptor)
3) 接口描述符 (Interface Descriptor)
4) 端点描述符 (Endpoint Descriptor)
5) 字符串描述符 (String Descriptor)
描述符之间有一定的关系,设备描述符是最高级别的描述符,而端点描述符是最低级的描述符,每一个设备只有一个设备描述符,但设备描述符可以包含多个配置描述符;而一个配置描述符又可以包含多个接口描述符;一个接口使用了几个端点,就有几个端点描述符;字符串描述符是可选的。如下图:
4.USB固件接口:
USB固件的积木式结构如图示:
主要包括:
硬件提取层:对单片机I/O、数据总线等进行操作。
D12命令接口层:对PDIUSBD12器件进行操作。
中断服务程序:D12向单片机发出中断请求时读取中断传输
数据并设定事件标志位和Setup包数据缓冲区传输给主循环程序。 |