summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxiaowine <[email protected]>2026-08-12 18:35:59 +0800
committersakumisu <[email protected]>2026-08-12 18:50:04 +0800
commit639a4760f7e1222a41cca5a7f296f681e0d258ff (patch)
treeed0ec20c393791407fbfdd9d6ee0c1c7a914e6a9
parenta6adc3b1fec70f7bc84a17d7db6ee04dd059d1f1 (diff)
fix(ch32fs): SETUP 中断固定 NAK EP0,支持 CH32L103
CH32FS IP 的 SETUP 中断触发时,INT_ST 端点字段不总为 0(在 CH32L103 和 CH32V203 上实测约 50% 为 4,来自上一次批量事务的残留)。原代码 USB_SET_RX_CTRL(ep_idx, NAK) 会写错 UEP{ep_idx} 寄存器,导致 EP0 停留在 ACK 状态,Windows 存储栈挂载设备前会卡约 20 秒。 (可能影响所有使用 CH32FS IP 的 MCU,但仅在 CH32L103/CH32V203 上验证) 改为固定 NAK EP0(索引 0),并同时 NAK TX 和 RX。其中 TX NAK 一行对 CH32L103 是必需的,缺少会导致设备枚举失败(Windows 设备管理器 Code 10); WCH CH32FS IP 的 MCU 官方 EVM 代码也都是同时两行 NAK,且官方 SETUP 处理代码同样固定使用 EP0(索引 0)。 同时在支持列表中加入 CH32L103(使用 USBFS)。CH32V20X 有两个 USB IP: USBD(用 fsdev,与 F103 相同)和 USBFS(用 ch32fs),已在 port/ch32/README.md 中说明。
-rw-r--r--port/ch32/README.md2
-rw-r--r--port/ch32/ch32fs/usb_dc_usbfs.c3
2 files changed, 3 insertions, 2 deletions
diff --git a/port/ch32/README.md b/port/ch32/README.md
index 68a1ab76..da734e84 100644
--- a/port/ch32/README.md
+++ b/port/ch32/README.md
@@ -4,7 +4,7 @@
## CH32FS
-- CH32V30X/CH32V20X/CH32V10X/CH32X035
+- CH32V30X/CH32V20X(USBFS, USBD 用 fsdev)/CH32V10X/CH32X035/CH32L103
## CH32HS
diff --git a/port/ch32/ch32fs/usb_dc_usbfs.c b/port/ch32/ch32fs/usb_dc_usbfs.c
index 8047d42d..f4761f67 100644
--- a/port/ch32/ch32fs/usb_dc_usbfs.c
+++ b/port/ch32/ch32fs/usb_dc_usbfs.c
@@ -271,7 +271,8 @@ void USBD_IRQHandler(uint8_t busid)
switch (token) {
case USBFS_UIS_TOKEN_SETUP:
- USB_SET_RX_CTRL(ep_idx, USBFS_UEP_R_RES_NAK);
+ USB_SET_TX_CTRL(0, USBFS_UEP_T_RES_NAK);
+ USB_SET_RX_CTRL(0, USBFS_UEP_R_RES_NAK);
usbd_event_ep0_setup_complete_handler(0, (uint8_t *)&g_ch32_usbfs_udc.setup);
break;