STM32F407 USB HOST 读取鼠标数据

2019-07-21 03:28发布

第一步:新建一个C文件 把usbh_hid_core.c 库文件粘贴进去 这样就能随便改了;其他的库文件不要动
第二步:把相关库文件全拽进来 键盘那个不要  usbh_usr.c文件还用读U盘的 然后编译;
第三步: 编译报错 把mouse_init mouse_data_process 等。。。相关函数自己写了 这不属于底层驱动可以随意写 一般串口输出标志性语句 等调试好了再根据应用改 然后把usb_krd_cb注释掉
第四步:单步调试 改程序直到正常输出鼠标型号 等信息为止(其实用U盘程序也是能读出鼠标型号的),如果读不出 查看能否进入USB中断 在中断那设串口打印或者灯
第五步:重点来了 正常读型号 但是无法进入鼠标初始化 单步调试 卡在前面自己粘贴的 usbh_hid_core.c :
case HID_REQ_SET_IDLE:
    
    classReqStatus = USBH_Set_Idle (pdev, pphost, 0, 0);
    
    /* set Idle */
    if (classReqStatus == USBH_OK)
    {
      HID_Machine.ctl_state = HID_REQ_SET_PROTOCOL;  
    }
    else if(classReqStatus == USBH_NOT_SUPPORTED) 
    {
      HID_Machine.ctl_state = HID_REQ_SET_PROTOCOL;        
    } 
    break; 
无法进入:USBH_Status USBH_HID_Handle 进而不能对鼠标操作
是请求idle时间不够造成的:

USBH_Set_Idle (pdev, pphost, 0, 0) 把第一个0改大点 我一开始设成10不行 改成100好使了
然后进USBH_Set_Idle函数

static USBH_Status USBH_Set_Idle (USB_OTG_CORE_HANDLE *pdev,
                                  USBH_HOST *phost,
                                  uint8_t duration,
                                  uint8_t reportId)
{
  
  phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_INTERFACE |
    USB_REQ_TYPE_CLASS;
  
  
  phost->Control.setup.b.bRequest = USB_HID_SET_IDLE;
  phost->Control.setup.b.wValue.w = (duration << 8 ) | reportId;
  
  phost->Control.setup.b.wIndex.w = 0;
  phost->Control.setup.b.wLength.w = 0;                                   这个0也改大点 我也改的100;
  
  return USBH_CtlReq(pdev, phost, 0 , 0 );
然后下进去就好使了
串口输出结果:
USB Host library started.
     USB Host Library v2.1.0
> Device Attached 
> USBH_USR_ResetDevice 
> Low speed device detected
> VID : 093Ah
> PID : 2521h
> HID device connected
> Manufacturer : N/Ar
> Product : USB OPTICAL MOUSE
> Serial Number : N/A
> Enumeration completed 
mouse init-30-70-120-170-190-200-230-230-230-240-250-270-290-280-290-290-300-310-320-300-280-240-210-150-80-4000-30-60-100-140-160-180-190-220-210-190-190-170-150-140-120-110-120-100-120-120-90-100-90-90-70-60-40-2000-20-20-30-50-60-70-90-110-140-150-150-160-150-140-120-80-60-200000000000-40-80-130-190-260-330-380-410-460-490-490-520-470-400-310-190-60-10-30-40-70-100-110-130-110-100-80-80-70-60-50-40-20-10-10-20-40-40-60-70-80-80-100-100-110-120-120-130-130-140-130-140-130-140-150-130-130-120-120-110-110-90-90-90-90-60-50-50-30-1000-30-50-60-70-80-100-100-110-110-130-110-110-90-80-60-50-30-20-10-1000-20-40-50-60-70-70-90-100-110-110-110-120-110-120-100-90-80-70-40-30-10-10-30-40-50-60-50-50-40-30-30-30-30-20-30-20-100000-1000pressed release pressed release pressed 00 release pressed release pressed release pressed release


具体延迟时间和请求数据设多少好像不同的鼠标不一样 但是肯定不能是零吧  不过尽量长点吧
以上个人经验 不知道对不对 留个记录 以后用到好百度
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。