CObject
驱动大牛
驱动大牛
  • 注册日期2002-08-18
  • 最后登录2017-07-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望106点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1628回复:10

USB地址设置的问题

楼主#
更多 发布于:2002-10-22 22:35
用D12芯片作的设备,连到计算机后用USBView可以看到设备描述符(18B),但是地址却是缺省的0,在地址设置的函数中打断点也可以停住,也回送了0长度的包了,怎么用USBView看的时候还会是缺省的地址那?

指教!先谢了!

最新喜欢:

r2109twr2109t...
[img=501x116]http://www.driverdevelop.com/forum//upload/CObject/2004-01-13_2.jpg[/img]
double
论坛版主
论坛版主
  • 注册日期2002-03-30
  • 最后登录2015-05-05
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望4点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-10-22 22:53
非常抱歉,我不太明白你的意思,也不知道你的目的是什么,你要做什么。能解释的清楚些吗?
轻轻的我来了 带给你欢乐 悄悄的我走了 带走你忧愁
CObject
驱动大牛
驱动大牛
  • 注册日期2002-08-18
  • 最后登录2017-07-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望106点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-10-22 23:10
非常抱歉,我不太明白你的意思,也不知道你的目的是什么,你要做什么。能解释的清楚些吗?

就是设备枚举的时候,可以发现设备但是为Unknown device,用USBView查看的时候可以看到设备描述符(全部18B),但是地址却是缺省的0!我想问我地址设置可能在那里有问题!
[img=501x116]http://www.driverdevelop.com/forum//upload/CObject/2004-01-13_2.jpg[/img]
CObject
驱动大牛
驱动大牛
  • 注册日期2002-08-18
  • 最后登录2017-07-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望106点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-10-23 10:15
设置地址应该可以的,因为在设置地址的地方设置断点,查看地址值可以看到0x02的,但是在片子中全速运行,为什么还是缺省地址就不明白了! :mad: :mad: :mad:
[img=501x116]http://www.driverdevelop.com/forum//upload/CObject/2004-01-13_2.jpg[/img]
double
论坛版主
论坛版主
  • 注册日期2002-03-30
  • 最后登录2015-05-05
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望4点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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时才知道地址。所以可能是在这之间出了错误。
轻轻的我来了 带给你欢乐 悄悄的我走了 带走你忧愁
jipeifeng
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2002-11-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-29 15:50
那单片机在自举过程中又做了什么工作??谢谢!我是一个新手!
cquwyb
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2010-10-23
  • 粉丝0
  • 关注0
  • 积分160分
  • 威望16点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
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;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
HonestTreee
cquwyb
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2010-10-23
  • 粉丝0
  • 关注0
  • 积分160分
  • 威望16点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
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;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
HonestTreee
cquwyb
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2010-10-23
  • 粉丝0
  • 关注0
  • 积分160分
  • 威望16点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
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;
;;;;;;;;;;;;;;;;;;;;;;;;
HonestTreee
CObject
驱动大牛
驱动大牛
  • 注册日期2002-08-18
  • 最后登录2017-07-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望106点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2002-10-29 17:42
CObject我觉得可能是列举过程你的固件没有响应好,我以前也遇到过你的情况,修改了固件就好了


To:cquwyb
    的确是固件没编好,现在已经成功了!非常感谢cquwyb兄的帮助, ;)  
[img=501x116]http://www.driverdevelop.com/forum//upload/CObject/2004-01-13_2.jpg[/img]
cquwyb
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2010-10-23
  • 粉丝0
  • 关注0
  • 积分160分
  • 威望16点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-10-29 17:50
呵呵,祝贺祝贺◎L~
HonestTreee
游客

返回顶部