USB行为不符合预期

时间:2019-03-18 16:04:43

标签: usb stm32 enumeration packet

我正在将USB驱动程序从STM32F4设备移植到STM32L4设备。它几乎可以工作。在枚举期间,它发送和接收信息,但是数据与“普通” STM Cube生成的项目中的数据并不完全相同。 II在两个项目中具有相同的设置,但得到的结果很奇怪。

我花了一周的时间才找到解决方案,也许这里有人遇到类似的问题,可以为我提供帮助。对不起图像,但是没有其他在SO上发布一些信息

enter image description here

如您所见,数据包几乎相同,但不相同。第25次传输后,开发板停顿并仅接受非常有限数量的请求

这两个文件都构成了wireshark(以wireshark和文本格式):

https://gitlab.com/diymat/usb-problem/tree/master

ep *文件是我的端口stmcdc *形成的-STM Cube生成了一个。两者都使用相同的硬件运行。

2 个答案:

答案 0 :(得分:0)

是否配置了相同的时钟? 48MHz USb clk可以吗? 使用非晶体或外部osc来获得48MHz USB通常会导致大型xfer出现问题,即使在F4上不能说l4 因此,它似乎可以与隐藏且较短的数据包一起使用,但对于较大的xfer会开始出现异常行为

答案 1 :(得分:0)

因此,我希望获得更好的帮助,但我肯定需要更多信息,以为您提供良好的指导。话虽如此,可能有很多问题,所以我将尽力涵盖我所能想到的。让我们从最明显的一些开始。

由于组件故障或软件/硬件选择不正确,时钟配置/硬件可能会引起问题。这可能会导致许多问题,但这可能是其症状。

如果您使用的是从ST生成的FATFS中间件,则L4的配置中较小的堆栈大小可能会导致此确切问题。直到PC寄存器收到错误错误(可能导致某种错误),或者在某些情况下,FATFS内部或ST的USB外设代码返回的错误结果,它都可能会工作,直到PC寄存器收到错误的错误为止。从FATFS读取USB窗口,这将导致外围设备的终止操作。

我看到您正在使用STM32Cube,因此您可以通过打开文件startup_stm32l475xx.s

来编辑堆栈和堆的大小

,然后根据需要编辑两者。

; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Stack_Size      EQU     0x400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size      EQU     0x200

尝试增加堆栈大小,然后看看会发生什么。祝您找到解决方案的好运!