stm32F4 usb host CDC类调试

2019-07-20 16:33发布

本帖最后由 天之痕 于 2016-3-11 15:25 编辑

概述
在调试stm32F4的usbhost与华为me909进行通信,还没有找到stm32 与 华为通信模块通过USB通信的例子,本贴直播调试usb host的全过程,如果有搞过的请跟帖帮忙分析一下。
已经知道的东西
1.华为me909 usb属于usb device,是cdc类。
2.stm32F4具备usb host功能,可以使用官方提供的usb库进行设计,最新的usb库为2.2.0版本。
3.移植了usb hid的例子,stm32F4作为host 与鼠标进行通信,完成。使用的是PA11 和 PA12脚,FS(全速模式)。4.华为me909为自供电usb设备,因此当usb出现故障的时候不能通过插拔usb接口对usb进行复位,好在me909有复位引脚,经测试,通过模块本身的复位引脚对模块进行复位后,usb可以重新与stm32建立连接,相当于重新插拔USB接头。对于后期调试准备了下下策。
正在进行的工作

移植了官方usb host CDC的例子,结合原子提供的hid的例程进行调试,未果,只能进行到“USBH_USR_DeviceAddressAssigned(从机分配地址成功)“这一步,后续还没进展。现在怎么突破枚举的问题正在开展,阅读源码是必要的。##截止至2016/3/9/17:43
设备已经枚举成功,终于迈出了第一步,调试过程:跟踪调试,发现程序在 usbh_stdreq.c 第479行时if ( cfg_desc->bNumInterfaces <= USBH_MAX_NUM_INTERFACES) 解析描述信息后会检查接口数是否在设定的范围内,华为的接口数为6个大于在 usbh_conf.h设置的例程中的 2个接口,所以枚举失败。改为6后,并把最对endpoint(端点数) 设置为3(在华为的 USB Interface Descriptor Guide文件中说明)。枚举成功!
但是提示的是不支持的设备,正在进一步调试,趁热打铁!

##截止至2016/3/9/18:03
打印出各个接口的信息
bInterfaceClass: 00FFh,bInterfaceSubClass: 0006h,bInterfaceProtocol: 0010h
bInterfaceClass: 00FFh,bInterfaceSubClass: 0006h,bInterfaceProtocol: 0013h
bInterfaceClass: 00FFh,bInterfaceSubClass: 0006h,bInterfaceProtocol: 0012h
bInterfaceClass: 00FFh,bInterfaceSubClass: 0006h,bInterfaceProtocol: 0016h
bInterfaceClass: 00FFh,bInterfaceSubClass: 0006h,bInterfaceProtocol: 0006h
bInterfaceClass: 00FFh,bInterfaceSubClass: 0006h,bInterfaceProtocol: 001Bh

##截止至2016/3/11/12:03
将端点 按照华为模块手册说明进行设置。有时可以接收到数据,但是概率很低,调试时发现在
CDC_ProcessReception(USB_OTG_CORE_HANDLE *pdev, USBH_HOST *phost)  函数中
URB_STATE URB_StatusRx =   HCD_GetURB_State(pdev , CDC_Machine.CDC_DataItf.hc_num_in);时


URB_StatusRx  的值为 URB_ERROR


查找发生这个错误的原因 在一个中断处理函数中
    else if((pdev->host.HC_Status[num] == HC_XACTERR) ||
            (pdev->host.HC_Status[num] == HC_DATATGLERR))
    {
      pdev->host.ErrCnt[num] = 0;
      pdev->host.URB_State[num] = URB_ERROR;
    }

引用香水城的描述
同样查看XACTERR和DATAEGLERR的置位原因,找到对应的寄存器,即OTG_FS_HCINTx中的【TXERR】和【DTERR】位被硬件置位。
【TXERR】:Transaction error,可能是CRC校验错误、超时、比特填充错误、或者错误的EOP
【DTERR】:Data toggle error,表示收、发双方的数据同步位不再同步,可能是主机处理不当,也有可能是设备处理不当。最直观的方法是使用USB分析仪,看出错前的总线通信来判断是谁没有正确处理数据同步位的翻转。

##截止至2016/3/11 15:24
确定为XACTERR错误,等待进一步调试

说明
如果有感兴趣的朋友可以帮助我一下,或者帮我一起调试一下。我会把这个工程发到论坛上


问题
keil 在编译完出线这个警告,没有找到是什么问题,但是结果是 0错误 0警告。有知道什么问题的请回复下。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。