snakehl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-29
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1608回复:3

请教!

楼主#
更多 发布于:2001-10-13 16:42
请教:
首先我说说我的硬件连接:(我只是用AT89C52和PDIUSBD12实现简单的数据通信就可以了)
1)MCU和PDIUSBD12采用总线方式通信(非DMA模式):
AT89C52的ALE-------PDIUSBD12的ALE;
AT89C52的WR,RD-----PDIUSBD12的WR,RD;
AT89C52的P1.7-------PDIUSBD12的12脚suspend;
PDIUSBD12的28脚A0通过一个上拉电阻(10K)接VCC;
PDIUSBD12的CS我开始是采用的AT89C52的P1。6来选择的,后来改用了由AT89C52的P1。1,P1。2,P1。3选通74138的输出Y0来选中。
下面是我的一段测试程序,作用只是收来自HOST 的8字节的setup packet,问题就出现在这里:(在程序中表示)
;--------------------------------------------;usb standard command packge
bmrequesttype   equ  20h
brequest         equ  21h
wvalue0         equ  22h
wvalue1         equ  23h
windex0         equ  24h
windex1         equ  25h
wlength0         equ  26h
wlength1         equ  27h
;--------------------------------------------
;d12 signal pin map
CS                      bit  p1.6
PinSuspend   bit  p1.7
;--------------------------------------------
;main.asm: main program
; writer:   zhangbijun
; date:     Aug/21/01
;--------------------------------------------
org     00h
jmp    startup
org     03h
jmp    Int0Break

org     30h
startup:
       clr    ea ;close interrupt
       mov    sp,#55h       ;set stack pointer
        clr    rs0
        clr    rs1               ;select register bank0
clr    It0              ;low trigger
        call   Delay_100ms
mov    a,#0f3h ;set mode
call   D12Command
mov    a,#00010110b
call   D12Write
        mov    a,#01000011b     ;12M
call   D12Write
;用示波器可以看到12M
        setb   ea           ;interrupt
setb   ex0           ;open the external interrupt0
Mainloop:
nop
jmp    Mainloop
;--------------------------------------------
;Delay_500us
;--------------------------------------------
Delay_500us:
push   0
mov    0,#0h
d500:
djnz   0,d500
pop    0
ret
;--------------------------------------------
;Delay_100ms
;--------------------------------------------
Delay_100ms:
push   0
mov    0,#200
d100: call   Delay_500us
djnz   0,d100
pop    0
ret
;--------------------------------------------
;D12Write
;--------------------------------------------
D12Write:
clr    CS
movx   @dptr,a
nop
nop
nop
nop
setb   CS
ret
;--------------------------------------------
;D12Command
;--------------------------------------------
D12Command:
mov    dptr,#01h
call   D12Write
dec    dpl
ret
;--------------------------------------------
;D12GetStatus
;--------------------------------------------
D12GetStatus:
call   D12Command
D12Read:
clr    CS
movx   a,@dptr
nop
nop
nop
nop
setb   CS
        ret
;--------------------------------------------
;Int0Break
;--------------------------------------------
Int0Break:
mov    a,#0f4h ;read interrupt register
call   D12GetStatus ;read one_byte
call   FindInterruptSource
reti
FindInterruptSource:
jb     acc.7,SuspendChange
jb     acc.6,BusReset
jb     acc.0,Ep0Out
jb     acc.1,Ep0In
jb     acc.2,Ep1Out
jb     acc.3,Ep1In
jb     acc.4,Ep2Out
jb     acc.5,Ep2In
SuspendChange:
BusReset:
ret
Ep1Out:
mov    a,#42h
jmp    D12GetStatus
Ep2Out:
mov    a,#44h
jmp    D12GetStatus
Ep2In:
   mov    a,#45h
   jmp    D12GetStatus
Ep1In:
mov    a,#43h
jmp    D12GetStatus
Ep0In:
mov    a,41h
jmp    D12GetStatus  
Ep0Out:
mov    a,#40h ;read last transaction status call   D12GetStatus
mov    a,#0
        call   D12GetStatus             ;select endpoint0 and read one_byte
;在这里可以看到读出的数据是01
mov    r0,#bmrequesttype
mov    r7,#10
mov    a,#0f0h
call   D12Command ;read buffer
CopySD:
call   D12Read
mov    @r0,a
inc    r0
djnz   r7,CopySD
;可是在这里发现收到的数据就不对了,或者是10个co,或者是10个0:或者是c0,c0,c0,06,06,06,06,06,06,06,其中的06应该是get_descriptor,可是8个 setup packet包中的其他字节就收的不正确了。
mov    a,#0f1h ;acknowledge
call   D12Command
mov    a,#0f2h ;clear buffer
call   D12Command
mov    a,#01h ;select endpoint1
call   D12Command
mov    a,#0f1h
call   D12Command
ret
请指点,我调试了很长时间都调试不通,我的仿真机是ICES-G3,很老的一种,而且是用486DX型机器来调试。
2)如果MCU和PDIUSBD12采用I/O方式通信(非DMA模式)硬件这样接不知道可以不可以?
PDIUSBD12的ALE----GND;
AT89C52的WR,RD-----PDIUSBD12的WR,RD;
AT89C52的P1.7-------PDIUSBD12的12脚suspend;
PDIUSBD12的28脚A0------AT89C52的P1。4;
PDIUSBD12的CS是采用AT89C52的P1。6,还是用74138译码产生了?
另外我附上我的电路图一份,真的希望你能给我一些指点,我实在是想不清楚问题在哪里了。
急切的盼望你们的答案

最新喜欢:

Jkw_DevJkw_De...
wwffllf
驱动小牛
驱动小牛
  • 注册日期2001-07-14
  • 最后登录2004-11-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-10-15 10:39
听说可以直接用USBCHECK测试设备的固件程序,你不妨试一下?
我告诉你们,我可是身经百战了。见的多了,驱动开发,哪个版我没灌过? 你们要知道,驱动的▲版,那比你们不知道厉害到哪里去了,我在那谈笑风声。 你们有一个好,就是什么话题都灌。但是灌来灌去的问题,都 too simple, sometimes naive! 懂了没有? 所以说灌水啊,关键是要提高自己的知识水平。 哦,你们啊,不要想弄个大坑,re上十大,再羞辱一番?你们啊.... naive !! 改编于《江core发飙》
snakehl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-29
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-10-14 20:31
主机不用自己编写任何驱动程序,就可以调试FIRMWARE。
是系统自己的驱动程序。
wwffllf
驱动小牛
驱动小牛
  • 注册日期2001-07-14
  • 最后登录2004-11-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-10-13 23:18
请问你在主机是如何发的数据啊?
已经编好驱动和用户软件?
我告诉你们,我可是身经百战了。见的多了,驱动开发,哪个版我没灌过? 你们要知道,驱动的▲版,那比你们不知道厉害到哪里去了,我在那谈笑风声。 你们有一个好,就是什么话题都灌。但是灌来灌去的问题,都 too simple, sometimes naive! 懂了没有? 所以说灌水啊,关键是要提高自己的知识水平。 哦,你们啊,不要想弄个大坑,re上十大,再羞辱一番?你们啊.... naive !! 改编于《江core发飙》
游客

返回顶部