阅读:2443回复:5
PDIUSBD12设备枚举错误!
急问:
我的MCU是采用的AT89C52,是采用总线方式我PC通信的。开发的时候,我是采用爱思的仿真机,在设备枚举的时候,我采用了跟踪的办法。我发现:ReadLastTransaction后,读出的数值是:0x21h,着说明是setup packet包,而且上次传输成功了,但是在接下来SelectEndpoint后,读出的数值总是0x00,说明Endpoint0(就是端点0)是空,按理说,既然从ReadLastTransaction读出内容可以确定是setup packet,但是在endpoint0中怎么没有来自PC机的8字节的命令内容呢? 我的这段程序如下:希望各位大虾指点,我已经两周徘徊不前了。这 可是我的毕业设计的一部分,我解决不了就毕业不了拉。真的谢谢你,如果你能帮我解决这个问题,我可以给你磕头了 !!!!!!!!! 也不知道我的仿真机有没有问题,但是应该没有问题啊,它至少能够接受来自PC机的数据嘛。 Ep0_RxDone: ;R_L_TransactionStatus(0) to decide if setup package mov r1,#0 lcall R_L_TransactionStatus ;read the state and at the same time to clear the control out flag anl a,#20h ;0010 0000b jz Usb_Receive_Ready ljmp Is_Setup_packgae Usb_Receive_Ready: mov a,bControl_State cjne a,#D12_Receive,Set_State_Idle lcall Usb_Receive ljmp Q_Ep0_RxDone Set_State_Idle: mov bControl_State,#D12_Idle ljmp Q_Ep0_RxDone Is_Setup_Package: ;is setup package ;D12_SelectEndpoint clr CS mov dptr,#01h mov a,#0h ;D12_SelectEndpoint:control out(00h) movx @dptr,a setb CS clr CS mov dptr,#0h movx a,@dptr ;read data setb CS ;the end of D12_SelectEndpoint anl a,#01h ;0000 0001b jz EP0Null //////////////////////////////////////////////////////// 问题就在这里:SelectEndpoint后,读出的数值总是0,说明在从PC机 接受命令的时候,比如SetAddress,根本就没有读出来自PC机的8字节的命令内容。 ;control out endpoint0 is full ;read buffer(read 8tytes) clr CS mov dptr,#01h mov a,#0f0h ;F0h:read buffer command movx @dptr,a setb CS clr CS mov dptr,#0h movx a,@dptr ;the first byte is reserved setb CS clr CS mov dptr,#0 movx a,@dptr ;the length of data bytes setb CS clr c subb a,#08h ;the length of data bytes is 8 or not jc Not8_bytes ljmp GetCommand Not8_bytes: ljmp Q_Ep0_RxDone ;-------------------------------------------------------------------------- EP0Null: ;D12_SetEndpointStatus(r4,r5) mov r4,#0 mov r5,#1 lcall S_Ep_Status mov r4,#1 mov r5,#1 lcall S_Ep_Status mov bControl_State,#D12_Idle ljmp Q_Ep0_RxDone ;the end of setup package ;-------------------------------------------------------------------------- ;EndPoint 0: process configuration command ;-------------------------------------------------------------------------- GetCommand: lcall GetCmd ;get 8 bytes command from host ;the end of read buffer ;clear control out buffer clr CS mov dptr,#01h mov a,#0f2h ;F2:clear buffer command movx @dptr,a setb CS ;the end of clear control out buffer ;D12_AcknowledgeEndPoint(0):control out clr CS mov dptr,#01h mov a,#0h ;select endpoint:control out movx @dptr,a setb CS clr CS mov dptr,#01h mov a,#0f0h ;Acknowledge setup package movx @dptr,a setb CS ;the end of D12_AcknowledgeEndPoint(0) ;D12_AcknowledgeEndPoint(1):control in clr CS mov dptr,#01h mov a,#1h ;select endpoint:control in movx @dptr,a setb CS clr CS mov dptr,#01h mov a,#0f0h ;Acknowledge setup package movx @dptr,a setb CS ;the end of D12_AcknowledgeEndPoint(1) jnb bmRequestType.7,Ep0_DOut mov bSetup_packet,#1 mov bControl_State,#D12_Idle ljmp Q_Ep0_RxDone |
|
最新喜欢:![]() |
沙发#
发布于:2001-09-04 09:06
告诉你一个可以毕业的方法:把philips的例子的hal.c里面的outportb和inportb修改一下,直接编译就可以用了。不过它可是c51的。你再加一点注释,给老师交差没有问题。
我以前也想用asm51,结果仿真器老是搞鬼,浪费了3个星期。后来干脆直接把c51的程序编译后烧到芯片里面,一次就成功了。 |
|
|
板凳#
发布于:2001-09-04 13:38
怎样修改那两个函数啊?
|
|
|
地板#
发布于:2001-09-06 09:18
既然名为硬件抽象层,当然要根据你的硬件来修改了。
|
|
|
地下室#
发布于:2001-09-06 19:46
斑竹:
能不能给一个具体的philips的链接,可以从那里下载关于usb的pdiusbd12的例子(包括output,input)。/ 谢谢 |
|
5楼#
发布于:2001-09-07 08:43
|
|
|