你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

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

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

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

  7. HID 设备!
  8. Manufacturer: N/A
  9. Product: USB OPTICAL MOUSE
  10. Serial Number: N/A

  11. 设备枚举完成!

  12. 跳过用户确认步骤!

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

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

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

  4. VID: 1D57h
  5. PID: AD03h
  6. 从机地址分配成功!

  7. HID 设备!
  8. Manufacturer: SOAI
  9. Product: Gaming Mouse
  10. Serial Nu
  11. mber: N/A
  12. 设备枚举完成!

  13. 跳过用户确认步骤!

  14. USB Connected    USB Mouse
复制代码

继续仿真后发现在 USB_OTG_USBH_handle_hc_n_In_ISR()函数中支持的键鼠在有数据时会进入
  1. else if (hcint.b.xfercompl)
  2. {
  3. ........
  4. pdev->host.URB_State[num] = URB_DONE;
  5. }
复制代码


然后由 URB_DONE标志就可以进入解码函数,但不支持的键鼠却不会进入该 if 语句。和支持的键盘对比也没发现进入了其他语句,再查询发现条件 else if (hcint.b.xfercompl) 貌似是读取的寄存器中的值(对这一块完全小白),在该函数开始部分由这一串语句给出:
  1. hcreg = pdev->regs.HC_REGS[num];
  2.   hcint.d32 = USB_OTG_READ_REG32(&hcreg->HCINT);
  3.   hcintmsk.d32 = USB_OTG_READ_REG32(&hcreg->HCINTMSK);
  4.   hcint.d32 = hcint.d32 & hcintmsk.d32;
  5.   hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[num]->HCCHAR);
  6.   hcintmsk.d32 = 0;
复制代码
这是USB_OTG_READ_REG32的宏定义:
  1. #define USB_OTG_READ_REG32(reg)  (*(__IO uint32_t *)reg)
复制代码

