Но скорость передачи не изменилась ~550 кб/сек.
Нормального примера на Endpoint_IN Double buffer я не смог найти.
Кто имел опыт с double buffer, подскажите что не так делаю?
Изменил три файла. В usb_conf.h добавил один буфер и сдвинул остальные
Код
///// usb_conf.h
//#define ENDP1_TXADDR (0xC0)
#define ENDP1_BUF0ADDR (0xC0)
#define ENDP1_BUF1ADDR (0x100)
#define ENDP2_TXADDR (0x140)
#define ENDP3_RXADDR (0x150)
//#define ENDP1_TXADDR (0xC0)
#define ENDP1_BUF0ADDR (0xC0)
#define ENDP1_BUF1ADDR (0x100)
#define ENDP2_TXADDR (0x140)
#define ENDP3_RXADDR (0x150)
В usb_prop.c заменил инициализацию EP1
Код
///// usb_prop.c
/* Initialize Endpoint 1
SetEPType(ENDP1, EP_BULK);
SetEPTxAddr(ENDP1, ENDP1_TXADDR);
SetEPTxStatus(ENDP1, EP_TX_NAK);
SetEPRxStatus(ENDP1, EP_RX_DIS);*/
/* Initialize Endpoint 1 (TX) (IN) (EP1_IN)*/
SetEPType(ENDP1, EP_BULK);
SetEPDoubleBuff(ENDP1);
SetEPDblBuffAddr(ENDP1, ENDP1_BUF0ADDR, ENDP1_BUF1ADDR);
SetEPDblBuffCount(ENDP1, EP_DBUF_IN, Device_Property.MaxPacketSize); // 0x40
ClearDTOG_TX(ENDP1); // USB PERIPHERAL
ClearDTOG_RX(ENDP1); // SW_BUF for APPLICATION
ToggleDTOG_RX(ENDP1); // NOT TX ie SW_BUF
SetEPTxStatus(ENDP1, EP_TX_NAK);
SetEPRxStatus(ENDP1, EP_RX_DIS); // NOT TX DISABLE
/* Initialize Endpoint 1
SetEPType(ENDP1, EP_BULK);
SetEPTxAddr(ENDP1, ENDP1_TXADDR);
SetEPTxStatus(ENDP1, EP_TX_NAK);
SetEPRxStatus(ENDP1, EP_RX_DIS);*/
/* Initialize Endpoint 1 (TX) (IN) (EP1_IN)*/
SetEPType(ENDP1, EP_BULK);
SetEPDoubleBuff(ENDP1);
SetEPDblBuffAddr(ENDP1, ENDP1_BUF0ADDR, ENDP1_BUF1ADDR);
SetEPDblBuffCount(ENDP1, EP_DBUF_IN, Device_Property.MaxPacketSize); // 0x40
ClearDTOG_TX(ENDP1); // USB PERIPHERAL
ClearDTOG_RX(ENDP1); // SW_BUF for APPLICATION
ToggleDTOG_RX(ENDP1); // NOT TX ie SW_BUF
SetEPTxStatus(ENDP1, EP_TX_NAK);
SetEPRxStatus(ENDP1, EP_RX_DIS); // NOT TX DISABLE
В hw_config.c переписал CDC_Send_DATA.
Код
////// hw_config.c
/*uint32_t CDC_Send_DATA (uint8_t *ptrBuffer, uint8_t Send_length)
{
//if max buffer is Not reached
if(Send_length <= VIRTUAL_COM_PORT_DATA_SIZE)
{
packet_sent = 0; //Sent flag
// send packet to PMA
UserToPMABufferCopy((unsigned char*)ptrBuffer, ENDP1_TXADDR, Send_length);
SetEPTxCount(ENDP1, Send_length);
SetEPTxValid(ENDP1);
}
else
{ return 0; }
return 1;
} */
uint32_t CDC_Send_DATA(uint8_t* ptrBuffer, uint8_t Send_length)
{
if(Send_length > VIRTUAL_COM_PORT_DATA_SIZE) return 0;
if (GetENDPOINT(ENDP1) & EP_DTOG_RX) // NOT TX ie SW_BUF
{
UserToPMABufferCopy(ptrBuffer, ENDP1_BUF0ADDR, Send_length);
SetEPDblBuf0Count(ENDP1, EP_DBUF_IN, Send_length);
}
else
{
UserToPMABufferCopy(ptrBuffer, ENDP1_BUF1ADDR, Send_length);
SetEPDblBuf1Count(ENDP1, EP_DBUF_IN, Send_length);
}
FreeUserBuffer(ENDP1, EP_DBUF_IN); // Toggles EP_DTOG_RX / SW_BUF
SetEPTxValid(ENDP1);
packet_sent = 0;
return 1;
}
/*uint32_t CDC_Send_DATA (uint8_t *ptrBuffer, uint8_t Send_length)
{
//if max buffer is Not reached
if(Send_length <= VIRTUAL_COM_PORT_DATA_SIZE)
{
packet_sent = 0; //Sent flag
// send packet to PMA
UserToPMABufferCopy((unsigned char*)ptrBuffer, ENDP1_TXADDR, Send_length);
SetEPTxCount(ENDP1, Send_length);
SetEPTxValid(ENDP1);
}
else
{ return 0; }
return 1;
} */
uint32_t CDC_Send_DATA(uint8_t* ptrBuffer, uint8_t Send_length)
{
if(Send_length > VIRTUAL_COM_PORT_DATA_SIZE) return 0;
if (GetENDPOINT(ENDP1) & EP_DTOG_RX) // NOT TX ie SW_BUF
{
UserToPMABufferCopy(ptrBuffer, ENDP1_BUF0ADDR, Send_length);
SetEPDblBuf0Count(ENDP1, EP_DBUF_IN, Send_length);
}
else
{
UserToPMABufferCopy(ptrBuffer, ENDP1_BUF1ADDR, Send_length);
SetEPDblBuf1Count(ENDP1, EP_DBUF_IN, Send_length);
}
FreeUserBuffer(ENDP1, EP_DBUF_IN); // Toggles EP_DTOG_RX / SW_BUF
SetEPTxValid(ENDP1);
packet_sent = 0;
return 1;
}
В main.c заменил главный цикл что бы он постоянно отправлял данные
Код
#define BUF_SIZE 64
uint8_t Send_Buf[BUF_SIZE], j=0, i;
for( i=0; i<BUF_SIZE; i++ ) Send_Buf[i]=j++;
while (1)
{
if (bDeviceState == CONFIGURED)
{
if ( packet_sent == 1 )
{
CDC_Send_DATA( (unsigned char*)Send_Buf, BUF_SIZE );
for( i=0; i<BUF_SIZE; i++ ) Send_Buf[i]=j++;
}
}
}
uint8_t Send_Buf[BUF_SIZE], j=0, i;
for( i=0; i<BUF_SIZE; i++ ) Send_Buf[i]=j++;
while (1)
{
if (bDeviceState == CONFIGURED)
{
if ( packet_sent == 1 )
{
CDC_Send_DATA( (unsigned char*)Send_Buf, BUF_SIZE );
for( i=0; i<BUF_SIZE; i++ ) Send_Buf[i]=j++;
}
}
}