STM32-USB
+ -

STM32端点FIFO读写数据

2026-08-14 本文链接为:http://www.usbzh.com/article/detail-1792.html ,欢迎转载,转载请附上本文链接。

/**
* @brief  USB_OTG_WritePacket : Writes a packet into the Tx FIFO associated 
*         with the EP
* @param  pdev : Selected device
* @param  src : source pointer
* @param  ch_ep_num : end point number
* @param  bytes : No. of bytes
* @retval USB_OTG_STS : status
*/
USB_OTG_STS USB_OTG_WritePacket(USB_OTG_CORE_HANDLE *pdev, 
                                uint8_t             *src, 
                                uint8_t             ch_ep_num, 
                                uint16_t            len)
{
  USB_OTG_STS status = USB_OTG_OK;
  if (pdev->cfg.dma_enable == 0)
  {
    uint32_t count32b= 0 , i= 0;
    __IO uint32_t *fifo;

    count32b =  (len + 3) / 4;
    fifo = pdev->regs.DFIFO[ch_ep_num];
    for (i = 0; i < count32b; i++, src+=4)
    {
      USB_OTG_WRITE_REG32( fifo, *((__packed uint32_t *)src) );
    }
  }
  return status;
}


/**
* @brief  USB_OTG_ReadPacket : Reads a packet from the Rx FIFO
* @param  pdev : Selected device
* @param  dest : Destination Pointer
* @param  bytes : No. of bytes
* @retval None
*/
void *USB_OTG_ReadPacket(USB_OTG_CORE_HANDLE *pdev, 
                         uint8_t *dest, 
                         uint16_t len)
{
  uint32_t i=0;
  uint32_t count32b = (len + 3) / 4;

  __IO uint32_t *fifo = pdev->regs.DFIFO[0];

  for ( i = 0; i < count32b; i++, dest += 4 )
  {
    *(__packed uint32_t *)dest = USB_OTG_READ_REG32(fifo);

  }
  return ((void *)dest);
}

可见,对于IN端点,每个端点独享一个独立的FIFO,因为主机接收数据可以并行。但主机发送数据OUT是串行的,所对于OUT端点各个端点共享一个FIFO.

  • 数据到达 Rx FIFO 后,硬件会在状态队列 GRXSTSP 里记录”这包数据属于哪个端点”。所以读数据时 只有一个入口 DFIFO[0] ,读完一包,去读状态队列就知道是哪个端点的数据了。
  • DFIFO[0] 这个寄存器地址被 复用了 ——硬件根据你是”读”还是”写”,路由到不同的物理 FIFO:

在 AHB/APB 总线上,读和写是不同的总线事务——通过 HWRITE 信号区分(0=读,1=写)。硬件对这个信号译码,把同一地址的访问路由到不同物理 FIFO:

地址相同(DFIFO[0])
   │
   ├─ HWRITE=1(写)→ Tx FIFO 0(EP0 IN)
   └─ HWRITE=0(读)→ Rx FIFO(全局共享)

这是硬件 IP 里很常见的”读写复用寄存器“设计,目的就是省地址空间——一个地址位置,靠读写方向当”附加选择位”,访问两个物理资源。

独立 vs 共享 原因
Tx FIFO(IN) 独立 每端点一个 各端点可能同时发送,独立 FIFO 避免互相阻塞(比如 MSC 的 IN 端点发大块数据时,不能阻塞 EP0 的控制传输
Rx FIFO(out) 共享 全局一个 主机发来的数据是串行到达的(USB 总线半双工),同一时刻只有一包,没必要每个端点各备一个 FIFO,共享省硅面积
方向 0x80 0x81 0x82 0x83..
FIFO 独享 独享 独享 独享
方向 0x00 0x01 0x02 0x03..
FIFO 共享 共享 共享 共享

对于端点0x00和0X80,通过写信号区分

本文链接为:http://www.usbzh.com/article/detail-1792.html ,欢迎转载,转载请附上本文链接。

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936     USB技术交流3:1031974172

0 篇笔记 写笔记

STM32端点FIFO读写数据
/*** @brief USB_OTG_WritePacket : Writes a packet into the Tx FIFO associated * with the EP* @param pdev : Selected device* @param src......
关注公众号
  • HID人机交互
  • Linux&USB
  • Linux-USB百科
  • MIDI V1.0
  • TinyUSB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB3测试
  • USB3知识点
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • USB资源
  • XHCI 1.2b 规范
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!