[求助]CH357獲取描述符出錯

我在使用CH357中出現(xiàn)如下問題: 用 get_descr(0x01);//獲取設(shè)備描述符成功后 用提供的 get_descr(0x02);//獲取配置描述符 就可以正常獲取配置描述符; 但采用如下:就是所謂的外部固件的方法,就會在 SETUP階段操作成功后轉(zhuǎn)DATA 階段錯誤。 toggle_send(0); wr_usb_data(8,Request.Req_buf); /* Request.Req.bmRequestType=0x80; Request.Req.bRequest=0x06; Request.Req.wValue=0x0002; Request.Req.wIndex=0x0000; Request.Req.wLength=0x0900; */ status=issue_token(( 0 << 4 ) | DEF_USB_PID_SETUP); if(status==USB_INT_SUCCESS)/* SETUP階段操作成功 */ toggle_recv(0xff); else return(0); // status=issue_token(( 0 << 4 ) | DEF_USB_PID_IN); //在此錯誤 返回 0x2E if(status==USB_INT_SUCCESS)/* DATA階段操作成功 */ { ..... }

那肯定是你的程序有問題,可以不可以將程序帖全看下啊


請hcn幫忙指正:

/* 用CH375A操作USB設(shè)備 */

#include #include #include "..\SUN\CH375INC.H" #define uchar unsigned char #define uint unsigned int

#define CH375_INT_WIRE (PINE&0x80) /* P3.2, INT0, 連接CH375的INT#引腳 */

unsigned char flag_config_1=0; //第二次獲取描述符標(biāo)志位 unsigned char data_buf[96]; //描述符緩沖區(qū)可以適當(dāng)減小 union _REQUEST //請求包結(jié)構(gòu) { struct { unsigned char bmRequestType; unsigned char bRequest; unsigned int wValue; unsigned int wIndex; unsigned int wLength; }Req; unsigned char Req_buf[8]; }Request;

// void UART_INIT(void); void TX_OUT(uchar gs); void YS_XXms(uchar loop); void YS_XXus(uchar loop); void CH375_PORT_INIT ( void ); void CH375_WR_CMD_PORT ( uchar commd ); void CH375_WR_DAT_PORT ( uchar data ); uchar CH375_RD_DAT_PORT( void );

#define TRUE 1 #define FALSE 0 //--------------- uchar set_usb_mode( uchar mode ) //設(shè)置CH37X的工作模式 { uchar i; // CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( mode ); for( i=0; i!=100; i++ ) { if ( CH375_RD_DAT_PORT()==CMD_RET_SUCCESS ) return( TRUE ); /* 成功 */ } return( FALSE ); /* CH375出錯,例如芯片型號錯或者處于串口方式或者不支持 */ }

//-------------- void toggle_recv( uchar tog ) { /* 主機(jī)接收成功后,切換DATA0和DATA1實(shí)現(xiàn)數(shù)據(jù)同步 */ CH375_WR_CMD_PORT( CMD_SET_ENDP6 ); CH375_WR_DAT_PORT( tog ? 0xC0 : 0x80 ); YS_XXus(2); }

//-------------- void toggle_send( uchar tog ) /* 主機(jī)發(fā)送成功后,切換DATA0和DATA1實(shí)現(xiàn)數(shù)據(jù)同步 */ { CH375_WR_CMD_PORT( CMD_SET_ENDP7 ); CH375_WR_DAT_PORT( tog ? 0xC0 : 0x80 ); YS_XXus(2); }

//--------------- uchar rd_usb_data( uchar *buf ) //讀出數(shù)據(jù)塊 { uchar i, len; // CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); //從CH375的端點(diǎn)緩沖區(qū)讀取接收到的數(shù)據(jù) len=CH375_RD_DAT_PORT(); //后續(xù)數(shù)據(jù)長度 for ( i=0; i!=len; i++ ) *buf++=CH375_RD_DAT_PORT(); return( len ); }

//-------------- void wr_usb_data( uchar len, uchar *buf ) //寫入數(shù)據(jù)塊 命令+長度+數(shù)據(jù) { CH375_WR_CMD_PORT(CMD_WR_USB_DATA7); //向CH375的端點(diǎn)緩沖區(qū)寫入準(zhǔn)備發(fā)送的數(shù)據(jù) CH375_WR_DAT_PORT(len); //后續(xù)數(shù)據(jù)長度, len不能大于64 while(len--) CH375_WR_DAT_PORT(*buf++); }

//--------------- uchar wait_interrupt( void ) //主機(jī)端等待操作完成, 返回操作狀態(tài) { uint i; // for(i=0x00;(CH375_INT_WIRE)!=0;i++) //如果CH375的中斷引腳輸出高電平則等待,通過計(jì)數(shù)防止超時(shí) { YS_XXus(1); if(i==0xF000) //如果超時(shí)達(dá)61mS以上則強(qiáng)行終止NAK重試,中斷返回USB_INT_RET_NAK { CH375_WR_CMD_PORT(CMD_GET_STATUS); //產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) return(CH375_RD_DAT_PORT()); } } CH375_WR_CMD_PORT(CMD_GET_STATUS); //產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) return(CH375_RD_DAT_PORT()); }

