编辑: 梦三石 2018-02-20
现在非常流行USB设备,时时刻刻都在我们身边,比如使用U盘,使用MP3,使用手机,都需要与PC的USB通讯.

通过USB的接口,使用我们的生活非常方便了,想什么时候听歌,就可以插入MP3到PC机那里,然后再从PC上下载MP3.这个过程在用户看来是非常的简单,不需要安装驱动程序,不需要断掉PC机的电源.真正体现 科技以人为本 的思想.使用这么方便的U盘或者MP3,那么我们又需要去问个为什么了,为什么会这么方便呢?往往方便的背后,就意味着需要工程师做大量的工作,才会让大家使用USB这么方便.下面就来详细地分析USB的协议. ? USB通讯是非常复杂的,刚刚协议定义就厚厚的一本,要完全地去看完,并且理解它,是很费时间的事情.希望本文可以提供给你一个非常好的指导,让你深入地理解USB的协议.USB的协议是主从协议,在所有通讯里,只有一个主控器,其它都是从设备.最多能接127个从设备,因为协议里只保留了7bit作为设备地址.所有的USB数据交流都是由主控器发起,其它从设备进行响应.现在就以WINDOWS上的USB通讯来学习一下USB的通讯协议,后面所有提到的数据,都是WINDOWS上的USB驱动程序发下来的数据. ? 为了把所有通讯数据都显示出来,我找到了一个USB的ARM开发板,通过这个开发板,就可以把主控器所有数据打印出来,并作相应的分析.同时,使用这个开发板,也可以用来调试龙芯的主控器驱动程序的调试. ? 当USB的开发板加电时,就会先初始化USB的连接,但没有插入PC的连接线,这时开发板就会从串口输出下面的字符: USB Suspend USB Resume 从上面看到,从设备的USB一直不断地挂起和唤醒,直到插入PC的连接线.当插入连接线到PC时,就会收到主控器发来的信息.下面的数据,就是开发板与USB主控器交流的数据. ? ? 1.收到主控器的获取设备描述符配置包. Setup m=0,n=0,val=37

80 06

00 01

00 00

40 00 这是主控器发来第一个配置包数据.由于主控器不知道USB设备设备描述符有多长,所以包的最后里的长度是0x0040,也就是64个字节长度. ? REQUEST_STANDARD=0x6 USB_DEVICE_DESCRIPTOR_TYPE(0) 根据USB的协议,分析上面的数据,就知道它是获取设备描述符.为了实现即插即用,就需要对插入来的设备进行获取描述信息,才知道这个USB的设备是什么样的设备,是U盘,还是HID的键盘.因此,USB设备就返回下面的数据给主控器: ? USB_DataInStage,cnt=18,EP0Data.Count=18

12 01

10 01

00 00

00 40

00 80

00 80

00 01

04 2C 4A

01 这条数据,就是USB的设备描述符,描述了这个设备使用什么USB的协议版本,这里是1.1的版本,还有厂家标识、产品标识,以及厂家、产品和序列号等字符串的偏移地址. USB_EVT_IN,USB_DataInStage USB_DataInStage,cnt=0,EP0Data.Count=0 ? USB_EVT_OUT 通过设备描述符,就可以让主控器知道这个设备是使用什么版本的USB协议,是高速的设备,还是低速的设备,是谁产生的,是什么产品,然后操作系统就可以通过这些信息去找到相应的驱动程序,如果操作系统没有找到相应的驱动程序,就会提示用户插入光盘,或者其它方来安装相应的驱动程序. ? 2.收到主控器的设置设备地址配置包. Setup m=0,n=0,val=37

00 05

01 00

00 00

00 00 这条数据,根据USB的协议,就可以知道它是设置USB设备的地址配置包.它的作用,就是分配USB设备的地址,由于USB总线上可以有127个设备,那么每个设备都需要分配一个唯一的地址才通讯,这跟网卡的MAC地址的作用是一样的.其实,就像分配门牌号,让大家看到那个门牌就知道什么房了. 从下面的数据分析来看,是分配地址为1. REQUEST_STANDARD=0x5 USB_DeviceAddress=129 USB_EVT_IN,USB_SetAddress(1) ? 3.收到主控器的获取设备描述符配置包. ? Setup m=0,n=0,val=37

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题