打印

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

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

相关帖子

沙发
geergeer|  楼主 | 2008-10-6 08:30 | 只看该作者

我顶,着急啊

使用特权

评论回复
板凳
geergeer|  楼主 | 2008-10-7 13:09 | 只看该作者

唉,看来没辄了

使用特权

评论回复
地板
topone| | 2008-10-7 13:51 | 只看该作者

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

检查一下看看在此之前有没有关中断,有没有某些操作导致FIFO被clear.

使用特权

评论回复
5
geergeer|  楼主 | 2008-10-8 20:39 | 只看该作者

感谢回帖

感谢topone的回帖,你的意思是不是要在D12中断函数中加入关全局中断的语句?函数改写如下:
void INT0_ISR (void) interrupt 0
{
    EA=0;//关全局中断
    usb_isr();
    EA=1;//开全局中断
}
重新编译运行后依然不行,现象和上述描述一样~~

使用特权

评论回复
6
geergeer|  楼主 | 2008-10-10 19:31 | 只看该作者

我顶,仍抱有一线的希望

使用特权

评论回复
7
computer00| | 2008-10-15 11:03 | 只看该作者

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

另外你可以参考一下我们小组里的程序。

使用特权

评论回复
8
geergeer|  楼主 | 2008-10-16 13:28 | 只看该作者

感谢热心人OO的回复

51现在的指令周期是1/11.05 MHz,我先试着加点延时看看

再次感谢热心人出面让帖子浮起来,着急啊

使用特权

评论回复
9
moveto| | 2008-11-5 23:08 | 只看该作者

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

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

使用特权

评论回复
10
torch888| | 2008-11-27 20:02 | 只看该作者

我开发过USB host

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

54

帖子

0

粉丝