阅读:3085回复:13
PDIUSBD12:40分绝对值得!
首先请问斑竹:怎么给分?我好散分。
下面是我的一段程序(很简单的,只是验证能够在设备枚举的时候能够收到来自PC的8字节的setup包就可以了,mcs51编写,用ICES-G3仿真机调试,很古老的一种),我怎么看都找不到原因在哪里,搞的我一个国庆过的很不爽。问题在下面的程序段中我有提示的地方。那位大虾能够搞定,我绝对奉送30分。 ;----------------------------------------------------------- ;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 ;-----------------------------------------------------------org 00h ljmp startup org 03h ljmp Int0Break org 30h startup: clr ea ;close interrupt mov sp,#55h ;set stack clr rs0 clr rs1 ;select register clr It0 ;low to trigger clr Ex0 ;close interrupt clr CS ;pdiusbd12 chip lcall Delay_100ms mov a,#0f3h ;set mode lcall D12Command mov a,#00010110b lcall D12Write mov a,#01000010b lcall D12Write setb ea ;open interrupt setb ex0 Mainloop: nop ljmp 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: movx @dptr,a nop nop nop ret ;-----------------------------------------------------------;D12Command ;-----------------------------------------------------------D12Command: mov dptr,#01h lcall D12Write dec dpl ret ;-----------------------------------------------------------;D12GetStatus ;-----------------------------------------------------------D12GetStatus: lcall D12Command D12Read: movx a,@dptr nop nop nop ret ;-----------------------------------------------------------;Int0Break ;-----------------------------------------------------------Int0Break: mov a,#0f4h ;read register lcall D12GetStatus ;read one_byte lcall 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: ; setb PinSuspend ret Ep1Out: mov a,#42h ljmp D12GetStatus Ep2Out: mov a,#44h ljmp D12GetStatus Ep2In: mov a,#45h ljmp D12GetStatus Ep1In: mov a,#43h ljmp D12GetStatus Ep0In: mov a,41h ljmp D12GetStatus Ep0Out: mov a,#40h ;read last transaction lcall D12GetStatus ;这里读出的一个字节是21h,说明是setup包,而且传送成功了,我想不知道这能不能说明至少我的硬件电路应该没有问题,否则是收不到数据的 mov a,#0 ;lcall D12Command ;select endpoint0 lcall D12GetStatus ;我采取了跟踪:select endpoint0后读出的一个字节是01h,说明端点0是满的,然后连续读出10个字节,可是读出的字节是:c0,c0,80h,80h,80h,80h,80h,80h,80h,80h,或者有时候读出的都是c0,这个跟在设备枚举时host发送的GET_DESCRIPTOR相差实在是太远了。我觉得我的程序已经到了很简单的程度,实在是找不到办法。 我的硬件连接:p1.6----PDIUSBD12的cs,p1.7----PDIUSBS12的suspend,AT89C52的ALE------PDIUSB12的ALE,PDIUSBD12的rd,wr和AT89C52的rd,wr相连。PDISUBD12的A0通过一个10k的电阻接到电源。PDIUSBD12由外部提供电源,不由PC提供。即:通信采用的是总线分时复用方式 mov r0,#bmrequesttype mov r7,#10 mov a,#0f0h lcall D12Command ;read buffer CopySD: lcall D12Read mov @r0,a inc r0 djnz r7,CopySD mov a,#0f1h ;acknowledge lcall D12Command mov a,#0f2h ;clear buffer lcall D12Command mov a,#01h ;select endpoint1 lcall D12Command mov a,#0f1h lcall D12Command ret 欢迎做答。 |
|
最新喜欢:![]() |
沙发#
发布于:2001-10-08 19:48
我做了一个实验:
org 00h ljmp startup org 03h ljmp Int0Break org 30h startup: clr ea ;close interrupt mov sp,#55h ;set stack clr rs0 clr rs1 ;select register clr It0 ;low to trigger clr Ex0 ;close interrupt clr CS ;pdiusbd12 chip lcall Delay_100ms mov a,#0f3h ;set mode lcall D12Command mov a,#00010110b lcall D12Write mov a,#01001011b ;4M lcall D12Write setb ea ;open interrupt setb ex0 只是执行上面的程序段,用示波器观察看到了PDIUSBD12的clkout脚输出的是4M的波形,我想这至少说明我对PDIUSBD12的setmode中的写和读都是正确的,即读写的时序是正确的。那么我上面的问题是什么原因了? |
|
板凳#
发布于:2001-10-08 20:07
你应该试试12M等频率,
因为D12本身不用配置就输出4M的信号 |
|
|
地板#
发布于:2001-10-08 20:45
我试了,12M可以输出。
|
|
地下室#
发布于:2001-10-10 10:32
我觉得你的CS接的不太好,
当你读写外部数据时, RD和WR信号与CS不对应, 并且容易引起总线冲突。 你那总线分时复用是什么意思? 我怎么看着不像是 [wwffllf 编辑于 2001-10-10 10:37] |
|
|
5楼#
发布于:2001-10-10 14:27
我说的总线分时复用是说的MCU采用总线的方式我PDIUSBD12通信,即相对I/O方式而言的。
那是不是如果采用I/0方式,应该按照下面的接法: PDIUSBD12的ALE----GND PDIUSBD12的CS-----MCU的P1。6 PDIUSBD12的SUSPEND-----MCU的P1。7 PDIUSBD12的WR,RD-----MCU的WR,RD PDIUSBD12的A0--------MCU的P1。4 如果采用总线方式,那又该怎么接? |
|
6楼#
发布于:2001-10-10 16:17
我认为主要是CS应该接P2口或者用138译码器输出一个信号,
因为当CS为低即选中片子之后, 这个片子就占据了总线, 别的芯片就不能用总线了, 尤其是下一部你还得取程序进行别的处理, 那么取程序还得用总线, 就引起了总线冲突, 如果用P2选择片子, 那么对此片输出数据, 需要MOVX @DPTR,A此时产生一个短暂不超过一个指令周期的低脉冲就把数据发到片子内 然后就释放总线了, 如果用P1则是一直中占用总线, 等你把你以后的几句程序执行完清除P1后才真正释放总线。 不知我说的对不对? 实话跟你说我的片子也没有调好, 我比你还差, 连最起码的频率都控制不了, 你说不用配置别的仅一个SETMODE可以控制频率吗? 能不能告诉我你怎么配置输出频率的? 希望能共同探讨一下 [wwffllf 编辑于 2001-10-10 16:21] [wwffllf 编辑于 2001-10-10 16:32] |
|
|
7楼#
发布于:2001-10-10 19:13
我现在正想象你说的试一试,就是CS该用P2口的一根线来选择,不过还是采用总线方式通信。
我不知道你的硬件是如何连接的?如果你是和我说的连接一样的话,用我上面的程序就可以用示波器检测到12M时钟输出。或者你将你的电路图给我发一份我看看。(bijunzhang@263.net) org 00h ljmp startup org 03h ljmp Int0Break org 30h startup: clr ea ;close interrupt mov sp,#55h ;set stack clr rs0 clr rs1 ;select register clr It0 ;low to trigger clr Ex0 ;close interrupt clr CS ;pdiusbd12 chip lcall Delay_100ms mov a,#0f3h ;set mode lcall D12Command mov a,#00010110b lcall D12Write mov a,#01001011b ;12 lcall D12Write setb ea ;open interrupt setb ex0 mainloop nop jmp mainloop Delay_500us: push 0 mov 0,#0h d500: djnz 0,d500 pop 0 ret Delay_100ms: push 0 mov 0,#200 d100: call Delay_500us djnz 0,d100 pop 0 ret D12Write: movx @dptr,a nop nop nop ret D12Command: mov dptr,#01h lcall D12Write dec dpl ret D12GetStatus: lcall D12Command D12Read: movx a,@dptr nop nop nop ret 如果你的采用P2进行片选的话,你就修改其中的DPTR就可以了。 我想是可以观察到12M输出的,如果不行,那就是你硬件的问题了。 |
|
8楼#
发布于:2001-10-11 19:48
请问在D12Command:
mov dptr,#01h 中为什么DPTR为01H, 你的DPTR是由什么决定的? |
|
|
9楼#
发布于:2001-10-11 21:15
我是看了以前斑竹和别人的讨论知道是这样的,但是为什么要这样我也不是很清楚。
因为我是采用总线形式所以在写命令的时候dptr,只是关心最低位是不是1,在读和写数据的时候只是关心最低位是不是0而已。 而且我的片选现在该用P1。1,P1。2,P1。3进行选通74138进行译码来对PDIUSBD12进行片选,但是以前有的波形现在也出不来。 不知道是什么问题? 我可以将我的电路图和测试程序告诉你,你帮我看看有什么问题。 |
|
10楼#
发布于:2001-10-11 21:23
好的,
我的地址:wwffllff@263.net |
|
|
11楼#
发布于:2001-10-12 11:57
[QUOTE]原本由 snakehl 发表
[B]我是看了以前斑竹和别人的讨论知道是这样的,但是为什么要这样我也不是很清楚。 因为我是采用总线形式所以在写命令的时候dptr,只是关心最低位是不是1,在读和写数据的时候只是关心最低位是不是0而已。 而且我的片选现在该用P1。1,P1。2,P1。3进行选通74138进行译码来对PDIUSBD12进行片选,但是以前有的波形现在也出不来。 不知道是什么问题? 我可以将我的电路图和测试程序告诉你,你帮我看看有什么问题。 [/B][/QUOTE] dptr: 1: command to D12 0: data to d12 very simple! |
|
|
12楼#
发布于:2001-10-12 17:15
你可以参考斑竹设计的板子。
|
|
13楼#
发布于:2001-10-12 20:09
你给我发的资料我都看了,
跟我的设计思路是一样的, 到现在还不明白为什么出不来波形? 麻烦你把你出来波型的电路图和程序发给我让我参考一下可以吗? 谢谢! |
|
|