USBD_DataInStage
2026-08-13
本文链接为:http://www.usbzh.com/article/detail-1788.html ,欢迎转载,转载请附上本文链接。
static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum)
{
USB_OTG_EP *ep;
//端点0
if(epnum == 0)
{
ep = &pdev->dev.in_ep[0];
//端点0处于向主机发送数据阶段
if ( pdev->dev.device_state == USB_OTG_EP0_DATA_IN)
{
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 TxFifoEmpty ISR */
ep->xfer_buff += ep->maxpacket;
}
USBD_CtlContinueSendData (pdev,ep->xfer_buff,ep->rem_data_len);//继续发送
}
else
{ /* last packet is MPS multiple, so send ZLP packet */
if((ep->total_data_len % ep->maxpacket == 0) &&(ep->total_data_len >= ep->maxpacket) &&(ep->total_data_len < ep->ctl_data_len ))
{
//发送0数据包,告诉主机发送完了
//1.total_data_len % maxpacket == 0 实际数据长度刚好是 maxpacket 的整数倍
//2.total_data_len >= maxpacket 实际数据至少有 1 个满包
//3.otal_data_len < ctl_data_len 实际数据少于主机请求的数量(这是最关键的条件:主机期待的数据比设备实际有的多,设备需要"提前终止"传输)
USBD_CtlContinueSendData(pdev , NULL, 0);
ep->ctl_data_len = 0;
}
else
{
if((pdev->dev.class_cb->EP0_TxSent != NULL)&&(pdev->dev.device_status == USB_OTG_CONFIGURED))
{
pdev->dev.class_cb->EP0_TxSent(pdev);
}
USBD_CtlReceiveStatus(pdev);//等待接收状态
}
}
}
if (pdev->dev.test_mode == 1)
{
USBD_RunTestMode(pdev);
pdev->dev.test_mode = 0;
}
}
//其它端点,调用类回调
else if((pdev->dev.class_cb->DataIn != NULL)&& (pdev->dev.device_status == USB_OTG_CONFIGURED))
{
pdev->dev.class_cb->DataIn(pdev, epnum);
}
return USBD_OK;
}
本文链接为:http://www.usbzh.com/article/detail-1788.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