到这里就找不到头绪了。对了,好像支持的都是低速设备,不支持的都是全速设备,不知道这里有什么影响没有。具体的USB_OTG_USBH_handle_hc_n_In_ISR()函数在后面。
  1. /*******************USB_OTG_USBH_handle_hc_n_In_ISR()函数 **********************************/
  2. uint32_t USB_OTG_USBH_handle_hc_n_In_ISR (USB_OTG_CORE_HANDLE *pdev , uint32_t num)
  3. {
  4.   USB_OTG_HCINTn_TypeDef     hcint;
  5.   USB_OTG_HCINTMSK_TypeDef  hcintmsk;
  6.   USB_OTG_HCCHAR_TypeDef     hcchar;
  7.   USB_OTG_HCTSIZn_TypeDef  hctsiz;
  8.   USB_OTG_HC_REGS *hcreg;
  9.   
  10.   
  11.   hcreg = pdev->regs.HC_REGS[num];
  12.   hcint.d32 = USB_OTG_READ_REG32(&hcreg->HCINT);
  13.   hcintmsk.d32 = USB_OTG_READ_REG32(&hcreg->HCINTMSK);
  14.   hcint.d32 = hcint.d32 & hcintmsk.d32;
  15.   hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[num]->HCCHAR);
  16.   hcintmsk.d32 = 0;
  17.   
  18.   
  19.   if (hcint.b.ahberr)
  20.   {
  21.     CLEAR_HC_INT(hcreg ,ahberr);
  22.     UNMASK_HOST_INT_CHH (num);
  23.   }  
  24.   else if (hcint.b.ack)
  25.   {
  26.     CLEAR_HC_INT(hcreg ,ack);
  27.   }
  28.   
  29.   else if (hcint.b.stall)  
  30.   {
  31.     UNMASK_HOST_INT_CHH (num);
  32.     pdev->host.HC_Status[num] = HC_STALL;
  33.     CLEAR_HC_INT(hcreg , nak);   /* Clear the NAK Condition */
  34.     CLEAR_HC_INT(hcreg , stall); /* Clear the STALL Condition */
  35.     hcint.b.nak = 0;           /* NOTE: When there is a 'stall', reset also nak,
  36.                                   else, the pdev->host.HC_Status = HC_STALL
  37.     will be overwritten by 'nak' in code below */
  38.     USB_OTG_HC_Halt(pdev, num);   
  39.   }
  40.   else if (hcint.b.datatglerr)
  41.   {
  42.    
  43.     UNMASK_HOST_INT_CHH (num);
  44.     USB_OTG_HC_Halt(pdev, num);
  45.     CLEAR_HC_INT(hcreg , nak);   
  46.     pdev->host.HC_Status[num] = HC_DATATGLERR;
  47.     CLEAR_HC_INT(hcreg , datatglerr);
  48.   }   
  49.   
  50.   if (hcint.b.frmovrun)
  51.   {
  52.     UNMASK_HOST_INT_CHH (num);
  53.     USB_OTG_HC_Halt(pdev, num);
  54.     CLEAR_HC_INT(hcreg ,frmovrun);
  55.   }
  56.   
  57.   else if (hcint.b.xfercompl)       //正常的键鼠在输入数据时会进入该if
  58.   {
  59.    
  60.     if (pdev->cfg.dma_enable == 1)
  61.     {
  62.       hctsiz.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[num]->HCTSIZ);
  63.       pdev->host.XferCnt[num] =  pdev->host.hc[num].xfer_len - hctsiz.b.xfersize;
  64.     }
  65.    
  66.     pdev->host.HC_Status[num] = HC_XFRC;     
  67.     pdev->host.ErrCnt [num]= 0;
  68.     CLEAR_HC_INT(hcreg , xfercompl);
  69.    
  70.     if ((hcchar.b.eptype == EP_TYPE_CTRL)||
  71.         (hcchar.b.eptype == EP_TYPE_BULK))
  72.     {
  73.       UNMASK_HOST_INT_CHH (num);
  74.       USB_OTG_HC_Halt(pdev, num);
  75.       CLEAR_HC_INT(hcreg , nak);
  76.       pdev->host.hc[num].toggle_in ^= 1;
  77.       
  78.     }
  79.     else if(hcchar.b.eptype == EP_TYPE_INTR)
  80.     {
  81.       hcchar.b.oddfrm  = 1;
  82.       USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[num]->HCCHAR, hcchar.d32);
  83.       pdev->host.URB_State[num] = URB_DONE;  
  84.     }
  85.    
  86.   }
  87.   else if (hcint.b.chhltd)
  88.   {
  89.     MASK_HOST_INT_CHH (num);
  90.    
  91.     if(pdev->host.HC_Status[num] == HC_XFRC)

  92.     {
  93.       pdev->host.URB_State[num] = URB_DONE;      
  94.     }
  95.    
  96.     else if (pdev->host.HC_Status[num] == HC_STALL)
  97.     {
  98.       pdev->host.URB_State[num] = URB_STALL;
  99.     }   
  100.    
  101.     else if((pdev->host.HC_Status[num] == HC_XACTERR) ||
  102.             (pdev->host.HC_Status[num] == HC_DATATGLERR))
  103.     {
  104.       pdev->host.ErrCnt[num] = 0;
  105.       pdev->host.URB_State[num] = URB_ERROR;  
  106.       
  107.     }
  108.     else if(hcchar.b.eptype == EP_TYPE_INTR)//in
  109.     {
  110.       pdev->host.hc[num].toggle_in ^= 1;
  111.     }
  112.    
  113.     CLEAR_HC_INT(hcreg , chhltd);   
  114.    
  115.   }   
  116.   else if (hcint.b.xacterr)
  117.   {
  118.     UNMASK_HOST_INT_CHH (num);
  119.     pdev->host.ErrCnt[num] ++;
  120.     pdev->host.HC_Status[num] = HC_XACTERR;
  121.     USB_OTG_HC_Halt(pdev, num);
  122.     CLEAR_HC_INT(hcreg , xacterr);   
  123.    
  124.   }
  125.   else if (hcint.b.nak)  
  126.   {  
  127.     if(hcchar.b.eptype == EP_TYPE_INTR)
  128.     {
  129.       UNMASK_HOST_INT_CHH (num);
  130.       USB_OTG_HC_Halt(pdev, num);
  131.     }
  132.     else if  ((hcchar.b.eptype == EP_TYPE_CTRL)||
  133.               (hcchar.b.eptype == EP_TYPE_BULK))
  134.     {
  135.       /* re-activate the channel  */
  136.       hcchar.b.chen = 1;
  137.       hcchar.b.chdis = 0;
  138.       USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[num]->HCCHAR, hcchar.d32);
  139.     }
  140.     pdev->host.HC_Status[num] = HC_NAK;
  141.     CLEAR_HC_INT(hcreg , nak);   
  142.   }

  143.   return 1;
  144. }
复制代码







收藏 评论1 发布时间:2019-5-11 12:00

举报

1个回答
dazhige 回答时间:2019-5-13 22:27:29
没有人回复就算了,改用STM32Cube搞定了,具体什么原因说不清,对这块不是很懂,以后有机会再慢慢学
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版