CH375使用外置固件模式時枚舉失敗

本人程序:如下

? 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ā)送設備請求符,設備無法被正常枚舉。

您好,看您的打印,這邊這個地址也設置了。您是如何判斷的375沒有正常發(fā)送設備描述符的,看您的打印時產生08中斷,即端點0的IN中斷了,您可以看一下您的上傳的數(shù)組的設備描述符是否正確。


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频