Опять у меня проблемы с обменом. Нужно передавать непрерывный поток данных 750кБ/с.
При отправке данных в цикле:
Код
while (1)
{
if ( (USB_OTG_dev.dev.device_status == USB_OTG_CONFIGURED) && (USB_Tx_State == 0 ))
{
USB_Tx_State = 1;
DCD_EP_Tx (&USB_OTG_dev, CDC_IN_EP, (uint8_t*)&APP_Rx_Buffer[0], APP_RX_DATA_SIZE);
}
}
Достигается скорость 950кБ/с.
Сделал проверочную отправку непрерывного потока данных 750кБ/с:
CODE
#define APP_RX_DATA_SIZE (7*4096)
...
uint8_t APP_Rx_Buffer [APP_RX_DATA_SIZE];
uint8_t APP_Rx_Buffer_2 [APP_RX_DATA_SIZE];
...
SysTick_Config(SystemCoreClock /48000);
while (1)
{
if (new_data_ready == 1)
{
static uint32_t cnt = 0;
uint8_t *buf_ptr;
new_data_ready = 0;
if (USB_Tx_Buf_State == 0)
{
buf_ptr = APP_Rx_Buffer;
}
else
{
buf_ptr = APP_Rx_Buffer_2;
}
if(APP_Rx_ptr_in == APP_RX_DATA_SIZE)
{
if (APP_Rx_ptr_in_OVERFLOW <= (APP_RX_DATA_SIZE-8))
{
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'O';
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'V';
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'E';
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'R';
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'F';
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'L';
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'O';
buf_ptr[APP_Rx_ptr_in_OVERFLOW++] = 'W';
}
}
else
{
// Записываем 16 байт данных с частотой 48кГц
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[3];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[2];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[1];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[0];
cnt++;
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[3];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[2];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[1];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[0];
cnt++;
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[3];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[2];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[1];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[0];
cnt++;
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[3];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[2];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[1];
buf_ptr[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[0];
cnt++;
}
}
if ( (USB_OTG_dev.dev.device_status == USB_OTG_CONFIGURED) && (USB_Tx_State == 0 ) && (APP_Rx_ptr_in > (4096-1)))
{
uint8_t *buf_ptr;
uint8_t *fill_ptr;
uint32_t buf_leftovers;
uint32_t len;
if (USB_Tx_Buf_State == 0)
{
buf_ptr = APP_Rx_Buffer;
fill_ptr = APP_Rx_Buffer_2;
USB_Tx_Buf_State = 1;
}
else
{
buf_ptr = APP_Rx_Buffer_2;
fill_ptr = APP_Rx_Buffer;
USB_Tx_Buf_State = 0;
}
len = APP_Rx_ptr_in;
APP_Rx_ptr_in = 0;
APP_Rx_ptr_in_OVERFLOW = 0;
// Копируем данные из бефера, которые не кратны 4096
// т.к. приемный буфер драйвера VCP от ST размером 4096
buf_leftovers = len & 0x00000FFF;
len -= buf_leftovers;
while (APP_Rx_ptr_in < buf_leftovers)
{
fill_ptr[APP_Rx_ptr_in] = buf_ptr[(len+APP_Rx_ptr_in)];
APP_Rx_ptr_in++;
}
USB_Tx_State = 1;
DCD_EP_Tx (&USB_OTG_dev, CDC_IN_EP, buf_ptr, len);
}
}
...
void SysTick_Handler(void)
{
new_data_ready = 1;
}
При проверке подключаю устройство напрямую к корневому хабу, все остальные устройства отключаю от шины USB. Настраиваю USBlyzer на логгирование всех устройств на шине (моего устройства, всех хабов, всех хостов).
И в итоге всё нормально передается, но почему-то возникает нечастая (может подряд через несколько сотен мс, может через несколько десятков секунд) непериодическая задержка между передачами разной длительностью в среднем 40мс, но до 100мс, из-за которой у меня забиваются буферы и данные теряются. При этом, судя по логу, никакого трафика на шине в этот момент не идет.
Что это вообще может быть?
Эскизы прикрепленных изображений