@@ -51,8 +51,9 @@ __IO uint32_t GetRxCount;
51
51
__IO uint32_t lineState = 0 ;
52
52
uint8_t cptlineState = 0 ;
53
53
volatile uint32_t USB_received = 0 ;
54
- uint8_t USBBuffer [64 ];
54
+ uint8_t USBBuffer [USB_MAX_EP0_SIZE ];
55
55
uint8_t USBPackSize ;
56
+ bool sendZLP = false;
56
57
57
58
stimer_t CDC_TimHandle ;
58
59
@@ -293,6 +294,7 @@ void CDC_TIM_PeriodElapsedCallback(stimer_t *htim)
293
294
{
294
295
UNUSED (htim );
295
296
uint8_t status ;
297
+ uint16_t transferSize ;
296
298
297
299
if (USB_received ) {
298
300
USB_received = 0 ;
@@ -311,33 +313,38 @@ void CDC_TIM_PeriodElapsedCallback(stimer_t *htim)
311
313
USBD_CDC_ReceivePacket (& hUSBD_Device_CDC );
312
314
}
313
315
314
- if (UserTxBufPtrOut != UserTxBufPtrIn ) {
315
- if ( UserTxBufPtrOut > UserTxBufPtrIn ) { /* Roll-back */
316
- memcpy ((uint8_t * )& StackTxBuffer [0 ], (uint8_t * )& UserTxBuffer [UserTxBufPtrOut ], ( APP_TX_DATA_SIZE - UserTxBufPtrOut ) );
316
+ if (UserTxBufPtrOut > UserTxBufPtrIn ) { /* Roll-back */
317
+ memcpy (( uint8_t * ) & StackTxBuffer [ 0 ], ( uint8_t * ) & UserTxBuffer [ UserTxBufPtrOut ], ( APP_TX_DATA_SIZE - UserTxBufPtrOut ));
318
+ memcpy ((uint8_t * )& StackTxBuffer [APP_TX_DATA_SIZE - UserTxBufPtrOut ], (uint8_t * )& UserTxBuffer [0 ], UserTxBufPtrIn );
317
319
318
- memcpy (( uint8_t * ) & StackTxBuffer [ APP_TX_DATA_SIZE - UserTxBufPtrOut ], ( uint8_t * ) & UserTxBuffer [ 0 ], UserTxBufPtrIn );
320
+ transferSize = ( APP_TX_DATA_SIZE - UserTxBufPtrOut + UserTxBufPtrIn );
319
321
320
- USBD_CDC_SetTxBuffer (& hUSBD_Device_CDC , (uint8_t * )& StackTxBuffer [0 ], (APP_TX_DATA_SIZE - UserTxBufPtrOut + UserTxBufPtrIn ));
322
+ USBD_CDC_SetTxBuffer (& hUSBD_Device_CDC , (uint8_t * )& StackTxBuffer [0 ], transferSize );
323
+ }
324
+ else if (UserTxBufPtrOut != UserTxBufPtrIn ) {
325
+ transferSize = (UserTxBufPtrIn - UserTxBufPtrOut );
321
326
322
- do {
323
- status = USBD_CDC_TransmitPacket (& hUSBD_Device_CDC );
324
- } while (status == USBD_BUSY );
327
+ USBD_CDC_SetTxBuffer (& hUSBD_Device_CDC , (uint8_t * )& UserTxBuffer [UserTxBufPtrOut ], transferSize );
328
+ }
329
+ else if (sendZLP ) {
330
+ transferSize = 0 ;
325
331
326
- if (status == USBD_OK ) {
327
- UserTxBufPtrOut = UserTxBufPtrIn ;
328
- }
329
- }
330
- else {
331
- USBD_CDC_SetTxBuffer (& hUSBD_Device_CDC , (uint8_t * )& UserTxBuffer [UserTxBufPtrOut ], (UserTxBufPtrIn - UserTxBufPtrOut ));
332
+ USBD_CDC_SetTxBuffer (& hUSBD_Device_CDC , NULL , 0 );
333
+ } else {
334
+ return ;
335
+ }
332
336
333
- do {
337
+ do {
338
+ if (lineState == 0 ) // Device disconnected
339
+ status = USBD_OK ;
340
+ else
334
341
status = USBD_CDC_TransmitPacket (& hUSBD_Device_CDC );
335
- } while (status == USBD_BUSY );
342
+ } while (status == USBD_BUSY );
336
343
337
- if (status == USBD_OK ) {
338
- UserTxBufPtrOut = UserTxBufPtrIn ;
339
- }
340
- }
344
+ if (status == USBD_OK ) {
345
+ UserTxBufPtrOut = UserTxBufPtrIn ;
346
+
347
+ sendZLP = transferSize % USB_MAX_EP0_SIZE == 0 ;
341
348
}
342
349
}
343
350
0 commit comments