請(qǐng)問(wèn),我發(fā)了ISSUE_TOKEN令牌,為什么沒有回應(yīng)啊,沒有中斷,是什么原因呢?? 我給u盤發(fā)了修改地址的命令,然后讀出來(lái)的u盤描述符的端口地址不變,是不是不能修改那個(gè)地址啊。SET_USB_ADDR和SET_ADDRESS,有人這樣用過(guò)嗎? 謝謝
操作USB設(shè)備枚舉設(shè)備的過(guò)程實(shí)際上是這個(gè)樣子的,首先獲取設(shè)備描述符,在獲取到之后在設(shè)置設(shè)備地址,接下來(lái)在獲取配置描述符,至于發(fā)送令牌沒有響應(yīng)的話,可能是你的同步?jīng)]有做好,還有就是你發(fā)下去的端點(diǎn)號(hào)是不是你獲取到的端點(diǎn)號(hào),這個(gè)都有可能導(dǎo)致獲取描述符失敗的。
/* 對(duì)目標(biāo)USB設(shè)備執(zhí)行控制傳輸: 設(shè)置USB地址 */ unsigned char mCtrlSetAddress( unsigned char addr ) { unsigned char c; CH375_WR_CMD_PORT( CMD_SET_ADDRESS ); /* 控制傳輸-設(shè)置USB地址 */ CH375_WR_DAT_PORT( addr ); /* 1 - 7eh */ c = mWaitInterrupt( ); /* 等待操作完成 */ if ( c != USB_INT_SUCCESS ) return( c ); /* 操作失敗 */ /* 當(dāng)目標(biāo)USB設(shè)備的地址成功修改后,應(yīng)該同步修改CH375的USB地址,否則CH375將無(wú)法與目標(biāo)設(shè)備通訊 */ CH375_WR_CMD_PORT( CMD_SET_USB_ADDR ); /* 設(shè)置CH375的USB地址 */ CH375_WR_DAT_PORT( addr ); /* 修改CH375的USB設(shè)備能夠立即完成,不會(huì)產(chǎn)生中斷通知 */ return( c ); }
to hcn: 我的操作跟你說(shuō)的一樣,就是先得到設(shè)備描述符,然后設(shè)置地址,設(shè)置就是usbxf兄的這一段,但是后來(lái)我獲取的配置描述符,在配置描述符中看到的端口號(hào)不是我設(shè)置的,比如我吧地址設(shè)置為5,但是我看到的配置符之中的端口地址還是0x01和0x82,這個(gè)地址是不是說(shuō)是u盤固定的,不能改的吧,但是改的地址是哪個(gè)呢??? 怎么看改的那個(gè)是哪個(gè)地址呢??
你可能理解上面有點(diǎn)誤差,我們的設(shè)置地址,實(shí)際是主機(jī)通過(guò)設(shè)備的地址來(lái)區(qū)分不同的設(shè)備,相當(dāng)于是總線上面的設(shè)備的標(biāo)識(shí),地址的范圍為0-127,而你所讀取到的端點(diǎn)描述符中的0X01和0X82實(shí)際上是表示USB設(shè)備和主機(jī)通信的時(shí)候是通過(guò)哪些端點(diǎn)進(jìn)行通信的,而不是設(shè)置設(shè)備地址中的地址,詳細(xì)的介紹你可以參考USB協(xié)議
那個(gè)發(fā)令牌之后沒有中斷,是什么原因呢,我發(fā)下去的就是獲取的端點(diǎn)號(hào),這個(gè)我看了。就是,我的u盤的端點(diǎn)號(hào)。
toggle_recv(); /* 設(shè)置主機(jī)接收的同步標(biāo)志 */ status = issue_token( ( endp_in_addr << 4 ) | DEF_USB_PID_IN );
/* 主機(jī)操作 */ unsigned char issue_token( unsigned char endp_and_pid ) /* 執(zhí)行USB事務(wù) */ { unsigned char status;
/* 執(zhí)行完成后, 將產(chǎn)生中斷通知單片機(jī), 如果是USB_INT_SUCCESS就說(shuō)明操作成功 */ write_ch375_cmd( CMD_ISSUE_TOKEN ); write_ch375_data( endp_and_pid ); /* 高4位目的端點(diǎn)號(hào), 低4位令牌PID */ status = get_interrupt_status(); /* 等待CH375操作完成 */ return( status ); }
void toggle_recv(void) /* 主機(jī)接收成功后,切換DATA0和DATA1實(shí)現(xiàn)數(shù)據(jù)同步 */ { write_ch375_cmd( CMD_SET_ENDP6 ); write_ch375_data( endp6_mode ); endp6_mode^=0x40; delay2us(); }
注:endp6_mode = 0x80
按照USB協(xié)議,對(duì)USB設(shè)備進(jìn)行枚舉,首先是獲取設(shè)備描述符,接下來(lái)是設(shè)置地址,在接下來(lái)就是獲取配置描述符,在獲取完配置描述符之后還需要設(shè)置一下配置,在做完這些之后,對(duì)于一些類設(shè)備,例如U盤,鼠標(biāo),鍵盤等,還有一些類請(qǐng)求,只有在這些類請(qǐng)求完成之后才可以進(jìn)行你下面所說(shuō)的發(fā)送數(shù)據(jù),下面的設(shè)備會(huì)給你返回?cái)?shù)據(jù),至于U盤的操作你可以參考海量存儲(chǔ)的協(xié)議。(一個(gè)簡(jiǎn)單的方法就是將計(jì)算機(jī)操作U盤的步驟記錄下來(lái),然后單片機(jī)按照計(jì)算機(jī)操作U盤的步驟來(lái)操作U盤就可以了,但是在有些操作步驟上面不完全相同)