Chinaunix首页 | 论坛 | 博客
  • 博客访问: 348909
  • 博文数量: 88
  • 博客积分: 907
  • 博客等级: 准尉
  • 技术积分: 1230
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-26 13:27
文章分类

全部博文(88)

文章存档

2017年(1)

2014年(3)

2013年(29)

2012年(21)

2011年(26)

2010年(8)

分类: LINUX

2011-04-08 12:52:04

大家好,欢迎参加这次的旅途,这次旅途的目的地是一个美丽、复杂、多变的地方----usb协议。
在旅途开始前,我们需要准备一些东西。
 

1:准备一个软件Bus Hound在网上可以下载到

2:准备一个串口调试工具,串口调试助手.exe

好了,有了上边两个工具,现在开始了解什么是usb,以及usb是怎么枚举。

 

 

/*****************************************************************************/

Usb枚举

/*****************************************************************************/

什么是usb大家google,现在我们直奔主题,看看usb是怎么枚举的。

/*

下面是我在网上找的枚举过程

其过程是完全正确的,当然在这之前, 你的写好串口的驱动,可以打印调试信息

还有就是你还得设置好中断的,建议使用软中断。其中有些过程是硬件处理的,我们直接收到的第一个中断是reset

*/

它的枚举过程分析如下。

 

设备连接到总线后,设备从总线获得5V电源,程序首先初始化,端口,然后向D12发出USB连接命令。主机检测到设备连接。主机向设备发出第一个信号:总线复位。总线复位产生一个中断,并且D12器件在默认地址0处使能,以便在接下来的枚举过程中使用地址0传输命令和数据,同时中断寄存器的总线复位位被置为1。在程序中的表现是,D12向主循环请求中断,进入中断处理程序,读取中断寄存器,确定中断的类型,进行相应的处理。

 

主机使用默认地址0读取设备描述符。

 

具体过程是:主机向D12发送第一个Setup包,每个Setup包都是8个字节,第一个包Get Descriptor的内容为:80 06 00 01 00 00 40 00 ,数据为16进制表示。其中的40表示返回的数据最大长度为40H字节。此Setup包存储在D12的端点0缓冲区中,并产生一个外部中断。(这时在D12的中断寄存器中保存了中断的类型:端点0OUT中断,即中断寄存器字节1的值应为0x01)进入中断服务程序后,由于D12端点0的缓冲区只有16个字节,所以单片机就先发送16个字节的设备描述符。

 

当主机接收到这16个字节的字符后,就认为真正有设备连接了。

 

地址分配。

 

主机向D12发送第二个Setup包,这是一个含有指定地址的数据包,其内容一般为:00 05 02 00 00 00 00 00 ,其中的02就表示主机为设备分配的地址为0x02,在以后的通信里设备就只对0x02地址的信息作出应答。D12收到这个Setup包后同样产生一个中断(端点0OUT中断),需要注意的是单片机处理这个中断时需要向主机返回一个长度为0的空数据包。

 

主机从新的地址获取设备描述符。

 

主机收到设备发来的空的应答数据包后,确认地址分配成功。然后主机向D12发送第三个Setup包,再次要求获取设备描述符。这个Setup包的内容一般是:80 06 00 01 00 00 12 00 。与上次不同的是,这次要求实际的描述符长度,其中的12(十六进制数)表示要求得到全部18字节的设备描述符。因为每次只能发送16字节,因此程序中要分两次完成此要求。第一次16字节,第二次2字节。

 

主机读取配置描述符。

 

成功得到18字节的设备描述符后,主机向D12发送第四个Setup包,要求得到设备的配置描述符。这个Setup包的数据为:80 06 00 02 00 00 09 00 。其中的09指定设备返回9字节数据,这正是配置描述符的长度。

 

读取描述符集合。

 

成功得到9字节的配置描述符后,主机向D12发送第五个Setup包,要求得到设备的配置描述符、接口描述符、端点描述符的集合。这次Setup包的内容是:80 06 00 02 00 00 FF 00 。由于不知道描述符集合的真实长度,因此它要求得到256字节。

 

到这一步,主机现在应该已经发现新硬件并为新设备安装好驱动程序。对于以上过程,主机是在总线驱动层处理,下面的一步,也是典型枚举过程的最后一步,就需要设备驱动程序来做了。

 

数值配置。主机得到各种描述符之后,认为设备的信息已经齐全,便对设备进行配置,使设备从地址状态进入配置状态。

 

主机向D12发送第六个Setup包,其数据为:00 09 01 00 00 00 00 00 。程序中需要调用Set Configuration()函数处理此事件,允许所有端点进入工作状态。

 

至此,USB枚举过程结束,设备可以正常使用了。

 

这里的usb枚举一定要记住,这是usb的基础,不然后面的是没法进行下去的

/*****************************************************************************/

Usb枚举结束

/*****************************************************************************/

阅读(1061) | 评论(0) | 转发(0) |
0

上一篇:MACHINE_START宏

下一篇:usb的旅途之枚举

给主人留下些什么吧!~~