CH32V_USB双缓冲的应用

USB(通用串行总线)通信中,双缓冲端点是一种优化数据传输效率和实时性的关键机制,主要用于批量传输(Bulk Transfer)和同步传输(Isochronous Transfer)场景。

一、双缓冲端点的核心概念与架构

1. 端点与缓冲的定义

  • 端点(Endpoint)USB 设备与主机通信的逻辑通道,每个端点有固定的传输方向(输入 / 输出)和传输类型(控制 / 批量 / 同步 / 中断)。
  • 双缓冲:在端点中配置两个独立的数据缓冲区(Buffer A 和 Buffer B),允许主机或设备在处理一个缓冲区数据的同时,预读取或写入另一个缓冲区,实现 “乒乓操作”。
  • 双缓冲依赖于 USB 控制器的硬件设计,通常包含:
    • 两个物理上独立的 FIFO(先进先出)存储器;
    • 缓冲区切换控制逻辑(由传输完成中断触发)。

2. 硬件实现基础

此表介绍了端点的发送与接收使能位与双缓冲使能的关系,大致总结一下,当每个端点的TX与RX都使能时,

双缓冲模式无效,当只有端点的一个方向使能,且双款冲的BUF_MOD也使能了,双缓冲有效,根据每个端

点的TOG包而决定使用哪一块缓冲区。

 

二、双缓冲端点的工作机制(以批量输出端点为例)

  1. 初始状态
  • 主机向设备发送数据时,首先填充 Buffer A,设备读取 Buffer A 的数据并处理。
  1. 乒乓操作过程
  • Buffer A 数据读取完毕,设备触发中断通知主机,同时切换到 Buffer B;
  • 主机立即向 Buffer B 填充新数据,而设备开始处理 Buffer B 的数据,形成 “发送 - 处理” 并行流程。
  1. 效率提升逻辑
  • 传统单缓冲端点需等待 “数据传输完成→设备处理→主机再发送” 的串行流程;
  • 双缓冲将串行流程变为并行,消除了主机与设备之间的等待时间。
  • 案例对比
    • 单缓冲:假设传输 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 干预,通过硬件缓冲切换提升系统整体性能。

 

posted @ 2025-06-30 17:04  WCH_CH32  阅读(223)  评论(0)    收藏  举报