Цитата(js_slider @ May 20 2014, 11:37)

Поделитесь пожалуйста кодом как вы определяете завершение передачи?
Имею аналогичную проблему... удалось ли вам ее решить?
Код
while(1)
{
if (send_data_over_usb) {
uint8_t i;
for (i = 0; i < usb_tx_packets; i ++) {
DWTreset;
USB_DataTx(&sensors_data[usb_tx_packet_size / 2 * i], usb_tx_packet_size);
while (tx_data_senging) {}
}
USB_DataTx(&sensors_data[usb_tx_packet_size / 2 * usb_tx_packets], usb_tx_tail);
while (tx_data_senging) {}
send_data_over_usb = 0;
}
}
Вся основная программа работает в прерываниях, а в основной цикл запихал такую вот конструкцию. Когда данные готовы к отправке, определяю количество пакетов (usb_tx_packets) и размер последнего неполного пакета (usb_tx_tail), устанавливаю флаг старта передачи данных (send_data_over_usb).
Код
void USB_DataTx(uint8_t* Buf, uint32_t Len)
{
VCP_DataTx((uint8_t*)Buf, Len);
tx_data_senging = 1;
}
Тут устанавливается флаг начала передачи пакета (tx_data_senging).
Код
static uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum)
{
uint16_t USB_Tx_ptr;
uint16_t USB_Tx_length;
if (USB_Tx_State == 1)
{
if (APP_Rx_length == 0)
{
USB_Tx_State = 0;
tx_data_senging = 0;
}
else
{
if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE){
USB_Tx_ptr = APP_Rx_ptr_out;
USB_Tx_length = CDC_DATA_IN_PACKET_SIZE;
APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;
APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;
}
else
{
USB_Tx_ptr = APP_Rx_ptr_out;
USB_Tx_length = APP_Rx_length;
APP_Rx_ptr_out += APP_Rx_length;
APP_Rx_length = 0;
}
/* Prepare the available data buffer to be sent on IN endpoint */
DCD_EP_Tx (pdev,
CDC_IN_EP,
(uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
USB_Tx_length);
}
}
return USBD_OK;
}
Затем в недрах драйвера в usbd_cdc_core.c, в завершении передачи пакета, этот флаг сбрасывается.
Запутано немного получилось, но зато работает.
Проблему с неполной передачей пакетов не решил.