阅读:1052回复:0
D12的主端点接收缓冲区问题。
我使用D12芯片做USB通信,主要使用的是端点2,使用BULK方式。目前基本通信正常。但是,有时通信时会出现设备端漏收了64字节的数据,且正好是同一次批量传输的数据。检查后发现,有时从D12的主接收端点缓冲区中读取数据时,读出的第二个字节内容为0,此时将不读取任何数据,然后清空缓冲区。后来在读取主接收端点缓冲区时,如果遇到读出长度字节为0,则再读取一次,这时读出来长度为64。程序如下:
/********************************************************************** * 函数名称: * uint D12_ReadMainEndpoint(uchar * buf) * 功能描述: * 尽可能读取主端点的缓冲区的数据,使得双缓冲区都为空 * 被以下函数调用 * 上层函数 * 调用以下函数: * 无 * 输入参数: * buf: 存放读出的数据 * 输出参数: * 无 * 返回值: * 读出数据长度 ***********************************************************************/ uint D12_ReadMainEndpoint(uchar * buf) { uchar i, bDblBuf = 1,k,ucTemp; uint uiLen = 0; // 读端点2(OUT)状态 EM_usb_PORT_CMD = 0x84; for (i=0;i<EM_uart_CMD_DELAY;i++); if( (EM_usb_PORT_DATA & D12_BUFFERFULL) == D12_BUFFERFULL)//双缓冲区0满 { bDblBuf = 2; } for (k=0; k<bDblBuf; k++) { //选择端点 EM_usb_PORT_CMD = 4; for (i=0;i<EM_uart_CMD_DELAY;i++); if((EM_usb_PORT_DATA & D12_FULLEMPTY) == 0) //缓冲区空 { break; } EM_usb_PORT_CMD = 0xF0; //读缓冲区 for (i=0;i<EM_uart_CMD_DELAY;i++); ucTemp = EM_usb_PORT_DATA; ucTemp = EM_usb_PORT_DATA; if (ucTemp == 0) { EA_vUartPrintf("Error Read Data\n"); EM_usb_PORT_CMD = 4; for (i=0;i<EM_uart_CMD_DELAY;i++); if((EM_usb_PORT_DATA & D12_FULLEMPTY) == 0) //缓冲区空 { break; } EM_usb_PORT_CMD = 0xF0; //读缓冲区 for (i=0;i<EM_uart_CMD_DELAY;i++); ucTemp = EM_usb_PORT_DATA; ucTemp = EM_usb_PORT_DATA; EA_vUartPrintf("Read Again Length: %02x:\n",ucTemp); } for(i=0; i<ucTemp; i++) { *buf++ = EM_usb_PORT_DATA; } uiLen +=ucTemp; EM_usb_PORT_CMD = 0xF2;//清缓冲区 } return uiLen; } 有时读出的长度字节为128,好像也有问题。望各位大侠指教! |
|