阅读:1608回复:3
请教!
请教:
首先我说说我的硬件连接:(我只是用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译码产生了? 另外我附上我的电路图一份,真的希望你能给我一些指点,我实在是想不清楚问题在哪里了。 急切的盼望你们的答案 |
|
最新喜欢:![]() |
沙发#
发布于:2001-10-15 10:39
听说可以直接用USBCHECK测试设备的固件程序,你不妨试一下?
|
|
|
板凳#
发布于:2001-10-14 20:31
主机不用自己编写任何驱动程序,就可以调试FIRMWARE。
是系统自己的驱动程序。 |
|
地板#
发布于:2001-10-13 23:18
请问你在主机是如何发的数据啊?
已经编好驱动和用户软件? |
|
|