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 | 共享 | 共享 | 共享 | 共享 |
本文链接为:http://www.usbzh.com/article/detail-1792.html ,欢迎转载,转载请附上本文链接。对于端点0x00和0X80,通过写信号区分
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
STM32-USB





