以下是一个程序枚举数据传输的全过程: (1) 当设备与主机连接时,主机就会检测到一个连接条件,并且D+的数据线被拉至Vse以上2.5微秒(30个全速数据比特周期),主机就开始进行总线复位。 (2) 主机使用默认地址(地址0)读取设备描述符,在这里主机使用地址0对设备的设备描述符进行读取。由于PDIUSBD12的端点0的缓冲区只有16个字节,所以单片机就先发送16个字节的设备描述符。当主机接收到这16个字节的字符后,就认为真正有设备连接了,即发送1个0字节的数据包到设备作为状态应答。 (3) 在地址分配阶段里,主机分配给设备一个地址。在以后的通信里设备就只对这个地址的信息作出应答。 (4) 分配好了设备地址后,主机就从新的地址获取设备描述符。由于受PDIUSBD12芯片的限制,设备分2次把设备描述符经过端点0发送出去,第一次发送16个字节,第2次发送2个字节。最后主机发送0字节的数据包作为状态应答。 (5) 主机读取完设备描述符后就读取设备的配置描述符 (6) 主机除了读取设备描述符和配置描述符外,还要读取接口描述符和端口描述符。在这里主机使用再次读取配置的方法来读取配置描述符、接口描述符和端点描述符的集合。 (7) 主机读取完描述符后,就需要对设备进行配置,使得设备从地址状态进入配置状态。 (8) 主机设置完配置以后,设备即可使用。主机有时会对设备的配置状态进行读取。 (9) 一个网友的例程:
本系统中所谓USB设备即是指温度测量和控制的设备,设备采用USB总线供电,采用D12芯片内置的SoftConnect技术与USB总线连接。所谓SoftConnect意思是在程序中通过向D12发送命令实现USB设备的连接或者断开连接,这里的连接并不是指USB电缆的插上或拔出,相反USB连接可以重新初始化而不需要拔出电缆。
主机是通过检测Vcc上拉电阻的变化来确定是否有设备连接的。在D12内部集成了1.5kΩ的上拉电阻,默认状态下不与Vcc相连,程序运行时可以向D12发送连接命令使1.5kΩ电阻连接到Vcc,这样主机便检测到有设备连接。 它的枚举过程分析如下。 设备连接到总线后,设备从总线获得5V电源,程序首先初始化,端口,然后向D12发出USB连接命令。主机检测到设备连接。主机向设备发出第一个信号:总线复位。总线复位产生一个中断,并且D12器件在默认地址0处使能,以便在接下来的枚举过程中使用地址0传输命令和数据,同时中断寄存器的总线复位位被置为1。在程序中的表现是,D12向主循环请求中断,进入中断处理程序USB_int_handler(),读取中断寄存器,确定中断的类型,进行相应的处理。 主机使用默认地址0读取设备描述符。 具体过程是:主机向D12发送第一个Setup包,每个Setup包都是8个字节,第一个包Get 当主机接收到这16个字节的字符后,就认为真正有设备连接了。 地址分配。 主机向D12发送第二个Setup包,这是一个含有指定地址的数据包,其内容一般为:00 主机从新的地址获取设备描述符。 主机收到设备发来的空的应答数据包后,确认地址分配成功。然后主机向D12发送第三个Setup包,再次要求获取设备描述符。这个Setup包的内容一般是:80 主机读取配置描述符。 成功得到18字节的设备描述符后,主机向D12发送第四个Setup包,要求得到设备的配置描述符。这个Setup包的数据为:80 读取描述符集合。 成功得到9字节的配置描述符后,主机向D12发送第五个Setup包,要求得到设备的配置描述符、接口描述符、端点描述符的集合。这次Setup包的内容是:80 到这一步,主机现在应该已经发现新硬件并为新设备安装好驱动程序。对于以上过程,主机是在总线驱动层处理,下面的一步,也是典型枚举过程的最后一步,就需要设备驱动程序来做了。 数值配置。主机得到各种描述符之后,认为设备的信息已经齐全,便对设备进行配置,使设备从地址状态进入配置状态。 主机向D12发送第六个Setup包,其数据为:00 至此,USB枚举过程结束,设备可以正常使用了。在这个过程中D12指示灯根据通信的状况间歇闪烁。 |
|