- 主题:一个GD32E103的USB硬件bug
使用某个双向端点来通讯,比如端点2,我们记为EP2_OUT和EP2_IN,分别处理主机的OU
T和IN请求。设备收到主机OUT请求以后,应答ACK,然后设置EP2_OUT的TF中断标志,中
断延迟大约6us或者更少一些。
如果在6us中断延迟时间内没有EP2_IN的IN请求,或者即使有IN请求,设备EP2_IN没有准
备好,应答NAK,那一切正常。我的应用中实际测试EP2_OUT响应ACK以后,大约0.6us以
后主机就会发送IN请求,刚好落在6us的中断延迟时间内。这时候如果设备EP2_IN端点准
备好,那么就开始响应EP2_IN请求,给主机发送数据,发送完成主机应答ACK,触发EP2
_IN的TF中断标志,正常触发中断,这个中断会把它前面EP2_OUT的中断标志冲掉,导致
丢失前面的EP2_OUT传输完成中断。
usb的固件库代码我看过是可以同时处理同一个端点OUT和IN两个TF中断标志的,所以问
题大概率在USB硬件。目前该问题还未得到官方确认。这个问题在USB实际通讯速率不高
的问题,极少出现,大流量的通讯的时候会出现,概率几十万分之一吧,没有什么规律
,所以定位起来十分困难。
--
FROM 222.90.31.*
不知道这是不是与寄存器的结构有关系。
寄存器应当不同于 SRAM。
各个位的设置应该按照实际需要由不同的时钟驱动。
【 在 spadger (void*) 的大作中提到: 】
: 标 题: 一个GD32E103的USB硬件bug
: 发信站: 水木社区 (Mon Jan 17 10:42:29 2022), 站内
:
: 使用某个双向端点来通讯,比如端点2,我们记为EP2_OUT和EP2_IN,分别处理主机的OU
: T和IN请求。设备收到主机OUT请求以后,应答ACK,然后设置EP2_OUT的TF中断标志,中
: 断延迟大约6us或者更少一些。
:
: 如果在6us中断延迟时间内没有EP2_IN的IN请求,或者即使有IN请求,设备EP2_IN没有准
: 备好,应答NAK,那一切正常。我的应用中实际测试EP2_OUT响应ACK以后,大约0.6us以
: 后主机就会发送IN请求,刚好落在6us的中断延迟时间内。这时候如果设备EP2_IN端点准
: 备好,那么就开始响应EP2_IN请求,给主机发送数据,发送完成主机应答ACK,触发EP2
: _IN的TF中断标志,正常触发中断,这个中断会把它前面EP2_OUT的中断标志冲掉,导致
: 丢失前面的EP2_OUT传输完成中断。
:
: usb的固件库代码我看过是可以同时处理同一个端点OUT和IN两个TF中断标志的,所以问
: 题大概率在USB硬件。目前该问题还未得到官方确认。这个问题在USB实际通讯速率不高
: 的问题,极少出现,大流量的通讯的时候会出现,概率几十万分之一吧,没有什么规律
: ,所以定位起来十分困难。
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 222.90.31.*]
--
FROM 111.196.243.*
中断标志在同一个寄存器里面。
定位这个bug,只能看USB IP的RTL代码,我现在接触的GD原厂的人是没有这个权限的,
我猜他们复现出这个bug都很困难,当然我把D+D-上的数据包已经给他们了。
【 在 intron (内含子) 的大作中提到: 】
: 不知道这是不是与寄存器的结构有关系。
: 寄存器应当不同于 SRAM。
: 各个位的设置应该按照实际需要由不同的时钟驱动。
: ...................
--
FROM 222.90.31.*