dazhige 发表于 2019-5-11 12:00:23

STM32F407 USB HOST HID部分鼠标键盘无法读取数据

初学STM32F4 USB,现在使用正点原子USB HID鼠标键盘例程,该历程使用2.1的库,调试发现手里的鼠标(一个有线,一个无线)可以识别,也能进键盘或鼠标的初始化程序,但是之后动键鼠就无法收到任何数据(仿真发现压根不会进解码函数)。这是支持的鼠标串口信息:检测到USB设备插入!

复位设备...
低速(LS)USB设备!

VID: 18F8h
PID: 0F97h
从机地址分配成功!

HID 设备!
Manufacturer: N/A
Product: USB OPTICAL MOUSE
Serial Number: N/A

设备枚举完成!

跳过用户确认步骤!

USB Connected    USB MouseBUTTON:X POS:Y POS:Z POS:btn,X,Y,Z:0x1,0,-11,0
btn,X,Y,Z:0x1,0,-6,0

btn,X,Y,Z:0x1,0,-3,0
btn,X,Y,Z:0x1,0,-2,0
btn,X,Y,Z:0x1,0,-1,0这是不支持的鼠标串口信息:检测到USB设备插入!

复位设备...
全速(FS)USB设备!

VID: 1D57h
PID: AD03h
从机地址分配成功!

HID 设备!
Manufacturer: SOAI
Product: Gaming Mouse
Serial Nu
mber: N/A
设备枚举完成!

跳过用户确认步骤!

USB Connected    USB Mouse

继续仿真后发现在 USB_OTG_USBH_handle_hc_n_In_ISR()函数中支持的键鼠在有数据时会进入else if (hcint.b.xfercompl)
{
........
pdev->host.URB_State = URB_DONE;
}

然后由 URB_DONE标志就可以进入解码函数,但不支持的键鼠却不会进入该 if 语句。和支持的键盘对比也没发现进入了其他语句,再查询发现条件 else if (hcint.b.xfercompl) 貌似是读取的寄存器中的值(对这一块完全小白),在该函数开始部分由这一串语句给出:
hcreg = pdev->regs.HC_REGS;
hcint.d32 = USB_OTG_READ_REG32(&hcreg->HCINT);
hcintmsk.d32 = USB_OTG_READ_REG32(&hcreg->HCINTMSK);
hcint.d32 = hcint.d32 & hcintmsk.d32;
hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS->HCCHAR);
hcintmsk.d32 = 0;这是USB_OTG_READ_REG32的宏定义:
#define USB_OTG_READ_REG32(reg)(*(__IO uint32_t *)reg)
到这里就找不到头绪了。对了,好像支持的都是低速设备,不支持的都是全速设备,不知道这里有什么影响没有。具体的USB_OTG_USBH_handle_hc_n_In_ISR()函数在后面。
/*******************USB_OTG_USBH_handle_hc_n_In_ISR()函数 **********************************/
uint32_t USB_OTG_USBH_handle_hc_n_In_ISR (USB_OTG_CORE_HANDLE *pdev , uint32_t num)
{
USB_OTG_HCINTn_TypeDef   hcint;
USB_OTG_HCINTMSK_TypeDefhcintmsk;
USB_OTG_HCCHAR_TypeDef   hcchar;
USB_OTG_HCTSIZn_TypeDefhctsiz;
USB_OTG_HC_REGS *hcreg;


hcreg = pdev->regs.HC_REGS;
hcint.d32 = USB_OTG_READ_REG32(&hcreg->HCINT);
hcintmsk.d32 = USB_OTG_READ_REG32(&hcreg->HCINTMSK);
hcint.d32 = hcint.d32 & hcintmsk.d32;
hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS->HCCHAR);
hcintmsk.d32 = 0;


if (hcint.b.ahberr)
{
    CLEAR_HC_INT(hcreg ,ahberr);
    UNMASK_HOST_INT_CHH (num);
}
else if (hcint.b.ack)
{
    CLEAR_HC_INT(hcreg ,ack);
}

