用CH375做主機(jī)操作USBCH372設(shè)備問題!

我用CH375做主機(jī)操作USBCH372設(shè)備,初始化設(shè)備成功,但從設(shè)備接收數(shù)據(jù),執(zhí)行USB事務(wù)時(shí)不能跳出中斷!375的#INT為高!

下面是執(zhí)行USB事務(wù)子程序,請(qǐng)問 endp_and_pid 一般設(shè)置為多少?! 大蝦指點(diǎn)啊!

unsigned char issue_token( unsigned char endp_and_pid ) /* 執(zhí)行USB事務(wù) */ { unsigned char status;

/* 執(zhí)行完成后, 將產(chǎn)生中斷通知單片機(jī), 如果是USB_INT_SUCCESS就說明操作成功 */ xWriteCH375Cmd( CMD_ISSUE_TOKEN ); xWriteCH375Data( endp_and_pid ); /* 高4位目的端點(diǎn)號(hào), 低4位令牌PID */

status = wait_interrupt(); /* 等待CH375操作完成 */ return( status ); }

如果是我們的372設(shè)備的話,那么endp_and_addr應(yīng)該為0X82或者0X02(批量端點(diǎn)上傳和下傳)


我的程序中 #define DEF_USB_PID_IN 0x09 #define DEF_USB_PID_OUT 0x01 endp_and_pid=endp_in_addr << 4 ) | DEF_USB_PID_IN 那endp_and_pid怎么也不能為0X82或者0X02

設(shè)備初始化程序: unsigned char init_USB_device(void) { unsigned char address; unsigned char status; unsigned char length;

status = get_descr(1); /* 獲取設(shè)備描述符 */ if( status == USB_INT_SUCCESS ) { length = rd_usb_data( RECV_BUFFER ); /* 將獲取的描述符數(shù)據(jù)從CH375中讀出到單片機(jī)的RAM緩沖區(qū)中,返回描述符長(zhǎng)度 */ if( length<18 || p_dev_descr->bDescriptorType!=1 ) return( UNKNOWN_USB_DEVICE ); /* 意外錯(cuò)誤:描述符長(zhǎng)度錯(cuò)誤或者類型錯(cuò)誤 */

// if( p_dev_descr->bDeviceClass!=0 ) // return( UNKNOWN_USB_DEVICE ); /* 連接的USB設(shè)備不符合USB規(guī)范 */

status = set_addr(2); /* 設(shè)置USB設(shè)備的USB地址 */ if( status == USB_INT_SUCCESS ) { status = get_descr(2); /* 獲取配置描述符 */ if( status == USB_INT_SUCCESS ) /* 操作成功則讀出描述符并分析 */ { length = rd_usb_data( RECV_BUFFER ); /* 將獲取的描述符數(shù)據(jù)從CH375中讀出到單片機(jī)的RAM緩沖區(qū)中,返回描述符長(zhǎng)度 */ // if( p_cfg_descr->itf_descr.bInterfaceClass!=7 || p_cfg_descr->itf_descr.bInterfaceSubClass!=1 ) // return( UNKNOWN_USB_DEVICE ); /* 不符合USB規(guī)范 */

endp_out_addr=endp_in_addr=0; address = p_cfg_descr->endp_descr[0].bEndpointAddress; /* 第一個(gè)端點(diǎn)的地址 */ if( address&0x80 ) endp_in_addr = address&0x0f; /* IN端點(diǎn)的地址 */ else { /* OUT端點(diǎn) */ endp_out_addr = address&0x0f; endp_out_size = p_cfg_descr->endp_descr[0].wMaxPacketSize; /* 數(shù)據(jù)接收端點(diǎn)的最大包長(zhǎng)度 */ if( endp_out_size == 0 || endp_out_size > 64 ) endp_out_size = 64; } if( p_cfg_descr->itf_descr.bNumEndpoints>=2 ) /* 接口有兩個(gè)以上的端點(diǎn) */ { if( p_cfg_descr->endp_descr[1].bDescriptorType==5 ) /* 端點(diǎn)描述符 */ { address = p_cfg_descr->endp_descr[1].bEndpointAddress; /* 第二個(gè)端點(diǎn)的地址 */ if( address&0x80 ) endp_in_addr = address&0x0f; /* IN端點(diǎn) */ else { /* OUT端點(diǎn) */ endp_out_addr = address&0x0f; endp_out_size = p_cfg_descr->endp_descr[1].wMaxPacketSize; if( endp_out_size == 0 || endp_out_size > 64 ) endp_out_size = 64; } } } if( p_cfg_descr->itf_descr.bInterfaceProtocol==1 ) endp_in_addr=0; /* 單向接口不需要IN端點(diǎn) */

if( endp_out_addr==0 ) return( UNKNOWN_USB_DEVICE ); /* 不符合USB規(guī)范 */

status = set_config( p_cfg_descr->cfg_descr.bConfigurationvalue ); /* 加載USB配置值 */ if( status == USB_INT_SUCCESS ) { /* 如果單片機(jī)在USB設(shè)備忙時(shí)并無事可做,建議設(shè)置位7為1,使CH375在收到NAK時(shí)自動(dòng)重試直到操作成功或者失敗 */ /* 如果希望單片機(jī)在USB設(shè)備忙時(shí)能夠做其它事,那么應(yīng)該設(shè)置位7為0,使CH375在收到NAK時(shí)不重試, 所以在下面的USB通訊過程中,如果USB設(shè)備正忙,issue_token等子程序?qū)⒌玫綘顟B(tài)碼USB_INT_RET_NAK */ xWriteCH375Cmd( CMD_SET_RETRY ); // 設(shè)置USB事務(wù)操作的重試次數(shù) xWriteCH375Data( 0x25 ); xWriteCH375Data( 0x85 ); // 位7為1則收到NAK時(shí)無限重試, 位3~位0為超時(shí)后的重試次數(shù)

} } } }


我們不是有提供375操作372的例子程序嗎?你按照那個(gè)例子就可以實(shí)現(xiàn)375對(duì)372的操作了。按照上面發(fā)送令牌命令的數(shù)據(jù)來說,高四位為端點(diǎn)號(hào),低四位為你發(fā)送的令牌包,也就是上面定義的#define DEF_USB_PID_IN 0x09 #define DEF_USB_PID_OUT 0x01,這樣才可以正常的操作,否則會(huì)出現(xiàn)問題的,往下面發(fā)送數(shù)據(jù),寫進(jìn)去的數(shù)據(jù)就是端點(diǎn)號(hào)加上0X01,從設(shè)備讀取數(shù)據(jù)的話就是端點(diǎn)號(hào)加上0X09就可以了。


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

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