首先对浏览帖子的大侠表示深深的谢意! 如题,小弟使用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的电路图如下,恳请大侠们赐教!!!感激不尽!!
|