阅读:1628回复:10
USB地址设置的问题
用D12芯片作的设备,连到计算机后用USBView可以看到设备描述符(18B),但是地址却是缺省的0,在地址设置的函数中打断点也可以停住,也回送了0长度的包了,怎么用USBView看的时候还会是缺省的地址那?
指教!先谢了! |
|
最新喜欢:![]()
|
沙发#
发布于:2002-10-22 22:53
非常抱歉,我不太明白你的意思,也不知道你的目的是什么,你要做什么。能解释的清楚些吗?
|
|
|
板凳#
发布于:2002-10-22 23:10
非常抱歉,我不太明白你的意思,也不知道你的目的是什么,你要做什么。能解释的清楚些吗? 就是设备枚举的时候,可以发现设备但是为Unknown device,用USBView查看的时候可以看到设备描述符(全部18B),但是地址却是缺省的0!我想问我地址设置可能在那里有问题! |
|
|
地板#
发布于:2002-10-23 10:15
设置地址应该可以的,因为在设置地址的地方设置断点,查看地址值可以看到0x02的,但是在片子中全速运行,为什么还是缺省地址就不明白了! :mad: :mad: :mad:
|
|
|
地下室#
发布于:2002-10-23 11:13
你好,现已明白你的意思了,我觉得问题是你并没有完成真正的列举。首先要知道一个列举的过程:
1。插入usb设备; 2。集线器检测到这个设备; 3。主机知道了这个新设备,发送Get_Port_Status; 4。集线器重新设置这个设备,发送Set_Port_Status; 5。集线器在设备和总线之间建立一个信号通路; 6。集线器检测设备速度; 7。主机发送一个Get_Descriptor请求来知道默认流程的最大报的大小。 8。主机分配一个地址。(注意这时才分配地址) 9。主机通过发送Get_Descriptor请求知道了设备的能力。 10。主机分配和载入一个设备驱动。 11。主机的设备驱动选择了一个配置。 注意上面的过程,从3开始主机就已经知道了这个设备,但直到8时才知道地址。所以可能是在这之间出了错误。 |
|
|
5楼#
发布于:2002-10-29 15:50
那单片机在自举过程中又做了什么工作??谢谢!我是一个新手!
|
|
6楼#
发布于:2002-10-29 17:22
CObject我觉得可能是列举过程你的固件没有响应好,我以前也遇到过你的情况,修改了固件就好了
D12列举:connect->interrupt ENP0OUT中处理中断:select endpoint 0,read the buffer,and save the setup packet into ur device\'s buffer,ack endpoint ,clear enpoit,switch(setupPacket.bReques) Case:Get_status Case:Set_feature ??? (主要是GetDescriptor) Case:GetDescriptro { 如果是第一次获取device描述符只返回8个字节,否则 } ???嗯,还是把程序拷处理吧: ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ D12_GetDescriptor: PUSH DPL; PUSH DPH; PUSH A; PUSH B; MOV A,R0 PUSH A; MOV A,R1; PUSH A; MOV A,#D12_SEND; MOV bAct,A;bAct D12状态字节 MOV DPTR,#SETUP_PACK;已收到的setup 包 INC DPTR; INC DPTR; INC DPTR; MOVX A,@DPTR;描述符类型 CJNE A,#01H,D12_GetDesc_Config; ;;;;device descriptor INC DPTR;index lo INC DPTR;index hi INC DPTR;wLength lo ;;;;;;;;;第一次,只送8个字节 MOV A,bGetDesc;bGetDesc存放geet INC A MOV bGetDesc,A; CJNE A,#01H,D12_GetDesc_SetLength; MOV A,#08H; MOVX @DPTR,A; JMP D12_GetDesc_Device; D12_GetDesc_SetLength: MOVX A,@DPTR;wLength MOV B,#12H; CLR C; SUBB A,B;x-12h JC D12_GetDesc_Device;wLength<12h ;;;wLength>=12h MOV A,#12H; MOVX @DPTR,A; D12_GetDesc_Device: ;;;set data address MOV DPTR,#DEVICE_DESC; MOV bDescLO,DPL; MOV bDescHI,DPH; JMP D12_GetDesc_Send; D12_GetDesc_Config: CJNE A,#02H,D12_GetDesc_ERROR ;;;config descriptor INC DPTR; INC DPTR; INC DPTR; MOVX A,@DPTR;wLength MOV B,#2EH; CLR C; SUBB A,B;wLength-2E JC D12_GetDesc_Config1; ;;;wLength>=2Eh MOV A,#2EH; MOVX @DPTR,A; D12_GetDesc_Config1: ;;;set data address MOV DPTR,#CONFIG_DESC; MOV bDescLO,DPL; MOV bDescHI,DPH; D12_GetDesc_Send: ;;; MOV DPTR,#SETUP_PACK MOV A,#06H; CLR C ADD A,DPL MOV DPL,A; MOV A,#00H; ADDC A,DPH; MOV DPH,A;wLength ;;;;;;;;;;;;;;;;; MOVX A,@DPTR; CLR C MOV B,#10H; SUBB A,B; JNC D12_GetDesc_Send1; ;;;wLength<10h; MOVX A,@DPTR MOV B,A;LOOPER MOV A,#00H; D12_GetDesc_Send1: MOVX @DPTR,A; MOV DPTR,#ENP0_1; MOV A,B; MOVX @DPTR,A;SET BUFFER LENGTH INC DPTR; MOV R0,DPL; MOV R1,DPH; D12_GetDesc_Judge: MOV A,B; JNZ D12_GetDesc_Send2; ;;;send over MOV A,#01H;ENP INDEX LCALL D12_WR_BUF; JMP D12_GetDesc_END; D12_GetDesc_Send2: MOV DPL,bDescLO; MOV DPH,bDescHI; MOV A,#00H; MOVC A,@A+DPTR; INC DPTR; MOV bDescLO,DPL; MOV bDescHI,DPH; MOV DPL,R0; MOV DPH,R1; MOVX @DPTR,A; INC DPTR; MOV R0,DPL; MOV R1,DPH; DEC B; JMP D12_GetDesc_Judge; D12_GetDesc_ERROR: MOV A,#00H; MOV B,#01H; LCALL D12_SetEndPointState; MOV A,#01H; MOV B,#01H; LCALL D12_SetEndPointState; MOV A,#D12_IDLE; MOV bAct,A; D12_GetDesc_END: POP A; MOV R1,A; POP A; MOV R0,A; POP B; POP A; POP DPH; POP DPL; RET; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
|
7楼#
发布于:2002-10-29 17:24
CObject我觉得可能是列举过程你的固件没有响应好,我以前也遇到过你的情况,修改了固件就好了
D12列举:connect->interrupt ENP0OUT中处理中断:select endpoint 0,read the buffer,and save the setup packet into ur device\'s buffer,ack endpoint ,clear enpoit,switch(setupPacket.bReques) Case:Get_status Case:Set_feature ??? (主要是GetDescriptor) Case:GetDescriptro { 如果是第一次获取device描述符只返回8个字节,否则 } ???嗯,还是把程序拷处理吧: ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ D12_GetDescriptor: PUSH DPL; PUSH DPH; PUSH A; PUSH B; MOV A,R0 PUSH A; MOV A,R1; PUSH A; MOV A,#D12_SEND; MOV bAct,A;bAct D12状态字节 MOV DPTR,#SETUP_PACK;已收到的setup 包 INC DPTR; INC DPTR; INC DPTR; MOVX A,@DPTR;描述符类型 CJNE A,#01H,D12_GetDesc_Config; ;;;;device descriptor INC DPTR;index lo INC DPTR;index hi INC DPTR;wLength lo ;;;;;;;;;第一次,只送8个字节 MOV A,bGetDesc;bGetDesc存放get ;device Descriptor次数 INC A MOV bGetDesc,A; CJNE A,#01H,D12_GetDesc_SetLength; MOV A,#08H; MOVX @DPTR,A; JMP D12_GetDesc_Device; D12_GetDesc_SetLength: MOVX A,@DPTR;wLength MOV B,#12H; CLR C; SUBB A,B;x-12h JC D12_GetDesc_Device;wLength<12h ;;;wLength>=12h MOV A,#12H; MOVX @DPTR,A; D12_GetDesc_Device: ;;;set data address MOV DPTR,#DEVICE_DESC; MOV bDescLO,DPL; MOV bDescHI,DPH; JMP D12_GetDesc_Send; D12_GetDesc_Config: CJNE A,#02H,D12_GetDesc_ERROR ;;;config descriptor INC DPTR; INC DPTR; INC DPTR; MOVX A,@DPTR;wLength MOV B,#2EH; CLR C; SUBB A,B;wLength-2E JC D12_GetDesc_Config1; ;;;wLength>=2Eh MOV A,#2EH; MOVX @DPTR,A; D12_GetDesc_Config1: ;;;set data address MOV DPTR,#CONFIG_DESC; MOV bDescLO,DPL; MOV bDescHI,DPH; D12_GetDesc_Send: ;;; MOV DPTR,#SETUP_PACK MOV A,#06H; CLR C ADD A,DPL MOV DPL,A; MOV A,#00H; ADDC A,DPH; MOV DPH,A;wLength ;;;;;;;;;;;;;;;;; MOVX A,@DPTR; CLR C MOV B,#10H; SUBB A,B; JNC D12_GetDesc_Send1; ;;;wLength<10h; MOVX A,@DPTR MOV B,A;LOOPER MOV A,#00H; D12_GetDesc_Send1: MOVX @DPTR,A; MOV DPTR,#ENP0_1; MOV A,B; MOVX @DPTR,A;SET BUFFER LENGTH INC DPTR; MOV R0,DPL; MOV R1,DPH; D12_GetDesc_Judge: MOV A,B; JNZ D12_GetDesc_Send2; ;;;send over MOV A,#01H;ENP INDEX LCALL D12_WR_BUF; JMP D12_GetDesc_END; D12_GetDesc_Send2: MOV DPL,bDescLO; MOV DPH,bDescHI; MOV A,#00H; MOVC A,@A+DPTR; INC DPTR; MOV bDescLO,DPL; MOV bDescHI,DPH; MOV DPL,R0; MOV DPH,R1; MOVX @DPTR,A; INC DPTR; MOV R0,DPL; MOV R1,DPH; DEC B; JMP D12_GetDesc_Judge; D12_GetDesc_ERROR: MOV A,#00H; MOV B,#01H; LCALL D12_SetEndPointState; MOV A,#01H; MOV B,#01H; LCALL D12_SetEndPointState; MOV A,#D12_IDLE; MOV bAct,A; D12_GetDesc_END: POP A; MOV R1,A; POP A; MOV R0,A; POP B; POP A; POP DPH; POP DPL; RET; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
|
8楼#
发布于:2002-10-29 17:32
在enp0IN中断中应当这样处理
D12_ENP0IN: PUSH A; PUSH B; PUSH DPL; PUSH DPH; MOV A,R0; PUSH A; MOV A,R1; PUSH A; MOV A,#D12_SEND; MOV bAct,A; MOV A,#01H;ENPOINT SETTING LCALL D12_RD_LastTransact; MOV R0,A; ANL A,#01H; CJNE A,#00H,D12_ENP0IN_OK LJMP D12_ENP0IN_ERROR; ;;;;只有从SETUP_PACK我们才知道要发送什么 ;;;;送数据包或者0长度响应包 D12_ENP0IN_OK: MOV DPTR,#SETUP_PACK; MOVX A,@DPTR; ANL A,#01100000B;只响应11种标准USB请求包 CJNE A,#00100000B,D12_ENP0IN_MANUF; ;;;USB CLASS REQUEST; LJMP D12_ENP0IN_ERROR D12_ENP0IN_MANUF: CJNE A,#01000000B,D12_ENP0IN_STD ;;;MANUFACTURE REQUEST; LJMP D12_ENP0IN_ERROR D12_ENP0IN_ERROR_JMP: LJMP D12_ENP0IN_ERROR; D12_ENP0IN_STD: CJNE A,#00H,D12_ENP0IN_ERROR_JMP; MOVX A,@DPTR; ;;;;判断SETUP请求是IN or OUT ANL A,#80H; JNZ D12_ENP0IN_REQ_IN; ;;;;SETUP是OU请求,现在需要DEVICE发送0长度数据包以作为状态阶段的响应 ;;;OUT请求已经在D12_ENP0OUT中响应了 D12_ENP0IN_END_JMP: LJMP D12_ENP0IN_END; D12_ENP0IN_REQ_IN: ;;;;;SETUP是IN请求,要求DEVICE发送数据到HOST; MOV DPTR,#ENP0_1; MOVX A,@DPTR; CLR C; MOV B,#10H; SUBB A,B; JC D12_ENP0IN_END_JMP;上次发送的数据小于16,已经是最后一次了,不用再发送 ;;;发新的数据包 MOV DPTR,#SETUP_PACK; INC DPTR; MOVX A,@DPTR; ;;;;判断是11个标准请求中的IN请求 CJNE A,#Get_Descriptor,D12_ENP0IN_ERROR; ;;;;GetDescriptor; INC DPTR;descriptor index INC DPTR;descriptor type MOVX A,@DPTR; ;;;只响应device和configuration请求 MOV B,#02H XCH A,B;02H-X CLR C SUBB A,B; JNC D12_ENP0IN_REQ_IN_SEND_DESC; LJMP D12_ENP0IN_ERROR; D12_ENP0IN_REQ_IN_SEND_DESC: ;;要么是DEVICE要么是CONFIGRATION DESC ;;在这里不用区别它们,因为在setup中断中已经设置了 ;;bDescLO,bDescHI指针,和长度wLength MOV DPTR,#SETUP_PACK MOV A,#06H; CLR C; ADD A,DPL; MOV DPL,A; MOV A,#00 ADDC A,DPH; MOV DPH,A; MOVX A,@DPTR; MOV B,#10H;endpoint0 max packet size CLR C SUBB A,B;wLength-16D JNC D12_ENP0IN_REQ_IN_GetDesc_NEXT; ;;;本次发送@dptr个字节,小于0f ;;;是最后一次发送 MOV A,#D12_IDLE; MOV bAct,A; MOVX A,@DPTR; MOV B,A;发送循环计数器 MOV A,#00H; MOVX @DPTR,A; ;;;SET LENGTH MOV DPTR,#ENP0_1; MOV A,B;置映射缓冲区数据长度 MOVX @DPTR,A; INC DPTR; MOV R0,DPL; MOV R1,DPH;保存映射缓冲区指针 D12_ENP0IN_REQ_IN_GetDesc_JG: MOV A,B; JNZ D12_ENP0IN_REQ_IN_GetDesc_BYTE ;;;完毕,启动发送 MOV A,#01H; LCALL D12_WR_BUF; LJMP D12_ENP0IN_END; D12_ENP0IN_REQ_IN_GetDesc_BYTE: MOV DPH,bDescHI; MOV DPL,bDescLO; MOV A,#00H MOVC A,@A+DPTR;读程序储存器 INC DPTR; MOV bDescHI,DPH; MOV bDescLO,DPL;保存指针 MOV DPL,R0; MOV DPH,R1; MOVX @DPTR,A;写入缓冲区 INC DPTR; MOV R0,DPL; MOV R1,DPH; DEC B; JMP D12_ENP0IN_REQ_IN_GetDesc_JG D12_ENP0IN_REQ_IN_GetDesc_NEXT: ;;;请求的数据分好几次发送 MOVX @DPTR,A;设置还有多少数据还没有发送 MOV A,#10H; MOV B,A; ;;;设置映射缓冲区数据长度 MOV DPTR,#ENP0_1; MOVX @DPTR,A; INC DPTR; MOV R0,DPL; MOV R1,DPH; LJMP D12_ENP0IN_REQ_IN_GetDesc_JG D12_ENP0IN_ERROR: MOV A,#01H; MOV B,#01H; LCALL D12_SetEndPointState; MOV A,#00H; MOV B,#01H; LCALL D12_SetEndPointState; LCALL D12_ACK_EndPoint0; MOV A,#D12_IDLE; MOV bAct,A; D12_ENP0IN_END: POP A MOV R1,A; POP A; MOV R0,A; POP DPH; POP DPL; POP B POP A; RET; ;____________________________________________________ ;//////////////////////////////////////////////////// ;---------------------------------------------------- ********片外SRAM的使用************************************ SETUP_PACK EQU 0000H;占8个字节,存放收到的setup packet ENP0_0 EQU 0008H;COVER 16BYTES ;缓冲区映射 ENP0_1 EQU 0018H;COVER 16 BYTES ENP1_0 EQU 0028H;COVER 16 BYTES ENP1_1 EQU 0038H;COVERING 16BYTES ENP2_0 EQU 0078H;COVERING 64 BYTES ENP2_1 EQU 00B8H;COVERING 64 BYTES ;;;;;;;;;;;;;;;;;;;;;;;; D12_WR_BUF: ? ? ? LCALL D12_ACK_EndPoint0; LCALL D12_UpdateBuf; RET; ;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;; D12_RD_BUF: ? ? ? LCALL D12_ACK_EndPoint0; LCALL D12_ClearBuf; RET; ;;;;;;;;;;;;;;;;;;;;;;;; |
|
|
9楼#
发布于:2002-10-29 17:42
CObject我觉得可能是列举过程你的固件没有响应好,我以前也遇到过你的情况,修改了固件就好了 To:cquwyb 的确是固件没编好,现在已经成功了!非常感谢cquwyb兄的帮助, ;) |
|
|
10楼#
发布于:2002-10-29 17:50
呵呵,祝贺祝贺◎L~
|
|
|