着急啊:枚举时PDIUSBD12的端点0缓冲区老是为空(还在等)

[复制链接]
3576|9
 楼主| geergeer 发表于 2008-10-1 12:11 | 显示全部楼层 |阅读模式
首先对浏览帖子的大侠表示深深的谢意!<br />如题,小弟使用C8051F040控制PDIUSBD12实现USB通信,51采用低口非复用方式寻址外部空间来对D12进行控制。编写函数D12_ReadChipID()读D12芯片ID,能够成功获得ID,该函数里包含了inportb()和outportb()两个重要的底层函数,说明两函数工作正常。<br />插上USB线刚开始与PC进行枚举过程时,程序能够进入ep0_rxdone(void)(端点零OUT中断),程序如下,然后程序会跑到setup&nbsp;package&nbsp;error的条件中,导致无条件返回。这是为什么呢?!<br />void&nbsp;ep0_rxdone(void)<br />{<br />&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;ep_last,i;<br />&nbsp;&nbsp;&nbsp;ep_last&nbsp;=&nbsp;D12_ReadLastTransactionStatus(0);//&nbsp;Clear&nbsp;interrupt&nbsp;flag<br />&nbsp;&nbsp;&nbsp;if&nbsp;(ep_last&nbsp;&&nbsp;D12_SETUPPACKET)&nbsp;//receive&nbsp;setup&nbsp;package&nbsp;0x20<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ControlData.wLength&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ControlData.wCount&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;D12_ReadEndpoint(0,&nbsp;sizeof(ControlData.DeviceRequest),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;char&nbsp;*)(&(ControlData.DeviceRequest)))&nbsp;!=&nbsp;sizeof(DEVICE_REQUEST)&nbsp;)&nbsp;//setup&nbsp;package&nbsp;error<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;D12_SetEndpointStatus(0,&nbsp;1);&nbsp;&nbsp;&nbsp;&nbsp;//捕捉到ep_last=0x21<br />&nbsp;&nbsp;&nbsp;&nbsp;D12_SetEndpointStatus(1,&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;bEPPflags.bits.control_state&nbsp;=&nbsp;USB_IDLE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;…………<br />由于if(&nbsp;D12_ReadEndpoint(0,&nbsp;sizeof(ControlData.DeviceRequest),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;char&nbsp;*)(&(ControlData.DeviceRequest)))&nbsp;!=&nbsp;sizeof(DEVICE_REQUEST)&nbsp;)&nbsp;成立,所以我进入到D12_ReadEndpoint()中看程序运行的情况,程序如下,发现if((inportb(D12_DATA)&D12_FULLEMPTY)==0)条件成立,代表缓冲区为空,所以与PC的枚举无法继续,这是为什么啊!!!<br />unsigned&nbsp;char&nbsp;D12_ReadEndpoint(unsigned&nbsp;char&nbsp;endp,&nbsp;unsigned&nbsp;char&nbsp;len,&nbsp;unsigned&nbsp;char&nbsp;*&nbsp;buf)reentrant<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i,j;<br />&nbsp;&nbsp;&nbsp;&nbsp;outportb(D12_COMMAND,endp);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//endpoint&nbsp;select<br />&nbsp;&nbsp;&nbsp;&nbsp;if((inportb(D12_DATA)&D12_FULLEMPTY)==0)//0x1<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;…………<br />可见D12能够顺利收到SETUP包,但是因为没收到DATA0包(D12总是说缓冲区为空),所以枚举过程无法继续,我曾反复运行程序,皆如此。我用变量去追踪中断发生的情况,从USB插头一插上电脑到电脑弹出“无法识别的设备”的警告期间,D12_INT_BUSRESET中断发生四次,D12_INT_SUSPENDCHANGE中断发生四次,D12_INT_ENDP0OUT中断(即端点0的OUT中断)发生三次(三次均因为缓冲区为零无法完成枚举),其他中断都没发生。<br />D12的电路图如下,恳请大侠们赐教!!!感激不尽!!<br /><br />
 楼主| geergeer 发表于 2008-10-6 08:30 | 显示全部楼层

我顶,着急啊

  
 楼主| geergeer 发表于 2008-10-7 13:09 | 显示全部楼层

唉,看来没辄了

  
topone 发表于 2008-10-7 13:51 | 显示全部楼层

检查一下看看在此之前有没有关中断

检查一下看看在此之前有没有关中断,有没有某些操作导致FIFO被clear.
 楼主| geergeer 发表于 2008-10-8 20:39 | 显示全部楼层

感谢回帖

感谢topone的回帖,你的意思是不是要在D12中断函数中加入关全局中断的语句?函数改写如下:<br />void&nbsp;INT0_ISR&nbsp;(void)&nbsp;interrupt&nbsp;0<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;EA=0;//关全局中断<br />&nbsp;&nbsp;&nbsp;&nbsp;usb_isr();<br />&nbsp;&nbsp;&nbsp;&nbsp;EA=1;//开全局中断<br />}<br />重新编译运行后依然不行,现象和上述描述一样~~<br />
 楼主| geergeer 发表于 2008-10-10 19:31 | 显示全部楼层

我顶,仍抱有一线的希望

  
computer00 发表于 2008-10-15 11:03 | 显示全部楼层

有可能是你的IO口速度太快,适当在一些地方加点延时试试

另外你可以参考一下我们小组里的程序。
 楼主| geergeer 发表于 2008-10-16 13:28 | 显示全部楼层

感谢热心人OO的回复

51现在的指令周期是1/11.05&nbsp;MHz,我先试着加点延时看看<br /><br />再次感谢热心人出面让帖子浮起来,着急啊
moveto 发表于 2008-11-5 23:08 | 显示全部楼层

D12我也在弄,可惜还是搞不出来

D12我也在弄,可惜还是搞不出来
torch888 发表于 2008-11-27 20:02 | 显示全部楼层

我开发过USB host

我以前开发的时候也挺郁闷的,因为周围很少有人自行开发USB,后来用了个USB分析仪,很快找到问题,如果有条件可以使用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

54

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部