else if (hcint.b.stall)
{
    UNMASK_HOST_INT_CHH (num);
    pdev->host.HC_Status = HC_STALL;
    CLEAR_HC_INT(hcreg , nak);   /* Clear the NAK Condition */
    CLEAR_HC_INT(hcreg , stall); /* Clear the STALL Condition */
    hcint.b.nak = 0;         /* NOTE: When there is a 'stall', reset also nak,
                                  else, the pdev->host.HC_Status = HC_STALL
    will be overwritten by 'nak' in code below */
    USB_OTG_HC_Halt(pdev, num);   
}
else if (hcint.b.datatglerr)
{
   
    UNMASK_HOST_INT_CHH (num);
    USB_OTG_HC_Halt(pdev, num);
    CLEAR_HC_INT(hcreg , nak);   
    pdev->host.HC_Status = HC_DATATGLERR;
    CLEAR_HC_INT(hcreg , datatglerr);
}   

if (hcint.b.frmovrun)
{
    UNMASK_HOST_INT_CHH (num);
    USB_OTG_HC_Halt(pdev, num);
    CLEAR_HC_INT(hcreg ,frmovrun);
}

else if (hcint.b.xfercompl)       //正常的键鼠在输入数据时会进入该if
{
   
    if (pdev->cfg.dma_enable == 1)
    {
      hctsiz.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS->HCTSIZ);
      pdev->host.XferCnt =pdev->host.hc.xfer_len - hctsiz.b.xfersize;
    }
   
    pdev->host.HC_Status = HC_XFRC;   
    pdev->host.ErrCnt = 0;
    CLEAR_HC_INT(hcreg , xfercompl);
   
    if ((hcchar.b.eptype == EP_TYPE_CTRL)||
      (hcchar.b.eptype == EP_TYPE_BULK))
    {
      UNMASK_HOST_INT_CHH (num);
      USB_OTG_HC_Halt(pdev, num);
      CLEAR_HC_INT(hcreg , nak);
      pdev->host.hc.toggle_in ^= 1;
      
    }
    else if(hcchar.b.eptype == EP_TYPE_INTR)
    {
      hcchar.b.oddfrm= 1;
      USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS->HCCHAR, hcchar.d32);
      pdev->host.URB_State = URB_DONE;
    }
   
}
else if (hcint.b.chhltd)
{
    MASK_HOST_INT_CHH (num);
   
    if(pdev->host.HC_Status == HC_XFRC)

    {
      pdev->host.URB_State = URB_DONE;      
    }
   
    else if (pdev->host.HC_Status == HC_STALL)
    {
      pdev->host.URB_State = URB_STALL;
    }   
   
    else if((pdev->host.HC_Status == HC_XACTERR) ||
            (pdev->host.HC_Status == HC_DATATGLERR))
    {
      pdev->host.ErrCnt = 0;
      pdev->host.URB_State = URB_ERROR;
      
    }
    else if(hcchar.b.eptype == EP_TYPE_INTR)//in
    {
      pdev->host.hc.toggle_in ^= 1;
    }
   
    CLEAR_HC_INT(hcreg , chhltd);   
   
}   
else if (hcint.b.xacterr)
{
    UNMASK_HOST_INT_CHH (num);
    pdev->host.ErrCnt ++;
    pdev->host.HC_Status = HC_XACTERR;
    USB_OTG_HC_Halt(pdev, num);
    CLEAR_HC_INT(hcreg , xacterr);   
   
}
else if (hcint.b.nak)
{
    if(hcchar.b.eptype == EP_TYPE_INTR)
    {
      UNMASK_HOST_INT_CHH (num);
      USB_OTG_HC_Halt(pdev, num);
    }
    else if((hcchar.b.eptype == EP_TYPE_CTRL)||
            (hcchar.b.eptype == EP_TYPE_BULK))
    {
      /* re-activate the channel*/
      hcchar.b.chen = 1;
      hcchar.b.chdis = 0;
      USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS->HCCHAR, hcchar.d32);
    }
    pdev->host.HC_Status = HC_NAK;
    CLEAR_HC_INT(hcreg , nak);   
}

return 1;
}






dazhige 发表于 2019-5-13 22:27:29

没有人回复就算了,改用STM32Cube搞定了,具体什么原因说不清,对这块不是很懂,以后有机会再慢慢学
页: [1]
查看完整版本: STM32F407 USB HOST HID部分鼠标键盘无法读取数据