liusheng1097 2022-10-20 10:49 采纳率: 0%
浏览 44

STM32F407虚拟串口端点

为什么STM32F407的虚拟串口实验,配置的两个端点1 是双向端点 OUT1 IN1 设置为批量传输端点

在实际工程中 采取的是判断为 同步端点的方式,进行传输?

用代码块功能插入代码,请勿粘贴截图
USB_OTG_STS USB_OTG_EPStartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep)// 端点开始传输函数  ep.xfer_buffer已经有所指了 就是 char 数组的成员
{//但是使用的时候,得让它写到地址上吧, 结构体顺序放成员?
  USB_OTG_STS status = USB_OTG_OK;
  USB_OTG_DEPCTL_TypeDef     depctl;
  USB_OTG_DEPXFRSIZ_TypeDef  deptsiz;//这俩变量常规 操作 端点  在准备控制端点函数中 是使能端点 和配置packetsiz e
  USB_OTG_DSTS_TypeDef       dsts;    
  uint32_t fifoemptymsk = 0;  
  
  depctl.d32 = 0;
  deptsiz.d32 = 0;
  /* IN endpoint */
  if (ep->is_in == 1)
  {
    depctl.d32  = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPCTL));//读取整个端点控制寄存器 
        /* 32位 端点使能 ,置1启动端点数据发送*/
    deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ));
    /* Zero Length Packet? */
    if (ep->xfer_len == 0)
    {
      deptsiz.b.xfersize = 0;
      deptsiz.b.pktcnt = 1;
    }
    else//长度非0 就有数据要发了
    {
      /* Program the transfer size and packet count 编程传输大小和包计数
      * as follows: xfersize = N * maxpacket +
      * short_packet pktcnt = N + (short_packet
      * exist ? 1 : 0)
      */
      deptsiz.b.xfersize = ep->xfer_len;
      deptsiz.b.pktcnt = (ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket;//  包计数= 长度 / 包最大数量 就是此次传输要发多少个包
      
      if (ep->type == EP_TYPE_ISOC)
      {
        deptsiz.b.mc = 1;
      }       
    }
    USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ, deptsiz.d32);//就是把数据写到其他端点里面  pkycnt变量还真是一次传输包含的数据包数
        
        
        //但是内容 数据指向没有明确 没有给到发送端点FIFO 起码  
        
    if (pdev->cfg.dma_enable == 1)
    {
      USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPDMA, ep->dma_addr);//DMA操作 只是确定源和目标,并没有真正采用DMA
    }//注释此行代码,可以有OUT传输,但是没法 进行 IN传输的 OUT的返回值,说明IN传输 需要用到DMA方式
    else//非dma
    {
      if (ep->type != EP_TYPE_ISOC)//非同步端点  批量传输
      {
        /* Enable the Tx FIFO Empty Interrupt for this EP  使能此端点的 发送FIFO空中断*/
        if (ep->xfer_len > 0)
        {//这里传入的参数不涉及数据,只有一点配置。
          fifoemptymsk = 1 << ep->num;  //1左移端点号 就是 屏蔽寄存器从0位是端点0 1位是端点1   0010就是端点1 
          USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk);//使能该端点中断 寄存器是INFIFO空中断屏蔽寄存器 用于控制INFIFO空中断的生成
        }//操作的是 中断屏蔽寄存器
      }
    }
    
    
    if (ep->type == EP_TYPE_ISOC)//同步传输
    {
      dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS);
      
      if (((dsts.b.soffn)&0x1) == 0)
      {
        depctl.b.setd1pid = 1;
      }
      else
      {
        depctl.b.setd0pid = 1;//设置一下 pid
      }
    } 
    
    /* EP enable, IN data in FIFO  端点使能 IN端点在FIFO */
    depctl.b.cnak = 1;
    depctl.b.epena = 1;//使能端点  启动数据发送 在这的数据也就直接发送 使能了端点发送就直接发送? 我想看到端点发送fifo
    USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPCTL, depctl.d32); //写到中断控制寄存器 使能端点x的中断控制寄存器 
    //"应用程序将此位置 1 以在端点上启动数据发送。"
        
        
    if (ep->type == EP_TYPE_ISOC)
    {
      USB_OTG_WritePacket(pdev, ep->xfer_buff, ep->num, ep->xfer_len);   
    }    //注释此行,同样可以IN,无法返还
  }

运行结果及报错内容
我的解答思路和尝试过的方法 批量端点难道在某处修改了? 不然不可能进入if判断同步端点并执行?
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-25 19:49
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月20日

悬赏问题

  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Linux权限管理相关操作(求解答)
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表
  • ¥15 DbVisualizer Pro 12.0.7 sql commander光标错位 显示位置与实际不符
  • ¥15 android 打包报错
  • ¥15 关于stm32的问题
  • ¥15 ncode振动疲劳分析中,noisefloor如何影响PSD函数?