- 打卡等级:常住居民III
- 打卡总天数:156
- 最近打卡:2026-03-23 08:54:25
高级会员
- 积分
- 863
|
发表于 2026-1-16 14:37:50
|
显示全部楼层
对这个问题,个人比较感兴趣,猜想存在问题的地方可能在三个地方:
1、USB模块工作异常,2、对USB寄存器操作异常,3、芯片工作异常。
1、USB模块是独立的时钟,和主频无关。这个先排除。
2、系统时钟和USB的时钟差异大时,可能会导致读写寄存器不同步,可以考虑一下。
3、芯片工作异常。除了USB模块外,其他未发现异常,这个先排除。
对USB模块操作主要是通过两个函数usb_read_reg()和usb_write_reg()进行的。
BYTE usb_read_reg(BYTE addr)
{
BYTE dat;
while (USBADR & 0x80);
USBADR = addr | 0x80;
while (USBADR & 0x80);
dat = USBDAT;
return dat;
}
usb_read_reg()函数是有时序控制的。
void usb_write_reg(BYTE addr, BYTE dat)
{
while (USBADR & 0x80);
USBADR = addr & 0x7f;
USBDAT = dat;
}
如果是操作时钟不匹配,大概率是usb_write_reg()的原因。USBADR还没有设置好,就设置了USBDAT。
于是在指令之间加入延时测试。
当主时钟为80MHz时,指令之间加一个nop后通信正常。
void usb_write_reg(BYTE addr, BYTE dat)
{
while (USBADR & 0x80);
USBADR = addr & 0x7f;
NOP1();
USBDAT = dat;
}
当主时钟为120MHz时,需要加多个时钟才能恢复通信正常。
void usb_write_reg(BYTE addr, BYTE dat)
{
while (USBADR & 0x80);
NOP5();
USBADR = addr & 0x7f;
NOP10();
USBDAT = dat;
}
通过以上测试,个人认为应该是主频高时,内核对USB模块寄存器操作出现问题。
如果能加入设置寄存器完成判断,应该可以消除这个问题。
|
|