你好,ch375評估板打印機(jī)初始化疑問

unsigned char wait_interrupt() { /* 主機(jī)端等待操作完成, 返回操作狀態(tài) */ unsigned short i;

// while( CH375_INT_WIRE ); /* 查詢等待CH375操作完成中斷(INT#低電平) */ for ( i = 0; CH375_INT_WIRE != 0; i ++ ) { /* 如果CH375的中斷引腳輸出高電平則等待,通過計(jì)數(shù)防止超時(shí) */ delay1us(); if ( i == 0xF000 ) CH375_WR_CMD_PORT( CMD_ABORT_NAK ); /* 如果超時(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() ); } 這個(gè)是打印機(jī)的初始化代碼,我這里看不出連接的是打印機(jī)設(shè)備啊,如果換作是其他的usb設(shè)備呢?請問host是怎么識別設(shè)備的呢,新學(xué)者疑惑,謝謝。。

上面是等中斷的程序,打印機(jī)初始化代碼如下: unsigned char init_print() { /* 初始化USB打印機(jī),完成打印機(jī)枚舉 */ #define p_dev_descr ((PUSB_DEV_DESCR)buffer) #define p_cfg_descr ((PUSB_CFG_DESCR_LONG)buffer) unsigned char status, len, c; status=get_descr(1); /* 獲取設(shè)備描述符 */ if ( status==USB_INT_SUCCESS ) { len=rd_usb_data( buffer ); /* 將獲取的描述符數(shù)據(jù)從CH375中讀出到單片機(jī)的RAM緩沖區(qū)中,返回描述符長度 */ if ( len<18 || p_dev_descr->bDescriptorType!=1 ) return( UNKNOWN_USB_DEVICE ); /* 意外錯(cuò)誤:描述符長度錯(cuò)誤或者類型錯(cuò)誤 */ if ( p_dev_descr->bDeviceClass!=0 ) return( UNKNOWN_USB_DEVICE ); /* 連接的USB設(shè)備不是USB打印機(jī),或者不符合USB規(guī)范 */ status=set_addr(3); /* 設(shè)置打印機(jī)的USB地址 */ if ( status==USB_INT_SUCCESS ) { status=get_descr(2); /* 獲取配置描述符 */ if ( status==USB_INT_SUCCESS ) { /* 操作成功則讀出描述符并分析 */ len=rd_usb_data( buffer ); /* 將獲取的描述符數(shù)據(jù)從CH375中讀出到單片機(jī)的RAM緩沖區(qū)中,返回描述符長度 */ if ( p_cfg_descr->itf_descr.bInterfaceClass!=7 || p_cfg_descr->itf_descr.bInterfaceSubClass!=1 ) return( UNKNOWN_USB_PRINT ); /* 不是USB打印機(jī)或者不符合USB規(guī)范 */ endp_out_addr=endp_in_addr=0; c=p_cfg_descr->endp_descr[0].bEndpointAddress; /* 第一個(gè)端點(diǎn)的地址 */ if ( c&0x80 ) endp_in_addr=c&0x0f; /* IN端點(diǎn)的地址 */ else { /* OUT端點(diǎn) */ endp_out_addr=c&0x0f; endp_out_size=p_cfg_descr->endp_descr[0].wMaxPacketSize; /* 數(shù)據(jù)接收端點(diǎn)的最大包長度 */ } if ( p_cfg_descr->itf_descr.bNumEndpoints>=2 ) { /* 接口有兩個(gè)以上的端點(diǎn) */ if ( p_cfg_descr->endp_descr[1].bDescriptorType==5 ) { /* 端點(diǎn)描述符 */ c=p_cfg_descr->endp_descr[1].bEndpointAddress; /* 第二個(gè)端點(diǎn)的地址 */ if ( c&0x80 ) endp_in_addr=c&0x0f; /* IN端點(diǎn) */ else { /* OUT端點(diǎn) */ endp_out_addr=c&0x0f; endp_out_size=p_cfg_descr->endp_descr[1].wMaxPacketSize; } } } if ( p_cfg_descr->itf_descr.bInterfaceProtocol<=1 ) endp_in_addr=0; /* 單向接口不需要IN端點(diǎn) */ if ( endp_out_addr==0 ) return( UNKNOWN_USB_PRINT ); /* 不是USB打印機(jī)或者不符合USB規(guī)范 */ status=set_config( p_cfg_descr->cfg_descr.bConfigurationValue ); /* 加載USB配置值 */ if ( status==USB_INT_SUCCESS ) { CH375_WR_CMD_PORT( CMD_SET_RETRY ); /* 設(shè)置USB事務(wù)操作的重試次數(shù) */ CH375_WR_DAT_PORT( 0x25 ); CH375_WR_DAT_PORT( 0x89 ); /* 位7為1則收到NAK時(shí)無限重試, 位3~位0為超時(shí)后的重試次數(shù) */ /* 如果單片機(jī)在打印機(jī)忙時(shí)并無事可做,建議設(shè)置位7為1,使CH375在收到NAK時(shí)自動(dòng)重試直到操作成功或者失敗 */ /* 如果希望單片機(jī)在打印機(jī)忙時(shí)能夠做其它事,那么應(yīng)該設(shè)置位7為0,使CH375在收到NAK時(shí)不重試, 所以在下面的USB通訊過程中,如果USB打印機(jī)正忙,issue_token等子程序?qū)⒌玫綘顟B(tài)碼USB_INT_RET_NAK */ } } } } return(status); } 主機(jī)枚舉設(shè)備的過程你可以參考USB協(xié)議.


這個(gè)我有看到,但是如果我連的不是打印機(jī),而是其他設(shè)備,運(yùn)行到那個(gè)等中斷的地方就停住了,我就想知道,再枚舉打印機(jī)之前,host是不是已經(jīng)知道打印機(jī)的什么信息?如果我要操作其他的設(shè)備,區(qū)別在哪里呢?


不同的設(shè)備描述符是不一樣的,需要主機(jī)來判斷。比如說接口使用的類bInterfaceClass,HID是0x03,打印機(jī)是0x07,U盤是0x08。USB枚舉的過程就是識別該設(shè)備是什么設(shè)備,獲取設(shè)備信息的過程。


嗯 ,我明白了,等中斷那地方還是有點(diǎn)不明白,例子上說等待int#變低電平,它是怎么判斷的呢?假如我接的是其他的設(shè)備,int#也會變低嗎?還是需要什么額外的操作,謝謝。。


你好,能回答一下我這個(gè)問題嗎


如果是檢測設(shè)備連接的話那么任何USB設(shè)備插入之后INT#引腳都會拉低。前提是你要初始化好我我們的芯片即可。


INT#是當(dāng)檢測到USB設(shè)備插拔事件以及執(zhí)行完USB傳輸事務(wù)后,芯片將以中斷方式通知單片機(jī),INT#引腳輸出低電平,直到單片機(jī)清除中斷標(biāo)志才恢復(fù)高電平。這跟你連接什么設(shè)備沒有關(guān)系。


好的,那為什么打印機(jī)這個(gè)例子沒有看到初始化的代碼呢? main() { unsigned char xdata data_to_send[200]; /* 緩沖區(qū) */ unsigned char str_to_print[]="OK, support text print\n"; unsigned char s;

unsigned char flag=100;

mDelaymS( 200 );

// while (flag--) // { // printf("start\n"); // mDelaymS( 1000 ); // } set_usb_mode( 6 ); /* 設(shè)置USB主機(jī)模式 */

while ( wait_interrupt()!=USB_INT_CONNECT ); /* 等待USB打印機(jī)連接上來 */ 這里就直接等中斷了,請問是什么時(shí)候初始化呢,謝謝


我看到讀寫U盤的例子里面有初始化芯片的代碼, i = CH375LibInit( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */ 而在ch375做host的打印機(jī)以及和ch372相連的例子里面卻沒有看到,請問是怎么一回事呢??


在主函數(shù)里while ( wait_interrupt()!=USB_INT_CONNECT ); 等待USB打印機(jī)連接上來以后執(zhí)行初始化if ( init_print()!=USB_INT_SUCCESS ) while(1); 初始化函數(shù)在1樓。


我的問題是while ( wait_interrupt()!=USB_INT_CONNECT );他是怎么判斷中斷的呢?因?yàn)槲医恿艘粋€(gè)不是打印機(jī)的usb外設(shè),程序就在這里停住了。這個(gè)中斷判斷是硬件判斷還是軟件實(shí)現(xiàn)?能否講明白一點(diǎn)呢?多謝。


你所說的“如果是檢測設(shè)備連接的話那么任何USB設(shè)備插入之后INT#引腳都會拉低。前提是你要初始化好我我們的芯片即可?!背跏蓟酒侵高@個(gè)i = CH375LibInit( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */嗎,但是打印機(jī)例子里面并沒有體現(xiàn)出來,我就是這個(gè)問題。。


在打印機(jī)這個(gè)函數(shù)里初始化我們芯片是指設(shè)置USB工作模式使其工作在主機(jī)模式,至于那個(gè)中斷只要是USB設(shè)備插入都可以檢測出來,#INT拉低,軟件檢測。


哦 ,我明白了,多謝你啊


樓主,你好,關(guān)于這個(gè)問題我還有點(diǎn)疑問,是這樣我試著用ch375做host連接另外一塊單片機(jī)(cy7c38013)來做數(shù)據(jù)傳輸。我是根據(jù)貴公司提供的ch375和ch375相連的例子來改,我調(diào)試的時(shí)候程序運(yùn)行到 while ( wait_interrupt()!=USB_INT_CONNECT ); /* 等待設(shè)備端連接上來 */ 這里就停住了,按照你上面所說,“那個(gè)中斷只要是USB設(shè)備插入都可以檢測出來,#INT拉低,軟件檢測?!?,這里應(yīng)該只要有usb設(shè)備插入都可以通過的,我不知道是什么原因呢,請求解答。


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

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