ppkwuxuan
驱动牛犊
驱动牛犊
  • 注册日期2003-05-06
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1050回复:0

D12的主端点接收缓冲区问题。

楼主#
更多 发布于:2004-08-20 17:36
    我使用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,好像也有问题。望各位大侠指教!
游客

返回顶部