誰遇到過如此奇特的現(xiàn)象?

CH375A做主機(jī),插SUN鍵盤后,取配置描述符時(shí)總是返超時(shí)(0x20),后來無意中隨便按住了一個(gè)鍵,令我驚訝的是竟可以正確得到配置描述符了,道理真是想不通。大伙有誰碰上過??

接鍵盤或者鼠標(biāo)的話,由于是低速設(shè)備,所以在硬件連線的時(shí)候,要將UD+和375的UD-相接,UD-和UD+相連接,同時(shí)在設(shè)置好模式之后,要將375的主頻降到1。5M才可以正常的工作,否則是無法工作的


我的硬件除了上面提到的這個(gè)鍵盤有上述現(xiàn)象外,接其他鍵盤和鼠標(biāo)目前為止都能正常工作。


那你接到計(jì)算機(jī)上面去,你用BUSHOUNG這個(gè)軟件來看下計(jì)算機(jī)是怎么操作這個(gè)設(shè)備的,個(gè)別的低速設(shè)備是用單片機(jī)模擬出來的,并不是真正意義上面的符合USB的HID的類規(guī)范,導(dǎo)致了375芯片不能操作。


以下是bus hound的枚舉過程,應(yīng)該沒有什么問題,硬件是按上面說的方法接的。 bus Hound 5.00 capture. Complements of www.perisoft.net

Device - Device ID (followed by the endpoint for USB devices) (16) USB 人體學(xué)輸入設(shè)備 (17) HID Keyboard Device Phase - Phase Type CTL USB control transfer DI Data in DO Data out NSTS NT status Data - Hex dump of the data transferred Descr - Description of the phase Cmd... - Position in the captured data

Device Phase Data Description Cmd.Phase.Ofs(rep) ------ ----- ------------------------ ---------------- ------------------ 16.1 DI 00 00 00 00 07 00 00 00 ........ 1.1.0 16.1 NSTS 20 01 00 c0 cancelled 1.2.0 16.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR 2.1.0 16.0 DI 12 01 10 01 00 00 00 08 ........ 2.2.0 30 04 05 00 00 02 00 00 0....... 2.2.8 00 01 .. 2.2.16 16.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR 3.1.0 16.0 DI 09 02 22 00 01 01 00 a0 .."..... 3.2.0 32 2 3.2.8 16.0 CTL 80 06 00 02 00 00 22 00 GET DESCRIPTOR 4.1.0 16.0 DI 09 02 22 00 01 01 00 a0 .."..... 4.2.0 32 09 04 00 00 01 03 01 2....... 4.2.8 01 00 09 21 00 01 21 01 ...!..!. 4.2.16 22 40 00 07 05 81 03 08 "@...... 4.2.24 16.0 CTL 00 09 01 00 00 00 00 00 SET CONFIG 5.1.0 16.0 CTL 21 0a 00 00 00 00 00 00 SET IDLE 6.1.0 16.0 CTL 81 06 00 22 00 00 80 00 GET DESCRIPTOR 7.1.0 16.0 DI 05 01 09 06 a1 01 05 07 ........ 7.2.0 19 e0 29 e7 15 00 25 01 ..)...%. 7.2.8 75 01 95 08 81 02 95 01 u....... 7.2.16 75 08 81 01 95 05 75 01 u.....u. 7.2.24 16.1 DI 00 00 00 00 00 00 00 00 ........ 8.1.0 16.0 CTL 21 09 00 02 00 00 01 00 SET REPORT 9.1.0 16.0 DO 01 . 9.2.0 17 DO 00 01 .. 10.1.0


如果是用單片機(jī)模擬USB,那么對它是否設(shè)置地址是無所謂的(是否可以這樣理解?)。 接此鍵盤時(shí),還有一個(gè)現(xiàn)象:如果不對它進(jìn)行設(shè)置地址操作,是可以正確得到配置描述符的;否則,無論地址是什么,甚至是地址0,設(shè)備均返回超時(shí)(0x20).


