STM32 USB OTG FS(设备模式)有关设置请求的中断

问题描述 投票:0回答:1

我正在学习在 stm32f407 上构建 USB 设备模式驱动程序,该驱动程序上有 USB_OTG_FS 内核。

当接收到设置数据包时,“RXFLVL”(RxFIFO 不为空)中断被调用,据我了解,这是设备应该处理设置请求并回复主机的地方。

查看 ST 的标准 USB 库代码,我发现 ST 的库而是等待“OEPINT”(输出端点 itnerrupt)并在那里处理设置请求。这是有道理的,因为应在 OTG_FS_DOEPINT 寄存器中设置“STUP”位,指示设置阶段已完成。

但是,在我的情况下,在收到 rx 队列级中断后,从未调用输出端点中断。我在这里缺少什么?

提前致谢。

我编写了自己的 USB 设备驱动程序,它应该执行与 ST 的 USB 库相同的操作。

usb stm32 mcu
1个回答
0
投票

STM32 中使用的 Synopsys OTG USB 模块是一台复杂的机器,对程序中用户事件的顺序很挑剔。这是因为其内部状态机在某些状态下通过来自 USB 总线的事件进行推进,而在其他状态下则通过程序的访问进行推进。其复杂性是由该模块的历史发展决定的,也是由该模块使用两种类型的 DMA 或根本不使用 DMA 进行配置(当由 MCU 制造商实例化到芯片中时)的能力决定的。

换句话说,您必须严格遵循RM中OTG USB章节的操作模型子章节中的(措辞非常糟糕的)描述。在这种特殊情况下,您必须相应地处理 RXFLVL 和 OEPINT 中断。在 RXFLVL 中断中,您必须识别指示中断原因的各种状态(并且在 SETUP 数据包模式的情况下,从 FIFO 中读出设置数据包;在 SETUP 阶段完成模式的情况下,只需读取 OTG_FS_GRXSTSP,这又会引发 OEPINT 中断( * )),然后在 OEPINT 中断中处理收到的 SETUP 数据包。或者,您可以忽略 OEPINT 中断并处理 (*) 中的 SETUP 数据包,但前一种方法为 SETUP 和通用 OUT 数据以及 DMA 和非 DMA 操作提供统一的处理。

© www.soinside.com 2019 - 2024. All rights reserved.