From f124c3a6855cb8be9517106124d5a41f0813e154 Mon Sep 17 00:00:00 2001 From: XIVN1987 Date: Wed, 4 Jun 2025 22:23:36 +0800 Subject: [PATCH] simplify VCOM code --- CH32V305/obj/DAPLink.bin | Bin 20464 -> 20416 bytes CH32V305/obj/DAPLink.hex | 2501 ++++++++++----------- CH32V305/src/USBD/ch32v30x_usbhs_device.c | 5 - CH32V305/src/vcom_serial.c | 10 +- CH32V305/src/vcom_serial.h | 2 - 5 files changed, 1253 insertions(+), 1265 deletions(-) diff --git a/CH32V305/obj/DAPLink.bin b/CH32V305/obj/DAPLink.bin index ae145bc7d4071d51db5cb22181e7c71ffbc9a5a3..c71f86aa84ea7ba490babfdbe2ed94a4ee7b04ed 100644 GIT binary patch delta 3014 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 = 0; USBHSD->UEP3_TX_CTRL = USBHS_UEP_T_RES_NAK; USBHSD->UEP3_RX_CTRL = USBHS_UEP_R_RES_ACK; - - Vcom.in_ready = 1; } @@ -601,8 +599,6 @@ void USBHS_IRQHandler( void ) case CDC_BULK_IN_EP & 0x0F: USBHSD->UEP3_TX_CTRL = (USBHSD->UEP3_TX_CTRL & ~USBHS_UEP_T_RES_MASK) | USBHS_UEP_T_RES_NAK; USBHSD->UEP3_TX_CTRL ^= USBHS_UEP_T_TOG_DATA1; - - Vcom.in_ready = 1; break; default: @@ -657,7 +653,6 @@ void USBHS_IRQHandler( void ) USBHSD->UEP3_RX_CTRL = (USBHSD->UEP3_RX_CTRL & ~USBHS_UEP_R_RES_MASK) | USBHS_UEP_R_RES_NAK; Vcom.out_bytes = len; - Vcom.out_ready = 1; break; default: diff --git a/CH32V305/src/vcom_serial.c b/CH32V305/src/vcom_serial.c index 68e0348..0092f7f 100644 --- a/CH32V305/src/vcom_serial.c +++ b/CH32V305/src/vcom_serial.c @@ -128,7 +128,7 @@ void VCOM_TransferData(void) static uint32_t last_ms = 0; static uint32_t last_pos = 0; - if(Vcom.in_ready) // 可以向主机发送数据 + if((USBHSD->UEP3_TX_CTRL & USBHS_UEP_T_RES_MASK) == USBHS_UEP_T_RES_NAK) // 可以向主机发送数据 { uint32_t pos = RXDMA_SZ - DMA_GetCurrDataCounter(DMA1_Channel3); if((pos - last_pos >= CDC_BULK_IN_SZ_HS) || ((pos != last_pos) && (SysTick_ms != last_ms))) @@ -141,8 +141,6 @@ void VCOM_TransferData(void) Vcom.in_bytes = pos - last_pos; - Vcom.in_ready = 0; - USBHSD->UEP3_TX_DMA = (uint32_t)&RXBuffer[last_pos]; USBHSD->UEP3_TX_LEN = Vcom.in_bytes; USBHSD->UEP3_TX_CTRL = (USBHSD->UEP3_TX_CTRL & ~USBHS_UEP_T_RES_MASK) | USBHS_UEP_T_RES_ACK; @@ -167,16 +165,16 @@ void VCOM_TransferData(void) xfer_out: /* 从主机接收到数据,且前面的数据 DMA 已发送完 */ - if(Vcom.out_ready && (DMA_GetCurrDataCounter(DMA1_Channel2) == 0)) + if(Vcom.out_bytes && (DMA_GetCurrDataCounter(DMA1_Channel2) == 0)) { - Vcom.out_ready = 0; - memcpy(TXBuffer, USBHS_EP3_Rx_Buf, Vcom.out_bytes); DMA_Cmd(DMA1_Channel2, DISABLE); DMA_SetCurrDataCounter(DMA1_Channel2, Vcom.out_bytes); DMA_Cmd(DMA1_Channel2, ENABLE); + Vcom.out_bytes = 0; + /* Ready for next BULK OUT */ USBHSD->UEP3_RX_CTRL = (USBHSD->UEP3_RX_CTRL & ~USBHS_UEP_R_RES_MASK) | USBHS_UEP_R_RES_ACK; } diff --git a/CH32V305/src/vcom_serial.h b/CH32V305/src/vcom_serial.h index f872311..cd6bb16 100644 --- a/CH32V305/src/vcom_serial.h +++ b/CH32V305/src/vcom_serial.h @@ -17,10 +17,8 @@ typedef struct { uint8_t in_buff[512]; uint16_t in_bytes; - uint16_t in_ready; uint8_t out_buff[512]; uint16_t out_bytes; - uint16_t out_ready; } VCOM; extern volatile VCOM Vcom;