搜索
bottom↓
回复: 6

STM32F2 USB 设备 BULK IN中断是如何产生的?

[复制链接]

出0入0汤圆

发表于 2013-10-12 16:05:48 | 显示全部楼层 |阅读模式
本帖最后由 cf5257 于 2013-10-12 16:28 编辑

STM32F2 USB 设备 BULK IN中断是如何产生的?
主机直接要求读取N个字节可以么?
我用上位机要求EP1 bulk in 64B,在STM32程序仿真时DATAIN处设置断点发现根本没有中断进去
控制传输和BULK OUT都OK,就是这个BULK IN没反应:Bus Hound截图如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-10-12 16:32:11 | 显示全部楼层
上位机发送EP1 BULK IN请求后,程序不能进到非EP0的IN处理里面去。
具体就是usbd_core.c文件下面代码处:
static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum)
{
  USB_OTG_EP *ep;
  
  if(epnum == 0)
  {
    ep = &pdev->dev.in_ep[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 ))
        {
         
          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)&&                          /*上位机发送EP1 BULK IN请求后,程序不能进到这里面去*/
          (pdev->dev.device_status == USB_OTG_CONFIGURED))

  {
    pdev->dev.class_cb->DataIn(pdev, epnum);
  }  
  return USBD_OK;
}
  

出0入0汤圆

发表于 2015-1-18 12:18:04 | 显示全部楼层
楼主搞定了吗?貌似设备发送完后进入该函数
主机发送设备接收时,
接收完成,会进入pdev->dev.class_cb->Dataout,那么在该函数中处理接收到的数据,是正确的。
当主机要数据时,即设备发送到主机,那么像楼主说的,主机发送BULK IN请求后,是不能进入pdev->dev.class_cb->DataIn,因为该函数是发送完成才进入。

那么设备主动发送数据后,主机再发送BULK IN,即可发送完成,进入pdev->dev.class_cb->DataIn,此时因为已经发送完成,反而没什么事做(如果有后续数据发送可以在这里发)

那么设备怎么知道主机什么时间要求BULK IN,而主动开始传输数据呢??

我遇到的问题与楼主一样,要设备主动发送才能完成通信,而不是接收到主机请求才发送数据

出0入0汤圆

发表于 2020-9-9 14:52:09 | 显示全部楼层
请问楼主解决掉这个问题了吗?我使用custom HID bulk out可以成功,但是bulk in就不行

出0入0汤圆

发表于 2020-9-9 14:53:12 | 显示全部楼层
superganbu 发表于 2015-1-18 12:18
楼主搞定了吗?貌似设备发送完后进入该函数
主机发送设备接收时,
接收完成,会进入pdev->dev.class_cb->Da ...

请问解决掉这个问题了吗?我使用custom HID bulk out可以成功,但是bulk in就不行

出0入0汤圆

发表于 2020-9-9 16:40:32 | 显示全部楼层
上位机运行了usb_bulk_read()后,下位机无法进入USBD_OTG_Hanler()的retval |= DCD_HandleInEP_ISR(pdeV);(usb_dcd_ini.c)的中断.

出0入0汤圆

发表于 2020-10-1 18:16:10 | 显示全部楼层
USB是主从协议,发觉很多人都知其然而不知其所以然,所谓主从协议就是说所有的传输都是由主机发起的,从机只能等待,等待到什么时候呢?大家都知道王宝钏苦守寒窑十八年吧?对了!如果薛平贵(主机)没有回来(发起传输),那么王宝钏(从机),只能苦苦等待,别无他法.
所以不管是 BULK IN,还是BULK OUT,都要等主机发起传输,如果是BULK OUT,一般使用者不会搞错,因为知道要等待OUT中断接收资料,但是 IN传输时常常会忽略了本身是从机的脚色,什么意思呢?王宝钏不知道薛平贵何时回来,所以每天要梳妆打扮(IN传输,从机要资料送到USB缓冲区),等待薛平贵的招唤,所以从机只能是乖乖的先准备好资料在USB的缓冲器,等主机来时就可以接收回去,等主机完成这次传输,从机才会接收到中断,所以BULK IN产生中断时,代表着主机已经把从机的资料接收到了,所以重点就是所有IN传输,从机都要先准备好资料后,再等待主机随时来接收,很多人都忘了要先把资料传入USB缓冲器,那当然就算主机有发起IN传输,每次得到的结果都是NACK,因为没有资料可获得,而从机还是在傻傻的等待中断,主机没有接收到资料永远都无法完成传输
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 19:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表