CH32V_USB双缓冲的应用
在 USB(通用串行总线)通信中,双缓冲端点是一种优化数据传输效率和实时性的关键机制,主要用于批量传输(Bulk Transfer)和同步传输(Isochronous Transfer)场景。
一、双缓冲端点的核心概念与架构
1. 端点与缓冲的定义
- 端点(Endpoint):USB 设备与主机通信的逻辑通道,每个端点有固定的传输方向(输入 / 输出)和传输类型(控制 / 批量 / 同步 / 中断)。
- 双缓冲:在端点中配置两个独立的数据缓冲区(Buffer A 和 Buffer B),允许主机或设备在处理一个缓冲区数据的同时,预读取或写入另一个缓冲区,实现 “乒乓操作”。
- 双缓冲依赖于 USB 控制器的硬件设计,通常包含:
- 两个物理上独立的 FIFO(先进先出)存储器;
- 缓冲区切换控制逻辑(由传输完成中断触发)。
2. 硬件实现基础

此表介绍了端点的发送与接收使能位与双缓冲使能的关系,大致总结一下,当每个端点的TX与RX都使能时,
双缓冲模式无效,当只有端点的一个方向使能,且双款冲的BUF_MOD也使能了,双缓冲有效,根据每个端
点的TOG包而决定使用哪一块缓冲区。
二、双缓冲端点的工作机制(以批量输出端点为例)
- 初始状态:
- 主机向设备发送数据时,首先填充 Buffer A,设备读取 Buffer A 的数据并处理。
- 乒乓操作过程:
- 当 Buffer A 数据读取完毕,设备触发中断通知主机,同时切换到 Buffer B;
- 主机立即向 Buffer B 填充新数据,而设备开始处理 Buffer B 的数据,形成 “发送 - 处理” 并行流程。
- 效率提升逻辑:
- 传统单缓冲端点需等待 “数据传输完成→设备处理→主机再发送” 的串行流程;
- 双缓冲将串行流程变为并行,消除了主机与设备之间的等待时间。
- 案例对比:
- 单缓冲:假设传输 1MB 数据,每次传输 1KB 需 1ms(含传输 + 处理),总耗时 1000ms;
- 双缓冲:传输与处理并行,每次传输 1KB 仅需 0.5ms(传输与处理各 0.5ms 重叠),总耗时约 500ms,吞吐量提升近 1 倍。
- 原理:双缓冲消除了 “传输等待处理” 的时间间隙,使总线利用率从 50% 提升至接近 100%。
- 在实时性要求高的场景(如 USB 音频、工业控制)中:
- 单缓冲可能因 “处理延迟” 导致数据队列积压,产生卡顿;
- 双缓冲允许新数据提前进入缓冲区,确保设备持续获取数据,延迟波动可降低 50% 以上。
- 同步传输场景(如摄像头视频流):
- 双缓冲确保视频帧数据 “边接收边处理”,避免因单缓冲导致的帧丢失或显示卡顿;
- 例如 USB 摄像头通过双缓冲端点实现 30fps 以上的流畅传输。
三、以CH32V307为例,介绍双缓冲的配置。
CH372Device_Double_Buffering此demo为例:
1.
void USBHS_Device_Init ( FunctionalState sta )
初始化函数中的相关处理。

USBHSD->ENDP_CONFIG = USBHS_UEP2_T_EN | USBHS_UEP4_T_EN | USBHS_UEP6_T_EN |
USBHS_UEP1_R_EN | USBHS_UEP3_R_EN | USBHS_UEP5_R_EN; //注释1:仅使能每个端点的一个方向(发送或者接收)
USBHSD->UEP1_RX_DMA = (uint32_t)(uint8_t *)USBHS_EP1_Rx_Buf0;
USBHSD->UEP1_TX_DMA = (uint32_t)(uint8_t *)USBHS_EP1_Rx_Buf1;
USBHSD->UEP2_TX_DMA = (uint32_t)(uint8_t *)USBHS_EP2_Tx_Buf0;
USBHSD->UEP2_RX_DMA = (uint32_t)(uint8_t *)USBHS_EP2_Tx_Buf1;
USBHSD->UEP3_RX_DMA = (uint32_t)(uint8_t *)USBHS_EP3_Rx_Buf0;
USBHSD->UEP3_TX_DMA = (uint32_t)(uint8_t *)USBHS_EP3_Rx_Buf1;
USBHSD->UEP5_RX_DMA = (uint32_t)(uint8_t *)USBHS_EP5_Rx_Buf;
USBHSD->UEP4_TX_DMA = (uint32_t)(uint8_t *)USBHS_EP4_Tx_Buf0;
USBHSD->UEP4_RX_DMA = (uint32_t)(uint8_t *)USBHS_EP4_Tx_Buf1;
USBHSD->UEP6_TX_DMA = (uint32_t)(uint8_t *)USBHS_EP6_Tx_Buf;
//注释2 :上面将每个端点的TX与RX的DMA地址的buf都配置了,起效的只有一个方向,由上面的注释1中的配置决定 USBHSD->BUF_MODE = USBHS_UEP1_BUF_MOD | USBHS_UEP2_BUF_MOD | USBHS_UEP3_BUF_MOD | USBHS_UEP4_BUF_MOD;//注释3:使能对应的双缓冲端点。
2.
void USBHS_IRQHandler( void )
中断中的对应双缓冲的判断处理。1)接收端点

if (USBHSD->UEP1_RX_CTRL & USBHS_UEP_R_TOG_DATA1)//通过DATA0/DATA1判断是哪块缓冲区有数据接收。
{ // DATA0
USBHS_Endp_Busy[DEF_UEP2] |= 0x01;
for (i = 0; i < len; i++)
{
USBHS_EP2_Tx_Buf0[i] = USBHS_EP1_Rx_Buf0[i];
}
}
else
{ // DATA1
USBHS_Endp_Busy[DEF_UEP2] |= 0x02;
for (i = 0; i < len; i++)
{
USBHS_EP2_Tx_Buf1[i] = USBHS_EP1_Rx_Buf1[i];
}
}
2)发送端点

if (USBHSD->UEP4_TX_CTRL & USBHS_UEP_T_TOG_DATA1)//通过判断DATA0/DATA1的翻转决定哪块缓冲区是空闲的。
{ /* DATA0 */
USBHS_Endp_Busy[ DEF_UEP4 ] &= ~0x01;
}
else
{ /* DATA1 */
USBHS_Endp_Busy[ DEF_UEP4 ] &= ~0x02;
}
四、总结:双缓冲端点的核心价值
双缓冲端点通过 “乒乓操作” 实现了 USB 数据传输与处理的并行化,其核心作用可概括为:
- 效率层面:将串行传输变为并行,吞吐量翻倍,适合大数据量高速传输;
- 实时性层面:消除缓冲区等待延迟,确保数据流连续,适用于音频、视频等实时场景;
- 资源层面:减少主机 CPU 干预,通过硬件缓冲切换提升系统整体性能。
浙公网安备 33010602011771号