描述符應(yīng)該是正常的,按USB規(guī)定設(shè)置地址之后要有2ms的恢復(fù)時(shí)間,有些設(shè)備可能更長,你將設(shè)置地址之后的延時(shí)加長看看。


謝謝luoye268268,我試過了,沒有成功。 不過我找了一個(gè)折衷的辦法,就是不設(shè)置地址,任何設(shè)備都工作于默認(rèn)地址0。放心,應(yīng)用上ch375每個(gè)時(shí)刻只會接一個(gè)設(shè)備,不會產(chǎn)生地址上的沖突。


這樣是不可以的,因?yàn)樵谀悴辉O(shè)置地址的話,配置描述符是可以獲取到的,但是到后面的設(shè)置配置之類的操作就會出現(xiàn)問題,這個(gè)問題應(yīng)該是你的設(shè)置地址的命令沒有發(fā)送成功。


請幫忙分析下下面程序的時(shí)序是否符合要求,此方法我就沒有成功。硬件環(huán)境:at89c52+12.000晶振 GET_DEVICE_DESC: MOV A,#SET_ENDP7 MOV DPTR,#USB1_CMD_ADDR NOP MOVX @DPTR,A NOP NOP MOV A,#80H MOV DPTR,#USB1_DAT_ADDR NOP MOVX @DPTR,A ;設(shè)置主機(jī)端點(diǎn)的同步觸發(fā)標(biāo)志為0,發(fā)送data0 NOP NOP MOV A,#WR_USB_DATA7 MOV DPTR,#USB1_CMD_ADDR NOP MOVX @DPTR,A NOP NOP MOV A,#08H ;8個(gè)數(shù)據(jù) MOV DPTR,#USB1_DAT_ADDR NOP MOVX @DPTR,A NOP NOP MOV A,#80H NOP MOVX @DPTR,A ;80H MOV A,#06H NOP MOVX @DPTR,A ;06H MOV A,#00H NOP MOVX @DPTR,A ;00H MOV A,#01H NOP MOVX @DPTR,A ;01H MOV A,#00H NOP MOVX @DPTR,A ;00H NOP NOP MOVX @DPTR,A ;00H MOV A,#12H NOP MOVX @DPTR,A ;12H MOV A,#00H NOP MOVX @DPTR,A ;00H NOP NOP MOV A,#ISSUE_TOKEN MOV DPTR,#USB1_CMD_ADDR NOP MOVX @DPTR,A NOP NOP MOV A,#0DH MOV DPTR,#USB1_DAT_ADDR NOP MOVX @DPTR,A ;發(fā)送setup令牌包 NOP NOP ret


這是全部的程序,有助于理解。 INTO1 BIT P3.3 CS1 BIT P1.3

;52 STACK EQU 6FH USB1_CFG_VALUE EQU 6EH ;臨時(shí)變量 CONT1 EQU 08H CONT2 EQU 09H CONT3 EQU 0AH ; T2CON EQU 0C8H TL2 EQU 0CCH TH2 EQU 0CDH RCAP2L EQU 0CAH RCAP2H EQU 0CBH ;USB變量 SET_SYS_FRQE SET 04H RESET_ALL SET 05H CHECK_EXIST SET 06H SET_RETRY SET 0BH DELAY_100US SET 0FH SET_USB_ADDR SET 13H SET_USB_MODE SET 15H TEST_CONNECT SET 16H ABORT_NAK SET 17H SET_ENDP6 SET 1CH SET_ENDP7 SET 1DH ; GET_STATUS SET 22H RD_USB_DATA0 SET 27H RD_USB_DATA SET 28H WR_USB_DATA7 SET 2BH ; CLR_STALL SET 41H SET_ADDRESS SET 45H GET_DESCR SET 46H SET_CONFIG SET 49H AUTO_SETUP SET 4DH ISSUE_TKN_X SET 4EH ISSUE_TOKEN SET 4FH ; USB_INT_SUCCESS SET 14H USB_INT_CONNECT SET 15H USB_INT_DISCONNECT SET 16H CMD_RET_SUCCESS SET 51H CMD_RET_ABORT SET 5FH ; USB1_CMD_ADDR SET 0FF00H USB1_DAT_ADDR SET 0FD00H USB2_CMD_ADDR SET 4100H USB2_DAT_ADDR SET 0100H ; DMABUFFERLEN EQU 80h

