USBD_DataOutStage
2026-08-13
本文链接为:http://www.usbzh.com/article/detail-1786.html ,欢迎转载,转载请附上本文链接。
USBD_DataOutStage是各个端点发收到主机发送的数据的回调。
硬件中断
│
▼
USBD_OTG_ISR_Handler()
│ gintr_status.b.outepintr
▼
DCD_HandleOutEP_ISR()
│ doepint.b.xfercompl → OUT 端点传输完成
│ USBD_DCD_INT_fops->DataOutStage(pdev, epnum)
▼
USBD_DataOutStage(pdev, epnum)
│
├─ epnum == 0 → 处理 EP0 控制传输
│
└─ epnum != 0 → pdev->dev.class_cb->DataOut(pdev, epnum)
代码分析
static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum)
{
USB_OTG_EP *ep;
//端点0
if(epnum == 0)
{
ep = &pdev->dev.out_ep[0];
//端点0处于接收主机数据阶段
if ( pdev->dev.device_state == USB_OTG_EP0_DATA_OUT)
{
//如果没有收全,就继续收数据
if(ep->rem_data_len > ep->maxpacket)
{
ep->rem_data_len -= ep->maxpacket;
if(pdev->cfg.dma_enable == 1)
{
/* in slave mode this, is handled by the RxSTSQLvl ISR */
ep->xfer_buff += ep->maxpacket;
}
USBD_CtlContinueRx (pdev,ep->xfer_buff,MIN(ep->rem_data_len ,ep->maxpacket));
}
else
{
//收完了,就发送0长度数据包
if((pdev->dev.class_cb->EP0_RxReady != NULL)&&(pdev->dev.device_status == USB_OTG_CONFIGURED))
{
//很多时候这是NULL
pdev->dev.class_cb->EP0_RxReady(pdev);
}
//发送0长度数据确认状态包
USBD_CtlSendStatus(pdev);
}
}
}
else if((pdev->dev.class_cb->DataOut != NULL)&& (pdev->dev.device_status == USB_OTG_CONFIGURED))
{
//非0端点直接调用类驱动对应的回调
pdev->dev.class_cb->DataOut(pdev, epnum);
}
return USBD_OK;
}
本文链接为:http://www.usbzh.com/article/detail-1786.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
STM32-USB





