本人程序:如下
? USB_WriteCom( 0X05 );? ? ? ? /* 執(zhí)行硬件復位 */? ?
? Delay1s();Delay1s();
? USB_WriteCom( 0X06 ); USB_WriteData(0X57 );
? temp = USB_ReadData(); if( temp==0XA8) SendString8("Check OK");Enter
? USB_WriteCom( 0X15 ); USB_WriteData(0X01 );Delay1s();
? temp = USB_ReadData(); if( temp==0X51) SendString8("Set Mode OK");Enter
? while(1)
? {
? while( USB_INT );
? USB_WriteCom( 0X22 );
? temp = USB_ReadData();SendString8("INT=");SendString8_Num(temp,"%X");Enter?
? switch( temp )
? {
? ? case 0x0C:? ? ? ? ? ? // 端點0的接收器接收到數(shù)據(jù),SETUP成功
? ? ? ? ? ? USB_WriteCom(0x28);? ? ?//接收USB數(shù)據(jù)信息
? ? ? ? ? ? temp = USB_ReadData();? //讀取數(shù)據(jù)長度
? ? ? ? ? ? if( temp==8 )? ? ? ? ? ?/* 一定會出現(xiàn)8個數(shù)據(jù) */
? ? ? ? ? ? {
? ? ? ? ? ? ? ? for ( i=0;i<8;i++ ) //讀取8字節(jié)數(shù)據(jù)? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? { USB_Buf[i]=USB_ReadData(); }
? ? ? ? ? ? ? ? CurrentSetupRequest = USB_Buf[1];? ? ?//得到bRequest,即設備請求
? ? ? ? ? ? ? ? SendString8("SETUP=");SendString8_Num(CurrentSetupRequest,"%d");Enter
? ? ? ? ? ? ? ? switch( CurrentSetupRequest )
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? case 0x06:? ? ? ? ? //設備請求描述符
? ? ? ? ? ? ? ? ? ? i = USB_Buf[3]; //描述符類型
? ? ? ? ? ? ? ? ? ? SendString8("Get Desc: ");SendString8_Num(i,"%02d");Enter
? ? ? ? ? ? ? ? ? ? switch (i)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? case 0x01: //請求設備描述符
? ? ? ? ? ? ? ? ? ? ? ? CurrentDescriptor = DeviceDescriptor;? ?//將指針指向設備描述符數(shù)組
? ? ? ? ? ? ? ? ? ? USB_WriteCom(0x29);? ? ? ? ?//USB發(fā)送數(shù)據(jù)命令
? ? ? ? ? ? ? ? ? ? USB_WriteData(8);? ? ? ? //設置發(fā)送數(shù)據(jù)長度
? ? ? ? ? ? ? ? ? ? for (i = 0; i < 8; i++)? ? //發(fā)送八字節(jié)數(shù)據(jù)
? ? ? ? ? ? ? ? ? ? {USB_WriteData( CurrentDescriptor[i] );Delay1ms();Delay1ms();? ?}?
? ? ? ? ? ? ? ? ? ? USB_WriteCom(0x23);USB_ReadData();? ? ? ? ?//釋放USB總線
? ? ? ? ? ? ? ? ? ? CurrentDescriptor_Sent = 8;? ? ? ? //存儲已經發(fā)送的數(shù)據(jù)位置
? ? ? ? ? ? ? ? ? ? ? ? CurrentDescriptor_Size = 18;//設置設備描述符最大長度
? ? ? ? ? ? ? ? ? ? ? ? SendString8("send device desc\r\n");
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? case 0x02: //請求配置描述符
? ? ? ? ? ? ? ? ? ? ? ? CurrentDescriptor = ConfigurationDescriptor;//將指針指向配置描述符數(shù)組
? ? ? ? ? ? ? ? ? ? ? ? CurrentDescriptor_Size = CFGDES_SIZE;//設置配置描述符最大長度
? ? ? ? ? ? ? ? ? ? ? ? SendString8("send config desc\r\n");
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? case 0x05:? ? ? ? //設置設備地址
? ? ? ? ? ? ? ? ? ? DeviceAddress = USB_Buf[2]; //取設備地址
? ? ? ? ? ? ? ? ? ? USB_WriteCom(0x29); // USB發(fā)送數(shù)據(jù)命令
? ? ? ? ? ? ? ? ? ? USB_WriteData(0);? ?// 發(fā)送零字節(jié)數(shù)據(jù)
? ? ? ? ? ? ? ? ? ? USB_WriteCom(0x23);USB_ReadData(); // 釋放USB總線
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? break;
? ? ? ? case 0x08:? ? ? ? ? ? ? //端點0的發(fā)送器發(fā)送完數(shù)據(jù),IN成功
?? ? ? ? ? ? USB_WriteCom(0x23);USB_ReadData(); //釋放USB總線
? ? ? ? ? ? if ( ( CurrentSetupRequest == 0x06 )&&(CurrentDescriptor) )? ?//只在已經發(fā)送過設備描述符并且有描述可以發(fā)送
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Len = CurrentDescriptor_Size - CurrentDescriptor_Sent;? ? ?//取得需要發(fā)送數(shù)據(jù)長度
? ? ? ? ? ? ? ? Len = (Len > 8) ? 8 : Len;? ?//判斷還需要發(fā)送多少位數(shù)據(jù)
? ? ? ? ? ? ? ? USB_WriteCom(0x29);? ? ? ?//USB發(fā)送數(shù)據(jù)命令
? ? ? ? ? ? ? ? USB_WriteData(Len);? ? ? //發(fā)送Len字節(jié)數(shù)據(jù)
? ? ? ? ? ? ? ? for (i = 0; i < Len; i++) //發(fā)送剩下的數(shù)據(jù)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? USB_WriteData( CurrentDescriptor[CurrentDescriptor_Sent] );
? ? ? ? ? ? ? ? ? ? CurrentDescriptor_Sent++;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? USB_WriteCom(0x23);USB_ReadData();? ? ? ?//釋放USB總線
? ? ? ? ? ? ? ? SendString8("send desc");
? ? ? ? ? ? }
? ? ? ? ? ? else if ( CurrentSetupRequest == 0x05 )
? ? ? ? ? ? {
? ? ? ? ? ? ? ? USB_WriteCom(0x13);? ?//將設備地址存入芯片
? ? ? ? ? ? ? ? USB_WriteData(DeviceAddress);? //發(fā)送設備地址
? ? ? ? ? ? ? ? SendString8("set address ");SendString8_Num(DeviceAddress,"%d");Enter
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case 0x00:? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// ep0 out
? ? ? ? ? ? USB_WriteCom(0x23);USB_ReadData(); // unlock usb
? ? ? ? ? ? break;
? default:? ? ? ?if ( (temp&0x03)==0x03 )? ? ? {? ?SendString8("Bus reset\r\n");? }
? ? ? ? ? ? USB_WriteCom(0x23);? ? ?//釋放USB總線
? ? ? ? ? ? temp = USB_ReadData();? //未知
? ? ? ? ? ? break;
? }
? }
使用串口得到的打印信息如下所示:
Check OK
Set Mode OK
INT=B
Bus reset
INT=B
Bus reset
INT=B
Bus reset
INT=B
Bus reset
INT=C
SETUP=6
Get Desc: 01
send device desc
INT=0
INT=0
INT=C
SETUP=5
INT=8
set address 28
INT=7
Bus reset
INT=7
Bus reset
INT=7
Bus reset
INT=C
SETUP=6
Get Desc: 01
send device desc
INT=0
INT=0
INT=C
SETUP=5
INT=8
set address 29
INT=7
Bus reset
INT=7
Bus reset
INT=7
Bus reset
INT=7
Bus reset
INT=C
SETUP=6
Get Desc: 01
send device desc
INT=0
INT=0
INT=0
INT=0
INT=0
INT=0
INT=C
SETUP=5
INT=8
set address 30
INT=7
Bus reset
INT=7
Bus reset
INT=7
Bus reset
INT=C
SETUP=6
Get Desc: 01
send device desc
INT=0
INT=0
INT=C
SETUP=5
INT=8
set address 31
無法正常發(fā)送設備請求符,設備無法被正常枚舉。