STM32
直播中

李志静

8年用户 1502经验值
私信 关注
[问答]

应用STM32F205 USB host遇到的疑问求解


本人自定义一个HID从设备(端点描述符中指出:中断传输查询间隔为1ms,IN端点最大包大小为0x40,此设备既不是鼠标键盘也不是摇杆,是自定义的),此从设备插上PC后,bushound能够抓到PC每1ms读一次,并能正确读到HID从设备回的数据。
现在我不用PC与此HID从设备相连,想用STM32F205中的OTG_HS中的HOST与之相连,STM32F205配置以及与从设备的连接结果如下:
配置:
1.STM32F205固件采用ST官网上的“STM32_USB-Host-Device_Lib_V2.1.0”固件库,选取其中的USB_Host_Examples中的HID工程。
2.宏定义了USE_USB_OTG_HS与USE_EMBEDDED_PHY,即采用支持高速的OTG core以及内部的PHY。
3.内部DMA使能,配置如库函数配置一样。
4.OTG_HS设置为强制HOST模式,OTG_HS_DP与OTG_HS_DM复用给OTG_HS用,而OTG_HS_ID与OTG_HS_VBUS作为GPIO。
结果:
1.枚举过程全部完成。
2.HID类请求过程完成,即库中USBH_HID_ClassRequest函数所举出的状态机处理完成(这里的HID_REQ_SET_IDLE与HID_REQ_SET_IDLE状态处理过程被我屏蔽,这里的两个状态过程屏蔽与否对本次测试结果没有影响)。
3.处理类数据传输,即处理USBH_HID_Handle函数时出现问题,在执行USBH_InterruptReceiveData函数后,HOST一次都没有读到数据。
4.仿真分析,USBH_InterruptReceiveData函数->HCD_SubmitRequest函数->USB_OTG_HC_StartXfer函数中的如下语句
  hcchar.d32 = USB_OTG_READ_REG32( pdev->regs.HC_REGS[hc_num]->HCCHAR);
  hcchar.b.oddfrm = USB_OTG_IsEvenFrame(pdev);        
  /* Set host channel enable */
  hcchar.b.chen = 1;
  hcchar.b.chdis = 0;
  USB_OTG_WRITE_REG32( pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32);(这些语句本应该是使能主机通道,开始IN token的)
   A: 在执行上面代码之前OTG_HS_HCCHAR2=0x204c8840(打开通道时设置的), OTG_HS_HCTSIZ2=0x00080040, OTG_HS_HCDMA2=0x200008cc      (为我定义的用于存储接受数据的指针),这里定义的是主机通道2用于接受HID从设备数据。
   B: 单步执行上面代码之后,OTG_HS_HCCHAR2=0xe04c8840, OTG_HS_HCTSIZ2=0x80080040, OTG_HS_HCDMA2=0x200008cc,由此可见                      OTG_HS_HCCHAR2中的CHDIS也是为1的(应该由硬件 强制置1的,因为后面任何时候我通过调试窗口来让此位清0,都是无效的),之后继续走,          这三个寄存器的值一直不变。
   C:在控制通道中,在设置OTG_HS_HCCHAR中CHENA位时,CHDIS位并没有置1(由硬件),所以枚举过程能顺利完成。
   D:用逻辑分析仪抓DP与DM上的波形,发现再执行完上面语句后,HOST并没有发IN token(一次都没发),而只是在发SOF包(通过分析抓捕数据得          知)。
5.断电再上电,多次重复后,有时能正确接HID从设备数据,几率大概1/20。

根据上面的结果,本人有如下疑问:
1.为什么本实例中应用IN端点的主机通道,在置OTG_HS_HCCHAR中CHENA位时,会导致硬件置CHDIS位?所以HOST不发IN token。
2.为什么又会偶尔成功呢?

主要是第一个问题,请大神帮忙解释下,不胜感激!!!!!!!!!!!!!



回帖(1)

李猛

2024-5-17 17:59:11
根据您的描述,您已经成功地使用PC与自定义的HID从设备进行通信,并且现在想要使用STM32F205的OTG_HS作为HOST与该从设备相连。您已经采用了ST官方的固件库,并进行了一些配置。接下来,我将为您提供一些建议和可能的解决方案。

1. 确保STM32F205的OTG_HS引脚与HID从设备的引脚正确连接。通常,OTG_HS需要与从设备的D+和D-引脚相连。

2. 在STM32F205的固件中,您需要配置USB主机模式。这包括设置USB主机的时钟、初始化USB主机堆栈以及配置USB主机管道。

3. 由于您的HID从设备是自定义的,您可能需要修改固件库中的HID示例工程以适应您的设备。这可能包括修改HID报告描述符、处理HID报告数据以及调整端点描述符。

4. 在STM32F205的固件中,您需要实现USB主机的枚举过程。这包括获取从设备的设备描述符、配置描述符和HID类描述符。在枚举过程中,您需要根据从设备的端点描述符来配置USB主机管道。

5. 根据您的描述,从设备的查询间隔为1ms,这意味着您需要在STM32F205的固件中实现一个定时器来控制数据传输的速率。您可以使用STM32的定时器中断来实现这个功能。

6. 在STM32F205的固件中,您需要实现USB主机的数据传输过程。这包括发送IN和OUT令牌,并处理数据传输过程中的错误。

7. 为了确保数据传输的可靠性,您可能需要实现一些错误处理和重试机制。这包括处理USB主机管道的错误、从设备的错误以及数据包丢失的情况。

8. 在调试过程中,您可以使用ST-LINK或其他调试工具来监视STM32F205的USB主机通信。这将有助于您识别和解决潜在的问题。

9. 如果您在实现过程中遇到问题,可以参考ST官方的固件库文档以及STM32F205的数据手册。这些文档将为您提供关于USB主机配置和通信的详细信息。

10. 最后,确保您的STM32F205固件与HID从设备兼容。这可能需要您在固件中实现一些特定的功能,以适应从设备的需求。

通过遵循上述步骤,您应该能够实现STM32F205的OTG_HS作为HOST与自定义HID从设备进行通信。如果在实现过程中遇到任何问题,请随时提问,我会尽力帮助您解决。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分