我将stm32的usb端点2设置为双缓冲,但是在测试的时候发现出现丢包现象;
设置双缓冲代码如下:
#define SPEED_UP
#ifdef SPEED_UP
SetEPType(ENDP2, EP_BULK);
SetEPDoubleBuff(ENDP2);
SetEPDblBuffAddr(ENDP2, ENDP2_BUF0Addr, ENDP2_BUF1Addr);
SetEPDblBuffCount(ENDP2, EP_DBUF_OUT, Device_Property.MaxPacketSize);
ClearDTOG_RX(ENDP2);
ClearDTOG_TX(ENDP2);
ToggleDTOG_TX(ENDP2);
SetEPRxStatus(ENDP2, EP_RX_VALID);
SetEPTxStatus(ENDP2, EP_TX_DIS);
#endif
我在out中断中的代码处理如下所示:
if(_GetENDPOINT(ENDP2) & EP_DTOG_TX)//判断本次接收到的数据存放在哪个缓冲区
{
//FreeUserBuffer(ENDP2, EP_DBUF_OUT);//先释放用户对缓冲区的占有,这样的话usb的下一个接收过程会立刻进行,同时用户并行处理接收到的数据
Data_Len = GetEPDblBuf0Count(ENDP2);
PMAToUserBufferCopy(usbinst.m_pBuffer + OUT_count/*blk_ctr.bulk_buf*/, ENDP2_BUF0Addr, Data_Len);
//memcpy(usbinst.m_pBuffer + OUT_count, blk_ctr.bulk_buf, Data_Len);
OUT_count += Data_Len;
if(OUT_count >= USB_BUFFER_SIZE)
{
blk_ctr.bulk_flag = 1;
OUT_count = 0;
//SetEPRxStatus(ENDP2, EP_RX_NAK);
//return;
}
}
else
{
//FreeUserBuffer(ENDP2, EP_DBUF_OUT);//释放所占有的缓冲区
Data_Len = GetEPDblBuf1Count(ENDP2);
PMAToUserBufferCopy(usbinst.m_pBuffer + OUT_count/*blk_ctr.bulk_buf*/, ENDP2_BUF1Addr, Data_Len);
// memcpy(usbinst.m_pBuffer + OUT_count, blk_ctr.bulk_buf, Data_Len);
OUT_count += Data_Len;
{
if(OUT_count >= USB_BUFFER_SIZE)
{
blk_ctr.bulk_flag = 1;
OUT_count = 0;
//SetEPRxStatus(ENDP2, EP_RX_NAK);
//return;
}
}
}
//SetEPRxStatus(ENDP2, EP_RX_VALID);
_ToggleDTOG_TX(ENDP2);
我这是参考的论坛中的设计进行修改的,但是在我的程序中出现丢包的现象 |