打印

引用 USB学习总结 (一)

[复制链接]
5056|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TI中国|  楼主 | 2011-10-28 21:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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包数据缓冲区传输给主循环程序。
沙发
TI中国|  楼主 | 2011-10-28 21:27 | 只看该作者
标准请求处理:对USB的标准请求进行处理。
厂商请求处理:对用户添加的厂商请求进行处理。
      主循环程序:发送USB请求、处理USB事件和用户功能。
5.USB设备与主机的通信
  1).通信的实现:
     初学USB时,很难理解USB设备和主机的通信是怎样实现的,主机和设备的通信包括:命令、数据和握手等步骤。这些步骤是如何实现的呢?其实很简单,可以这样说,通信过程中,命令和数据内容的发送由协议层和HAL层完成,至于扬包和命令包数据包中的其他部分则是由硬件来完成的,用户可以不去考虑。
  2).顺序(枚举顺序):
主机对USB设备的枚举是USB设备开发的开始,也是整个程序的开始,但对这部分的高度不能通过单步运行的方式来进行调试,因为主机对USB设备的枚举是在很短的时间内完成的,单步调试不能满足时间的要求。所以刚开始时很难理解程序的执行顺序,初学者可以在程序中加入相应的串口输出程序在串口调试助手中来观察程序的执行顺序。
主机和USB设备通信的基本原理(这里用枚举过程来说明):
                  

6.枚举:
当USB设备第一次连接在主机上时,要接受主机的枚举和配置,目的就是让主机知道该设备具有什么功能,是哪一类USB设备,需要占用多少的USB资源,使用了哪些传输方式以及传输的数据量多大等等。只有完全确认了这些信息之后,设备才能真正开始工作。
对于U盘来说,枚举还要提供给主机批量传输输出BULK_OUT端点和输入BULK_IN端点和端点号以及相应的最大包尺寸。然后主机在后来的批量传输中才能正确地进行一系列操作,所以设备的枚举过程是非常重要的。
枚举过程:
1)       主机通过缺省的地址,端点0来获取设备描述符
2)       主机分配地址给设备
3)       主机将USB复位,进而就可以正式通过地址与设备通信了
4)       接着主机通过2)中分配给设备的地址获取其他描述符
5)       主机进一步分析设备所有端点的属性后主基本完成了能设备的枚举,最后主机设置配置请求来选择相应的配置,主机和设备在枚举阶段的所有通信工作就完成了
当主机对USB设备枚举完成之后,就可以根据设备的特性与设备进行通信了。在U盘设计中,接下来主机将通过枚举过程中获取的设备信息来对设备进行Mass Storage类相关命令,关于Mass Storage 相关部分我还没做,将在这周内学习。
(一)、USB的枚举过程:
1)用串口调试助手检测程序的执行顺序:
                               
2)用Bus Hound检测主机USB接口数据:

                           
(二)、将USB描述符相关部分设置为Mass Storage相关信息,观察到的结果:
(
设备描述符中:
bDeviceClass字段:0x00,表示Mass Storage类设备;
bDeviceSubClass字段:0x00  àMass Storage 类
bDeviceProtlcol字段:0x00;   à Mass Storage 类
idProduct字段:0x0888;

使用特权

评论回复
板凳
TI中国|  楼主 | 2011-10-28 21:28 | 只看该作者
接口描述符中:
bInterfaceClass字段:0x08;  àMass Storage 类
bInterfaceSubClss字段:0x04; àUFI子类
binterfaceProtocol字段:0x50; à单批量传输
)
在bus hound中观察到:
                              
看见主机发送获取最大LUN号和CBW包,就说明枚举成功了。
在串口调试助手中观察到的程序执行顺序:
                           
看见Bulk-Only_in中断说明主机对设备已经枚举成功了,并开始通过端口2和设备进行通信了。

以上大致就是我这周的工作情况,暂时就做到这里了,后边的还没有调出来呢,正在调试…

使用特权

评论回复
地板
gexingyouxian| | 2011-11-14 17:47 | 只看该作者
看不到图啊

使用特权

评论回复
5
japrincess| | 2011-12-6 14:30 | 只看该作者
呀!图片是什么内容?好想看看哦!

使用特权

评论回复
6
springvirus| | 2012-12-13 17:12 | 只看该作者
图是自己弄的吗,最好上些板子的图~~~~~

使用特权

评论回复
7
lzqxs89| | 2012-12-14 22:37 | 只看该作者
学习USB一周就有这样的总结! 高手啊

使用特权

评论回复
8
星火燎原| | 2012-12-15 23:47 | 只看该作者
记之

使用特权

评论回复
9
shibalihuandao| | 2012-12-16 18:47 | 只看该作者
不错,并且能看到图

使用特权

评论回复
10
czdo| | 2014-3-12 13:31 | 只看该作者
henbucuozhichi

使用特权

评论回复
11
czdo| | 2014-3-12 15:05 | 只看该作者
输入法出问题了

使用特权

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

本版积分规则

0

主题

99

帖子

1

粉丝