匿0名 发表于 2024-8-15 14:50:38

USB在IRC频率为40M和44.2368M时,认不到设备

芯片STC8H8K64U:在对USB读写等相关函数展开处理时发现一个问题:
在使用INDEX来选择目标端点0后,读取CSR0寄存器,用40M和44.2368M下载时会认不到设备,选用其它更高或更低IRC正常。具体位置如下图



后反复调试发现在此处加_nop_();可以解决,40M认得到设备。


猜想INDEX为端点索引寄存器,在选定端点0后,是否需要等待端点0相关寄存器到位后才能进行下一步操作?
查看手册发现端点0相关寄存器有(INMAXP )、(CSR0)、( COUNT0)共3个,于是加3个_nop_();屏蔽while (USBADR & 0x80);发现40M也可以认到设备。


提问:1.猜想是否正确?
          2.为什么只有40M和44.2368M会出现这个问题?
          3.怎么才能得到需要等待的时间,其他端点1到5是否也有相关问题?




DebugLab 发表于 2024-8-15 15:18:45

可能是BUSY状态没有及时更新,while条件不满足直接跳过了
USB时钟48M,可能会和主时钟之间存在某种关系导致不同步,猜的,不一定对

匿0名 发表于 2024-8-16 10:42:01

DebugLab 发表于 2024-8-15 15:18
可能是BUSY状态没有及时更新,while条件不满足直接跳过了
USB时钟48M,可能会和主时钟之间存在某种关系导致 ...

有没查看BUSY状态的方式?主要怕其他端点也有同样的问题

DebugLab 发表于 2024-8-16 10:50:03

匿0名 发表于 2024-8-16 10:42
有没查看BUSY状态的方式?主要怕其他端点也有同样的问题

像这样就可以,不正常的时候加几个nop

匿0名 发表于 2024-8-22 10:23:42

DebugLab 发表于 2024-8-16 10:50
像这样就可以,不正常的时候加几个nop

发现端点1,2,3,4,5都有同样的问题。
再问个问题有没USB FIFO连续块读取的例子,目前连续写没问题,连续读就不行


DebugLab 发表于 2024-8-22 11:03:20

匿0名 发表于 2024-8-22 10:23
发现端点1,2,3,4,5都有同样的问题。
再问个问题有没USB FIFO连续块读取的例子,目前连续写没问题,连 ...

AUTORD=1不行吗?

匿0名 发表于 2024-8-22 11:28:33

DebugLab 发表于 2024-8-22 11:03
AUTORD=1不行吗?

不行,有没相关测试的例子?
页: [1]
查看完整版本: USB在IRC频率为40M和44.2368M时,认不到设备