ORG 0000H AJMP START ORG 0003H LJMP ERROR ORG 000BH LJMP ERROR ORG 0013H LJMP ERROR ORG 001BH LJMP ERROR ORG 0023H LJMP ERROR ORG 002BH LJMP ERROR ; ERROR: RETI

START: LCALL DELAY_40MS LCALL DELAY_40MS LCALL DELAY_40MS LCALL DELAY_40MS LCALL DELAY_40MS LCALL DELAY_40MS MOV SP,#STACK CLR EA ;禁止所有中斷 LCALL INIT_UART START1: CLR CS1 MOV A,#RESET_ALL MOV DPTR,#USB1_CMD_ADDR NOP MOVX @DPTR,A ;RESET CH375A(HARD RESET) LCALL DELAY_40MS LCALL DELAY_40MS MOV A,#06H MOV DPTR,#USB1_CMD_ADDR NOP MOVX @DPTR,A ;CHECK EXIST NOP NOP MOV A,#55H MOV DPTR,#USB1_DAT_ADDR MOVX @DPTR,A NOP NOP NOP MOVX A,@DPTR ;DATA LCALL UART_SEND ;AAH CJNE A,#0AAH,START1 ;CH375A ;==================ch375a工作正常========================== MOV A,#SET_USB_MODE MOV DPTR,#USB1_CMD_ADDR ;設(shè)置ch375的工作模式 NOP MOVX @DPTR,A NOP NOP NOP MOV A,#06H ;已啟用的USB主機(jī)模式 06H MOV DPTR,#USB1_DAT_ADDR NOP MOVX @DPTR,A MOV P0,#0FFH START2: MOV A,#14H LCALL DELAY_A ;延時(shí)20us等待ch375a完成設(shè)置模式命令 MOV DPTR,#USB1_DAT_ADDR NOP MOVX A,@DPTR LCALL UART_SEND ;51H, ;==========以上設(shè)置USB1為主機(jī)模式=============== MOV A,#SET_RETRY ;設(shè)置重試次數(shù) MOV DPTR,#USB1_CMD_ADDR NOP MOVX @DPTR,A NOP NOP MOV A,#25H MOV DPTR,#USB1_DAT_ADDR NOP MOVX @DPTR,A nop nop nop MOV A,#0BFH MOV DPTR,#USB1_DAT_ADDR NOP MOVX @DPTR,A NOP NOP NOP MOV A,#SET_SYS_FRQE ;設(shè)置系統(tǒng)時(shí)鐘 MOV DPTR,#USB1_CMD_ADDR NOP MOVX @DPTR,A nop nop nop MOV A,#01H ;系統(tǒng)工作頻率1.5MHz MOV DPTR,#USB1_DAT_ADDR NOP MOVX @DPTR,A TASK_LOOP: LCALL DELAY_5MS LCALL DELAY_5MS MOV C,INTO1 ;等待設(shè)備插入 JC TASK_LOOP LCALL GET_INT_STAT1 LCALL UART_SEND ;15H OR 16H CJNE A,#USB_INT_CONNECT,TASK_LOOP1 LCALL DELAY_40MS LCALL DELAY_40MS LCALL DELAY_40MS LCALL DELAY_40MS LCALL DELAY_40MS LCALL DELAY_40MS LCALL DELAY_40MS LCALL DELAY_40MS JMP TASK_LOOP2 TASK_LOOP1: CJNE A,#USB_INT_DISCONNECT,TASK_LOOP3 JMP TASK_LOOP TASK_LOOP2: LCALL EMU_DEV JNZ TASK_LOOP ;A=0 枚舉出錯(cuò);A=FF 枚舉成功 JMP START1 TASK_LOOP3: JMP START1 ;========================================================================= ; ; 設(shè)備枚舉子程序 ; ;========================================================================== EMU_DEV: MOV A,#SET_USB_MODE MOV DPTR,#USB1_CMD_ADDR ;復(fù)位USB總線 NOP MOVX @DPTR,A nop nop nop MOV A,#07H ;MODE 07 MOV DPTR,#USB1_DAT_ADDR NOP MOVX @DPTR,A MOV R1,#40H ;將復(fù)位信號保持10ms EMU_1: MOV A,#0F0H LCALL DELAY_A DJNZ R1,EMU_1 NOP MOV A,#SET_USB_MODE ;再把模式設(shè)回06H MOV DPTR,#USB1_CMD_ADDR NOP MOVX @DPTR,A nop nop nop MOV A,#06H ;MODE 06 MOV DPTR,#USB1_DAT_ADDR NOP MOVX @DPTR,A ; MOV R1,#50 EMU_DEV1: MOV A,#22H LCALL UART_SEND DJNZ R1,EMU_2 JMP EMU_ERROR_RET EMU_2: MOV C,INTO1 JC EMU_DEV1 LCALL GET_INT_STAT1 LCALL UART_SEND ;15H,等待復(fù)位后設(shè)備再次連接上來 CJNE A,#USB_INT_CONNECT,EMU_3 LCALL DELAY_40MS LCALL DELAY_40MS LCALL DELAY_40MS LCALL DELAY_40MS LCALL DELAY_40MS LCALL DELAY_40MS JMP GET_DEVICE_DESC EMU_3: JMP EMU_ERROR_RET ;=================USB設(shè)備已經(jīng)正確連接================= GET_DEVICE_DESC: MOV A,#SET_ENDP7 MOV DPTR,#USB1_CMD_ADDR NOP MOVX @DPTR,A NOP NOP MOV A,#80H MOV DPTR,#USB1_DAT_ADDR NOP MOVX @DPTR,A ;設(shè)置主機(jī)端點(diǎn)的同步觸發(fā)標(biāo)志為0,發(fā)送data0 NOP NOP MOV A,#WR_USB_DATA7 MOV DPTR,#USB1_CMD_ADDR NOP MOVX @DPTR,A NOP NOP MOV A,#08H ;8個(gè)數(shù)據(jù) MOV DPTR,#USB1_DAT_ADDR NOP MOVX @DPTR,A NOP NOP MOV A,#80H NOP MOVX @DPTR,A ;80H MOV A,#06H NOP MOVX @DPTR,A ;06H MOV A,#00H NOP MOVX @DPTR,A ;00H MOV A,#01H NOP MOVX @DPTR,A ;01H MOV A,#00H NOP MOVX @DPTR,A ;00H NOP NOP MOVX @DPTR,A ;00H MOV A,#12H NOP MOVX @DPTR,A ;12H MOV A,#00H NOP MOVX @DPTR,A ;00H NOP NOP MOV A,#ISSUE_TOKEN MOV DPTR,#USB1_CMD_ADDR NOP MOVX @DPTR,A NOP NOP MOV A,#0DH MOV DPTR,#USB1_DAT_ADDR NOP MOVX @DPTR,A ;發(fā)送setup令牌包 NOP NOP MOV R1,#50 GET_DEVICE_DESC1: MOV A,#44H LCALL UART_SEND DJNZ R1,GET_DEV_DESCR10 JMP EMU_ERROR_RET GET_DEV_DESCR10: MOV C,INTO1 JC GET_DEVICE_DESC1 LCALL GET_INT_STAT1 LCALL UART_SEND ;14H CJNE A,#USB_INT_SUCCESS,GET_DEVICE_DESC2 JMP GET_DEVICE_DESC4 GET_DEVICE_DESC2: CJNE A,#USB_INT_CONNECT,GET_DEVICE_DESC3 ;15H JMP TASK_LOOP2 GET_DEVICE_DESC3: CJNE A,#USB_INT_DISCONNECT,GET_DEVICE_DESC31 ;16H GET_DEVICE_DESC31: JMP EMU_ERROR_RET ;復(fù)位設(shè)備 GET_DEVICE_DESC4: MOV R0,#DMABUFFERLEN MOV A,#RD_USB_DATA MOV DPTR,#USB1_CMD_ADDR NOP MOVX @DPTR,A MOV A,#06H LCALL DELAY_A MOV DPTR,#USB1_DAT_ADDR NOP MOVX A,@DPTR ;讀出數(shù)據(jù)個(gè)數(shù) MOV CONT1,A MOV @R0,A GET_DEVICE_DESC5: NOP NOP MOVX A,@DPTR ;讀描述符 INC R0 MOV @R0,A ;讀出設(shè)備返回的設(shè)備描述符并保存 DJNZ CONT1,GET_DEVICE_DESC5 ;==============把緩存中的設(shè)備描述符通過串口發(fā)送========================== MOV R0,#DMABUFFERLEN MOV A,@R0 MOV CONT1,A GET_DEVICE_DESC6: INC R0 MOV A,@R0 LCALL UART_SEND DJNZ CONT1,GET_DEVICE_DESC6 ;===============設(shè)備描述符發(fā)送完========================================= MOV R0,#DMABUFFERLEN INC R0 MOV A,@R0 CJNE A,#12H,GET_DEVICE_DESC7 JMP GET_DEVICE_DESC8 GET_DEVICE_DESC7: JMP EMU_ERROR_RET GET_DEVICE_DESC8: INC R0 MOV A,@R0 CJNE A,#01H,GET_DEVICE_DESC9 JMP GET_DEVICE_DESC10 GET_DEVICE_DESC9: JMP EMU_ERROR_RET GET_DEVICE_DESC10: MOV A,R0 ADD A,#06H MOV R0,A MOV A,@R0 CJNE A,#08H,GET_DEVICE_DESC11 JMP GET_DEVICE_DESC12 GET_DEVICE_DESC11: JMP EMU_ERROR_RET GET_DEVICE_DESC12: MOV A,R0 ADD A,#0AH MOV R0,A MOV A,@R0 MOV USB1_CFG_VALUE,A JMP EMU_OK_RET EMU_ERROR_RET: MOV A,#00H RET EMU_OK_RET: MOV A,#0FFH EMU_DEV_EXIT: RET GET_INT_STAT1: MOV A,#GET_STATUS MOV DPTR,#USB1_CMD_ADDR NOP MOVX @DPTR,A nop nop nop MOV DPTR,#USB1_DAT_ADDR NOP MOVX A,@DPTR RET INIT_UART: mov TL2,#0D9H ;9600,12.000MHz MOV TH2,#0FFH MOV RCAP2L,#0D9H MOV RCAP2H,#0FFH MOV T2CON,#34H MOV PCON,#00H MOV SCON,#50H

; MOV TL1,#0FDH ;9600,11.059MHz ; MOV TH1,#0FDH ; MOV TMOD,#20H ; MOV PCON,#00H ; MOV SCON,#50H SETB TR1

RET UART_SEND: CLR TI MOV SBUF,A JNB TI,$ CLR TI RET

DELAY_5MS: MOV CONT2,#0AH DELAY_5s_2: MOV CONT3,#0F0H DELAY_5s_1: DJNZ CONT3,DELAY_5s_1 DJNZ CONT2,DELAY_5s_2 RET DELAY_40ms: MOV CONT2,#50H DELAY_40ms_2: MOV CONT3,#0F0H DELAY_40ms_1: DJNZ CONT3,DELAY_40ms_1 DJNZ CONT2,DELAY_40ms_2 RET DELAY_A: MOV CONT1,A DELAY_A_1: DJNZ CONT1,DELAY_


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

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