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