//--------------- uchar issue_token( uchar endp_and_pid ) //執(zhí)行USB事務(wù) { CH375_WR_CMD_PORT( CMD_ISSUE_TOKEN ); CH375_WR_DAT_PORT( endp_and_pid ); /* 高4位目的端點(diǎn)號, 低4位令牌PID */ // return( wait_interrupt() ); /* 等待CH375操作完成 */ }

//----------------- uchar get_report_descr_ex( void ) { uchar descr_len; uchar *p=data_buf; uchar time=1; uchar status; // toggle_send(0); wr_usb_data(8,Request.Req_buf); status=issue_token(( 0 << 4 ) | DEF_USB_PID_SETUP); if(status==USB_INT_SUCCESS)/* SETUP階段操作成功 */ toggle_recv(0xff); else return(0); // status=issue_token(( 0 << 4 ) | DEF_USB_PID_IN); //在此錯誤 // data_buf[0]=status; //返回錯誤 0x2E TX_OUT(1); // if(status==USB_INT_SUCCESS)/* DATA階段操作成功 */ { if(flag_config_1) descr_len=data_buf[2]-rd_usb_data(data_buf); else descr_len=data_buf[0]-rd_usb_data(data_buf); while(descr_len>0) { if(time) { toggle_recv(0); time=0; } else { toggle_recv(0xff); time=1; } p+=0x08; status=issue_token(( 0 << 4 ) | DEF_USB_PID_IN); if(status==USB_INT_SUCCESS) /* DATA階段操作成功 */ descr_len-=rd_usb_data(p); else return(0); } } else return(0); // toggle_send(1); wr_usb_data(0,Request.Req_buf); status=issue_token(( 0 << 4 ) | DEF_USB_PID_OUT); if(status==USB_INT_SUCCESS)/* 狀態(tài)階段操作成功 */ return(1); else return(0); }

//----------------- void reset_device(void) //復(fù)位該設(shè)備 { /* USB規(guī)范中未要求在USB設(shè)備插入后必須復(fù)位該設(shè)備, 但是計(jì)算機(jī)的WINDOWS總是這樣做, 所以有些USB設(shè)備也要求在插入后必須先復(fù)位才能工作 */ set_usb_mode( 7 ); //復(fù)位USB設(shè)備,CH375向USB信號線的D+和D-輸出低電平 YS_XXms(10); set_usb_mode( 6 ); //結(jié)束復(fù)位 YS_XXms(100); while ( wait_interrupt()!=USB_INT_CONNECT ); //等待復(fù)位之后的設(shè)備端再次連接上來 YS_XXms(200); }

//----------------- uchar get_descr( uchar type ) //從設(shè)備端獲取描述符 { CH375_WR_CMD_PORT( CMD_GET_DESCR ); CH375_WR_DAT_PORT( type ); //描述符類型, 只支持1(設(shè)備)或者2(配置) return( wait_interrupt() ); //等待CH375操作完成 }

//---------------------- void TX_OUT(uchar gs) { uchar tx_data_p; // tx_data_p=0x00; // do{ while( ! (UCSR0A & (1< UDR0=data_buf[tx_data_p]; tx_data_p++; }while(--gs); }

//--------------- void main(void) { uchar len; uchar status; // CH375_PORT_INIT( );//初始化端口 PORTD&=~BIT(2); //開綠色LED UART_INIT( ); //初始化串口 // YS_XXms(250); set_usb_mode( 6 ); //設(shè)置USB主機(jī)模式, 如果設(shè)備端是CH37X, 那么5和6均可 // data_buf[0]=0xaa; //發(fā)出AA表示主程序開始 TX_OUT(1); // while(1) { while ( wait_interrupt()!=USB_INT_CONNECT ); //等待設(shè)備端連接上來 YS_XXms(5); reset_device(); //復(fù)位USB總線 使USB設(shè)備重新連接 // status=get_descr(0x01);//獲取設(shè)備描述符 len=rd_usb_data( data_buf ); TX_OUT(len); //發(fā)出設(shè)備描述符內(nèi)容 // /* len=get_descr(0x02);//獲取配置描述符 len=rd_usb_data( data_buf ); TX_OUT(len); //發(fā)出設(shè)備描述符內(nèi)容 */ Request.Req.bmRequestType=0x80; Request.Req.bRequest=0x06; Request.Req.wValue=0x0002; Request.Req.wIndex=0x0000; Request.Req.wLength=0x0900; // status=get_report_descr_ex(); data_buf[0]=status; TX_OUT(1); //查看是否返回成功 // //TX_OUT(18); //發(fā)出獲取到的配置描述符內(nèi)容 // YS_XXms(250); while ( wait_interrupt()!=USB_INT_DISCONNECT ); /* 等待設(shè)備端連接上來 */ } }


可以操作的程序已經(jīng)通過E-MAIL發(fā)送給你了,你可以去參考下,主要問題是你在獲取設(shè)備描述符之后沒有設(shè)置地址,導(dǎo)致獲取配置描述符的時(shí)候出現(xiàn)問題


hcn您好! 您發(fā)的E-MAIL我沒有收到,請?jiān)诎l(fā)一次可以嗎? 個(gè)人信息保護(hù),已隱藏 謝謝!


我也出現(xiàn)這樣的問題 麻煩高手幫忙說詳細(xì)點(diǎn)好嗎 獲取設(shè)備描述符之后要設(shè)置地址?

設(shè)為多少?


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

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