STM32-USB
+ -

STM32F407端点

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

端点的初始化

端点的初始化使用DCD_EP_Open函数实现。USB_OTG_EPActivate函数根据对应的配置写寄存器,并使能该端点的中断。

uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev , uint8_t ep_addr, uint16_t ep_mps,uint8_t ep_type)
{
  USB_OTG_EP *ep;

  if ((ep_addr & 0x80) == 0x80)
  {
    ep = &pdev->dev.in_ep[ep_addr & 0x7F];
  }
  else
  {
    ep = &pdev->dev.out_ep[ep_addr & 0x7F];
  }
  ep->num   = ep_addr & 0x7F;

  ep->is_in = (0x80 & ep_addr) != 0;
  ep->maxpacket = ep_mps;
  ep->type = ep_type;
  if (ep->is_in)
  {
    /* Assign a Tx FIFO */
    ep->tx_fifo_num = ep->num;
  }
  /* Set initial data PID. */
  if (ep_type == USB_OTG_EP_BULK )
  {
    ep->data_pid_start = 0;
  }
  USB_OTG_EPActivate(pdev , ep );
  return 0;
}

端点关闭

uint32_t DCD_EP_Close(USB_OTG_CORE_HANDLE *pdev , uint8_t  ep_addr)
{
  USB_OTG_EP *ep;

  if ((ep_addr&0x80) == 0x80)
  {
    ep = &pdev->dev.in_ep[ep_addr & 0x7F];
  }
  else
  {
    ep = &pdev->dev.out_ep[ep_addr & 0x7F];
  }
  ep->num   = ep_addr & 0x7F;
  ep->is_in = (0x80 & ep_addr) != 0;
  USB_OTG_EPDeactivate(pdev , ep );
  return 0;
}

准备接收数据-OUT端点

uint32_t   DCD_EP_PrepareRx( USB_OTG_CORE_HANDLE *pdev,
                            uint8_t   ep_addr,
                            uint8_t *pbuf,                        
                            uint16_t  buf_len)
{
  USB_OTG_EP *ep;

  ep = &pdev->dev.out_ep[ep_addr & 0x7F];

  /*setup and start the Xfer */
  ep->xfer_buff = pbuf;  
  ep->xfer_len = buf_len;
  ep->xfer_count = 0;
  ep->is_in = 0;
  ep->num = ep_addr & 0x7F;

  if (pdev->cfg.dma_enable == 1)
  {
    ep->dma_addr = (uint32_t)pbuf;  
  }

  if ( ep->num == 0 )
  {
    USB_OTG_EP0StartXfer(pdev , ep);
  }
  else
  {
    USB_OTG_EPStartXfer(pdev, ep );
  }
  return 0;
}

OUT端点有独立的FIFO,当每个端点有独立的用户缓冲区。
另外端点0和其它端点使用不同的函数,其主要区别在于端点大小不同。

数据发送-IN端点

uint32_t  DCD_EP_Tx ( USB_OTG_CORE_HANDLE *pdev,
                     uint8_t   ep_addr,
                     uint8_t   *pbuf,
                     uint32_t   buf_len)
{
  USB_OTG_EP *ep;

  ep = &pdev->dev.in_ep[ep_addr & 0x7F];

  /* Setup and start the Transfer */
  ep->is_in = 1;
  ep->num = ep_addr & 0x7F;  
  ep->xfer_buff = pbuf;
  ep->dma_addr = (uint32_t)pbuf;  
  ep->xfer_count = 0;
  ep->xfer_len  = buf_len;

  if ( ep->num == 0 )
  {
    USB_OTG_EP0StartXfer(pdev , ep);
  }
  else
  {
    USB_OTG_EPStartXfer(pdev, ep );
  }
  return 0;
}
  • 对于USB_OTG_EP0StartXfer
方向 xfer_len == 0 0 < xfer_len <= maxpacket xfer_len > maxpacket
IN(发送) 发 ZLP(0 长度) 按实际长度发 截断到 maxpacket
OUT(接收) 准备收一包(maxpacket 强制 = maxpacket 强制 = maxpacket
  • USB_OTG_EPStartXfer,都会向上取整数倍包,并不会截断数据包
xfer_len maxpacket IN 公式 OUT 公式 结果
64 64 127/64=1 127/64=1 1 包
65 64 128/64=2 128/64=2 2 包
100 64 163/64=2 163/64=2 2 包

端点的STALL和CLEAR STALL

uint32_t  DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev, uint8_t   epnum)
{
  USB_OTG_EP *ep;
  if ((0x80 & epnum) == 0x80)
  {
    ep = &pdev->dev.in_ep[epnum & 0x7F];
  }
  else
  {
    ep = &pdev->dev.out_ep[epnum];
  }

  ep->is_stall = 1;
  ep->num   = epnum & 0x7F;
  ep->is_in = ((epnum & 0x80) == 0x80);

  USB_OTG_EPSetStall(pdev , ep);
  return (0);
}

uint32_t  DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum)
{
  USB_OTG_EP *ep;
  if ((0x80 & epnum) == 0x80)
  {
    ep = &pdev->dev.in_ep[epnum & 0x7F];    
  }
  else
  {
    ep = &pdev->dev.out_ep[epnum];
  }

  ep->is_stall = 0;  
  ep->num   = epnum & 0x7F;
  ep->is_in = ((epnum & 0x80) == 0x80);

  USB_OTG_EPClearStall(pdev , ep);
  return (0);
}
本文链接为:http://www.usbzh.com/article/detail-1793.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 篇笔记 写笔记

