我用ch375作主機(jī),連接鍵盤鼠標(biāo)之類的低速設(shè)備,設(shè)置設(shè)備地址后應(yīng)該是得到設(shè)備的配置描述符,此時(shí)有的設(shè)備可以得到,有的卻總是超時(shí),請(qǐng)問(wèn)這可能是哪的原因???
CH375做主機(jī)操作低速設(shè)備時(shí),應(yīng)該將D+,D_調(diào)換過(guò)來(lái),并且在程序開始將主頻從12MHZ降到1.5MHZ。 下面是降主頻程序:
void set_freq(unsigned char freq) // 其中freq取1 { CH375_WR_CMD_PORT( CMD_SET_SYS_FREQ ); CH375_WR_DAT_PORT( freq ); delayms(10); }
set_freq(0x01); //work in 1.5M
上面的工作我都做過(guò)了。 另,如果我把設(shè)置地址那一段程序隱掉,就可以正確的得到設(shè)備描述符和配置描述符;如果不隱,得到設(shè)備描述符和設(shè)置地址所有的設(shè)備可以完成;而得到配置描述符只有一部分設(shè)備行,另一部分總是提示超時(shí)。在得到配置描述符的程序中,我曾在查詢中斷狀態(tài)之前延時(shí)200ms以上,可仍然沒(méi)有效果。
再問(wèn)一句,降頻程序必須在程序的開始嗎? 我是在設(shè)置完ch375的工作模式之后,檢測(cè)設(shè)備插入之前降頻,這樣應(yīng)該沒(méi)有問(wèn)題吧??
降頻放在設(shè)置完ch375的工作模式之后,檢測(cè)設(shè)備插入之前。 枚舉配置大體過(guò)程是: 檢測(cè)到設(shè)備之后,延時(shí)等待穩(wěn)定,獲取設(shè)備描述符,設(shè)置地址,獲取配置描述符,根據(jù)配置描述符中的值設(shè)置配置。
應(yīng)該在設(shè)置模式之后,檢測(cè)設(shè)備連接之前來(lái)降主頻
USB規(guī)范要求,設(shè)置地址后必須至少延時(shí)2mS才能發(fā)出下一個(gè)操作
請(qǐng)問(wèn): 針對(duì)CH375A,是在SET_ADDRESS命令之后延時(shí)2MS,還是完成了SET_ADDRESS和SET_USB_ADDR兩個(gè)命令之后延時(shí)2MS呢? 再請(qǐng)教一個(gè)問(wèn)題,在設(shè)備枚舉階段,是不是不用考慮DATA0和DATA1呢。我沒(méi)有考慮,因?yàn)槲以谫F公司提供的源程序中沒(méi)有發(fā)現(xiàn)在設(shè)備枚舉階段考慮了DATA0和data1
在SET_USB_ADDR之后延時(shí)2mS,在設(shè)備端, CH375可以自動(dòng)切換;但在主機(jī)端, 必須由SET_ENDP6和SET_ENDP7命令控制CH375切換DATA0與DATA1.,主機(jī)成功發(fā)送后就要切換DATA0/DATA1實(shí)現(xiàn)數(shù)據(jù)同步.
可是,我是在向ch375發(fā)一系列的命令,還需要數(shù)據(jù)同步嗎?好像不需要吧。
另,如果我不設(shè)置設(shè)備的地址,用默認(rèn)的設(shè)備地址0去請(qǐng)求設(shè)備描述符和配置描述符,不考慮數(shù)據(jù)同步,則手中所有的設(shè)備也都能正常工作啊。
我現(xiàn)在遇到的困難是用非0的設(shè)備地址去請(qǐng)求配置描述符時(shí),有些設(shè)備(不是全部)沒(méi)有反應(yīng)(ch375返回超時(shí)),請(qǐng)問(wèn)這可能是我的程序哪里的問(wèn)題???
實(shí)際上是我們375芯片內(nèi)置了一些固件程序在里面,例如獲取設(shè)備描述符,獲取配置描述符,設(shè)置地址以及設(shè)置配置等等,只要用到這些功能的時(shí)候,只需要發(fā)送一個(gè)命令過(guò)去,375就實(shí)現(xiàn)了你需要的功能,但是,對(duì)于沒(méi)有固件的一些類請(qǐng)求,就需要按照USB協(xié)議來(lái)操作375,也就是你說(shuō)的可能需要數(shù)據(jù)同步,還有發(fā)送令牌包等等。 如果有一些設(shè)備可以獲取描述符,而另一些設(shè)備不能獲取描述符的話,那你需要查下你的硬件上面會(huì)不會(huì)供電不足,還有就是對(duì)于375操作低速設(shè)備是不允許插入全速設(shè)備的,這樣也會(huì)出現(xiàn)獲取不到描述符的。
我確信我手頭上所有的設(shè)備都是低速設(shè)備,原因有二: 1 我手頭所有的設(shè)備目前都可以正確得到“設(shè)備描述符”。 2 我手頭所有的設(shè)備如果去掉“設(shè)置地址”這一段程序,用默認(rèn)地址通信,也都可以正確得到“設(shè)備描述符”和“配置描述符”。 我會(huì)考慮供電不足的情況,不過(guò)我強(qiáng)烈懷疑是我的程序時(shí)序不好,所以請(qǐng)你告訴我,考慮時(shí)序,應(yīng)該考慮哪些方面,最好能給個(gè)典型值。比如命令與數(shù)據(jù)之間,手冊(cè)上說(shuō)是2微秒到100微秒,我程序上的延時(shí)是2微秒,比你們的典型值差多少呢?
如果是時(shí)序問(wèn)題的話,那么你可以將你的三個(gè)讀寫子函數(shù)帖出來(lái)看下,我可以幫你修改下
這是我的設(shè)備枚舉子程序。我在主程序中檢測(cè)到設(shè)備插入,就會(huì)調(diào)用此程序。第一次編程,感覺(jué)寫的很亂,但又想不出好的辦法 EMU_DEV: MOV A,#SET_USB_MODE MOV DPTR,#USB1_CMD_ADDR ;復(fù)位USB總線 MOVX @DPTR,A LCALL DELAY_50US MOV A,#07H ;MODE 07 MOV DPTR,#USB1_DAT_ADDR MOVX @DPTR,A LCALL DELAY_50US MOV R1,#28H ;將復(fù)位信號(hào)保持10ms EMU_1: MOV A,#0FAH LCALL DELAY_A DJNZ R1,EMU_1
MOV A,#SET_USB_MODE ;再把模式設(shè)回06H MOV DPTR,#USB1_CMD_ADDR MOVX @DPTR,A LCALL DELAY_50US MOV A,#06H ;MODE 06 MOV DPTR,#USB1_DAT_ADDR MOVX @DPTR,A MOV A,#14H LCALL DELAY_A ;========以下是極其重要的一段延時(shí)===================== ;每隔40ms檢測(cè)一次ch375的中斷,共檢測(cè)50次,. ;若200ms內(nèi)沒(méi)有檢測(cè)到中斷,說(shuō)明設(shè)備出錯(cuò), MOV R1,#50 EMU_DEV1: LCALL DELAY_40MS DJNZ R1,EMU_2 JMP EMU_ERROR_RET EMU_2: MOV C,INTO1 JC EMU_DEV1 LCALL GET_INT_STAT1 LCALL UART_SEND GET_CONFIG_DESC4: MOV R0,#DMABUFFERLEN MOV A,#RD_USB_DATA NOP MOVX A,@DPTR ;讀描述符 INC R0
我后來(lái)把set_usb1_addr那段程序移到了 get_device_descr程序的前面,又通過(guò)了一個(gè)鼠標(biāo)?,F(xiàn)在只剩下一個(gè)sun的USB鍵盤不行了。但有一個(gè)現(xiàn)象:我若保留set_usb1_addr這段程序,無(wú)論地址值設(shè)成多少(包括0地址),get_device_desc和get_config_desc都不能完成。若隱掉set_usb1_addr這段程序,get_device_desc和get_config_desc都能完成。(SUN公司的東西向來(lái)與眾不同,我拆了sun的鍵盤,它用的是moto的sc513726fb芯片,但網(wǎng)上找不到它的手冊(cè))
不會(huì)這樣吧,按照USB協(xié)議來(lái)說(shuō),設(shè)置地址是必要操作,只有不設(shè)置地址才會(huì)出現(xiàn)獲取配置描述符獲取不到的現(xiàn)象啊