stm32F437 与 me909 通过 usb 通信调试

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a912293097/article/details/50836293

概述

还没有找到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接头。对于后期调试准备了下下策。

正在进行的工作

2016/3/9/17:43之前
移植了官方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错误,等待进一步调试

截止至2016/3/14
结帖:因为根据调试信息看是硬件问题,所以买了一个带usbhost接口的开发板进行调试。今天板子刚到。。。
烧程序,测试成功!果然是硬件问题!!! 问题解决。

猜你喜欢

转载自blog.csdn.net/a912293097/article/details/50836293