凌阳科技大学计划论坛

首页 » 16位u'nSP平台技术讨论区 » 应用技术讨论 » USB_读卡器 新区....
lameck - 2007-12-9 22:08:00
这几天调试USB,有时很好玩,有时调的人有点晕...

好多人也在调USB吧,大家以后有什么问题和收获的话,可以在这里发一帖

有问题大家一起解决,有收获大家一起分享!

希望大家都能很好的完成这次任务.
sky1234567 - 2007-12-9 23:33:00
你用什么片片调,我打算用CH375
lameck - 2007-12-10 16:21:00
我用的是凌阳大学计划的USB模组,很好用地...
PDIUSBD12这个片片...
lameck - 2007-12-10 16:26:00
帖一些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包数据缓冲区传输给主循环程序。

标准请求处理:对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;

接口描述符中:
bInterfaceClass字段:0x08,  Mass Storage 类
bInterfaceSubClss字段:0x04, UFI子类
binterfaceProtocol字段:0x50, 单批量传输
)

在bus hound中观察到:

                 
                             

看见主机发送获取最大LUN号和CBW包,就说明枚举成功了。

在串口调试助手中观察到的程序执行顺序:

                         
                 

看见Bulk-Only_in中断说明主机对设备已经枚举成功了,并开始通过端口2和设备进行通信了。


暂时就做到这里了,后边的还没有调出来呢,正在调试…
lameck - 2007-12-10 21:40:00
(转载)
在网上看到一篇文章,写的不错,发来看看:

首先,要明白两个观点。第一,USB总线上所有的事务(数据流传输)都是由USB Host主动发起,而USB设备永远永远都是只是被动地接收然后处理USB Host发来的各种各样的命令(要求)。第二,中断是USB Host和USB设备之间的信令员,USB Host所有的要求都是通过这个信令员即中断来通知USB设备。

. 我们可以将整个USB数据通信过程看成是由一个一个的数据包构成,而这些数据包又分很多类,比如:令牌包,数据包,握手包,帧起始包。令牌包又分In包,Out包,Setup包。有一点我觉得对于刚开始接触USB的人来说,一定要弄清楚这么多包,哪些是由硬件自动来处理,哪些是要由驱动程序去处理的,如果这点没有弄清楚,写或者看驱动代码时往往会摸不着头脑.

下面通过分析USB Host读取USB设备描述符整个过程来说明这个问题:



1.上图中粉红色的Packet#表示是主机发出,设备接收包;淡青色的Packet#表示是设备发出,主机接收包。如果区分不了这两种颜色,可以根据箭头的方向来区分,“->”这个表示是主机发出,设备接收的包;”<-” 表示是设备发出,主机接收的包。

2.图中灰色的部分表示,这些包在写驱动的时候是不太需要关心的地方,但是要了解有这么一个过程,这些灰色的部分都是由硬件自动处理.

3.那设备驱动要做的是什么呢?就是根据设备产生的中断来读取、解析、回应相应的数据包,注意上图中土黄色和淡蓝色两个数据包。

4. 下面详细分析整个过程,以及设备驱动该干些什么?

1) 在控制传输阶段,任何一个传输都是由Setup包发起(Packet#96)

2) 当USB设备接收到这个包,并识别出这是一个Setup包时,USB设备会产生一个Setup中断,有的称之为控制端点/端点0中断,以便通知MCU主机有任务下来啦,准备开始做事啦,这个动作都是由硬件自动完成

3) 紧接着Setup包的是,USB主机下达给USB设备具体是什么任务了,我们可以认为这个过程几乎是和Setup中断同时完成. (Packet#97)

4) 既然发生了Setup中断,USB设备驱动就可以认为主机有命令下达,USB设备收到主机下达命令后,由USB设备驱动发送一个Setup应答包,表示说“长官,命令已经收到” (Packet#98)

5) 设备已经接收到了主机的命令,那么USB设备驱动现在就要解析这个命令,来得知USB主机到底下达的是什么命令,在这里通过解析黄色数据 ” 80 06 00 01 00 00 40 00”可以得知该命令的意思是主机要求设备发送设备描述符,具体解析过程就是协议规范的内容了…

6) 既然USB设备已经成功得知了USB主机的命令是要发送设备描述符,那USB设备就赶紧去查找这些设备描述符在哪里?

7) 那驱动已经找到了设备描述符了,驱动是不是该把这个设备描述符发给USB主机呢?答案是No,No,No,原因就是开篇就提到的,所有的传输都是有主机主动发起,设备被动响应。现在虽然USB主机通知设备主机要设备描述符信息,但是主机目前并没有要求主机将这些信息发回去,所以,设备就算已经找到了描述符,也不能主动给主机发这些信息。打一个不太恰当的比喻,就好比一场足球比赛,教练让你”活动活动,准备上场”,现在你准备活动已经做完了,那你可不能立马就冲到场上去踢球,即使你活动完了,你还得等待教练的下一步指示,因为教练还得安排决定让谁下场,什么时候下场比较合适…. 等到教练说”上场吧”,那你就可以上场了… 好像比较扯了….哈哈 

8) USB主机下一个IN包通知USB设备回应刚才的命令,相当于教练喊”上场”,当USB设备收到这个IN包时,产生一个IN中断来通知MCU,那这时表示设备收到了”上场”的命令了。(Packet#103)

9) 这时,USB设备驱动把找到的设备描述符发送给USB主机。(Packet#104)

10) 主机收到设备回应的设备描述符后,给设备发一个握手包,表示已经收到设备的回应包了。(Packet#105) 11) 接下来,USB主机会发送一个0字节的数据包来作为状态响应,并且设备发一个握手包来结束整个过程,这是由硬件自动完成. (Packet#108/109/110)

由此可见,在控制传输过程中,USB设备驱动比较关心的应该是4,5,6,8,9这些步骤,其他的差不多都由硬件自动完成了。

今天就写了这么多,有时间再写.. :)
leajian - 2007-12-21 21:34:00
呵呵,好东西,鼓励分享,顶 ~  ^_^
gonglianfa - 2007-12-28 10:39:00
佩服佩服,生动形象!哈哈!多来点!
Mariah49 - 2007-12-28 11:35:00
鼓励分享,给你设置精华!继续你的U盘之旅吧……
happlylife - 2007-12-29 10:22:00
这两天我也在调USB我用的是PDIUSBD12,我昨天自己画了块扳子,等回来做好了用用看要是好用的话拿来和大家一起分享
coffee02182006 - 2008-10-6 23:39:00
楼上的有研究过USB2.0的东西没有哦,如果有的话,也分享一哈!
bluetooth.jiang - 2008-10-11 11:38:00
图片怎么看不到?换句话说怎样才可以看到图片!
wxp013132 - 2008-12-1 21:18:00
我用  ATMEGA8-16PU
 1 
查看完整版本: USB_读卡器 新区....