我们正在尝试通过使用安装在
STM32L476 上的 OTG_FS IP 的 USB 主机内核,以高速和低软件负载接收批量短数据包(最大数据包大小 4 字节)。
先决条件
・我不使用 cubemx 生成的代码。
・主机和设备一对一连接。(我不使用集线器)
・激活管仅为散装管(处于稳定状态,不包括控制管)。
・最大数据包大小为 8 字节。
・OTG_FS 内核被强制作为 USB host-only 工作(FHMOD@OTG_GUSBCFG = 1)。
・AHB CLK 为 75MHz。
在实现上面的过程中,我有一些疑问。
1.去抖完成中断(DBCDNE@OTG_GOTGINT)
我正在考虑在端口连接检测到中断 (PCDET@OTG_HPRT) 之后使用 DBCDNE 中断等待电气去抖周期。
但是,手册指出,除非启用 HNPCAP 或 SRPCAP,否则不会发生 DBCDNE 中断。
不使用host-only模式和HNP/SRP功能时,DBCDNE中断可以不使用吗?
2.NAK中断
为了减少软件负载,我想通过内部定序器的自主操作进行 IN-NAK 轮询,而不是每次 IN-NAK 轮询时都生成 NAK 中断。
但不幸的是,对于连续的IN-NAK轮询,似乎NAK中断使能和中断例程清除中断是必不可少的。
是否可以在没有软件干预的情况下保持 USB 主机核心定序器运行 IN-NAK 轮询?
3. IN-NAK轮询频率
我想增加 HOST 进行 IN-NAK 轮询的频率,以便以高速和严格的时序获取数据。
不幸的是,IN-NAK 轮询每帧仅进行 20 次。
通用串行总线规范修订版 2.0 的表 5-9 指出,当数据有效载荷为 8 字节时,每帧可以发出 71 次传输。
当然,我认为轮询间隔会根据目标设备的响应性能略有变化....
在不考虑目标设备响应性能的情况下,USBHost sequencer每帧可以发出多少次IN token?