STM32 usb 库不能解析USBHID专用请求吗?

2019-03-23 20:15发布

目前正在移植以前51的一个产品。在控制端点0要用到专用请求 host->device 第一字节0x02(表示专用的ID可以是小于255,不等与零的任意数) ,第二字节 0x02 表示实际的device设备有几个(在报告描述里有几个就是几个 可以是大于等于1 ,小于等于255),第三字节0xef,是houst给device的标识符。
在STM32 USB库中的USB的枚举过程是:void CTR_LP(void)函数判断是端点0还是非零端点,再以NAK,ACK来回应HOUST,在houst一直没有处于接收状态有三种方式:一、In0_Process()输入包,二、Setup0_Process();端点零的建立包,通常我们的USBHID枚举过程从这里开始,三、Out0_Process()输出包。但是我现在要解析host->device 的三个字节 0x02 0x02 0xef,在方式二下没有得到,通过PC机上的USB Mniter软件看到的却是发了数据包的。同时在u8 Out0_Process(void){          else if (ControlState == WAIT_STATUS_OUT)
                  {
                     Dputc(0x22);       
                    (*pProperty->Process_Status_OUT)();
                    ControlState = STALLED;
                  }
                                }函数监控发现控制状态为暂停。为什么呢?
附:端点0中断
  else        //in包SETUP包或者OUT包
      {
        /* DIR = 1 */

        /* DIR = 1 & CTR_RX       => SETUP or OUT int */
        /* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */

        wEPVal = _GetENDPOINT(ENDP0); //端点0的状态
        if ((wEPVal & EP_CTR_TX) != 0)
        {
          _ClearEP_CTR_TX(ENDP0);
                  Dputc(0x66);
          In0_Process();
          /* before terminate set Tx & Rx status */
          _SetEPRxStatus(ENDP0, SaveRState);
          _SetEPTxStatus(ENDP0, SaveTState);
          return;
        }
        else if ((wEPVal &EP_SETUP) != 0)
        {
          _ClearEP_CTR_RX(ENDP0); /* SETUP bit kept frozen while CTR_RX = 1 */
          Setup0_Process();
          /* before terminate set Tx & Rx status */
          _SetEPRxStatus(ENDP0, SaveRState);
          _SetEPTxStatus(ENDP0, SaveTState);
          return;
        }

        else if ((wEPVal & EP_CTR_RX) != 0)
        {
          _ClearEP_CTR_RX(ENDP0);
          Out0_Process();
                  Dputc(0x44);
          /* before terminate set Tx & Rx status */
          _SetEPRxStatus(ENDP0, SaveRState);
          _SetEPTxStatus(ENDP0, SaveTState);
          return;
        }
      }
    }/* if(EPindex == 0) */ 此帖出自小平头技术问答
0条回答

一周热门 更多>