UAC Feedback端点
下面转一段对USB feedback的理解:这段时间一直在做USB Audio Device(UAC)设备的开发工作。由于UAC采用的是isochronous endpoint来传输数据,对时钟的要求较高。但无奈我们的嵌入式平台的时钟并不准,数据同步就成了问题。经过研究,发现只能使用异步模式来解决......
UVC 视频控制接口中断端点描述符
通过视频控制接口包括用于实现特定类请求的控制端点(默认端点0)用于返回中断状态信息的可选中断状态返回端点。视频控制端点描述符标准的视频控制端点描述符使用端点0来实现标准的中断控制,故无须额外的标准视频控制端点描述符。特定类的视频控制端点描述符使用端点0来实现特定类视频控制,故无须特定类的视频控制端点......
USB设备描述符、配置描述符、接口描述符和端点描述符的拓扑关系
在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。每个USB设备都提供了不同级别的配置信息,可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合(在探测/连接期间需从其中选定一个),配置由多个接口组成。一次只能有一个配置是活动的。大多数的设备只有一个配置和一个接口,当一个设备......
UVC 端点描述符
在USB规范中,端点描述符用于描述设备的端点信息。视频控制接口VC中的端点描述符视频控制接口(VC)的端点描述符可以存在,也可以不存。如果存在,必须是中断类型的,且必须为输入端点。bLength : 描述符大小.固定为0x07.bDescriptorType : 接口描述符类型.固定为0x05.bE......
UVC 视频流端点描述符
视频数据端点可以实现为同步端点或批量端点。等时/同步传输视频端点描述符使用和标准USB设备端点描符同样的数据结构。struct _ENDPOIN_DESCRIPTOR_STRUCT { BYTE bLength; //设备描述符的字节数大小,为0x12 BYTE ......
UAC 标准等时音频数据端点描述符
标准等时音频数据端点描述符:Standard AS Isochronous Audio Data Endpoint Descriptor,用于描述音频数据流的传递方式及方法。标准等时音频数据端点描述符数据结构定义如下:typedef struct _USB_AUDIO_ENDPOINT_DESCRI......
USB 端点描述符
端点描述符USB设备中的每个端点都有自己的端点描述符,由接口描述符中的bNumEndpoint决定其数量struct _ENDPOIN_DESCRIPTOR_STRUCT { BYTE bLength; //设备描述符的字节数大小,为0x7 BYTE bD......
UAC 多源自适应数据端点描述符
仅当自适应源有一个或多个同步音频数据端点时,才存在此描述符类型。typedef struct _USB_AUDIO_ENDPOINT_DESCRIPTOR { UINT8 bLength; UINT8 bDescriptorType; UINT8 bEndpointAddre......
UAC麦克见音频同步端点描述符
UAC音频采用同步传输,故数据传输的端点必须为同步传输。端点描述符的数据结构如下:关于同步传输可详见:http://www.usbzh.com/article/detail-118.html标准端点描述符代码如下:/* USB_DT_ENDPOINT: Endpoint descriptor......
USB端点描述符bInterval的时间周期解释
USB 端点描述符用于描述主机查询端点的时间间隔,这个值根据USB的版本和端点的类型而不同。中断传输同步传输控制传输批量传输低速1-255,单位为ms///全速1-255,单位为ms1-16,2^(N-1)个周期单位//高速1-16,2^(N-......
UAC 类特定等时音频数据端点描述符
类特定等时音频数据端点描述符:Class-Specific AS Isochronous Audio Data Endpoint Descriptor,用于描述标准音频传输端点的属性。类特定等时音频数据端点描述符数据结构定义如下:typedef struct _USB_ASD_ENDPOINT_D......
WinUSB获取USB设备端点信息
使用WinUsb_QueryInterfaceSettings函数获取指定接口下的所有信息,然后解析端点信息并打印。struct PIPE_ID{ UCHAR PipeInId; UCHAR PipeOutId;};BOOL QueryDeviceEndpoints (......
UAC1.0麦克风端点描述符wMaxPacketSize的问题分析
同事搞了一个UAC麦克风,将输入端点设置如下: ----------------- Endpoint Descriptor -----------------bLength : 0x09 (9 bytes)bDescriptorType ......
UAC设备端点符Feedback端点描述符的校验判断
UAC的同步传输可以在同步(1101)和异步(0101)的方式工的时候,可以选择使用一个FeedBack端点进行数据的传输校准。当然,这里的01代表该端点是同步传输方式,其中11代表是同步,01代表的是异步。当然也有一种01代表自适应方式。这些概念可详见:UAC音频设备的同步传输(同步、自适应、......
UVC摄像头dwMaxPayloadTransferSize批量传输与USB端点描述符wMaxPacketSize的关系说明
这个问题是老生常谈了,其实结合以前的文章我们应该能说明白,可详见:USB数据长度为0的DATA/IN事务 https://www.usbzh.com/article/detail-624.htmlUSB2.0 事务 https://www.usbzh.com/article/detail-691......
关注公众号
  • 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 规范
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

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

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