这几天调试USB模块,发现一个问题总也解决不了,不知道什么原因,就是USB模块初始化并使能后,Host只对其进行了3次复位就挂起了,并没有发送标准请求,单片机的SETUP中断始终没有触发,代码结构大概是这样的:
//主程序
void main()
{
//系统其他模块初始化
…(代码省略)
//USB初始化
USBKEYPID = USBKEY;
USBPHYCTL = PUSEL;
USBPWRCTL = SLDOEN + SLDOAON; //使能LDO
USBPLLDIVB = USBPLL_SETCLK_8_0; //设置PLL分频因子
USBKEYPID = 0x9600;
//使能总中断(代码省略)
while(1)
{
LPM1;
__no_operation();
}
}
//USB中断程序
#pragma VECTOR = USB_UBM_VECTOR
__Interrupt void USB_ISR()
{
switch(__even_in_range(USBVECINT, 62))
{
case USBVECINT_PWR_VBUSOn: //USB插入后VBUS就绪中断
USBKEYPID = USBKEY;
USBPLLCTL = UPCS0 + UPFDEN + UPLLEN; //使能PLL
__delay_cycles(16000); //延迟2ms
USBCNF = USB_EN; //使能USB模块
USBCNF |= PUR_EN;//连接上拉电阻,开始枚举
USBKEYPID = 0x9600;
break;
case USBVECINT_SETUP_PACKET_RECEIVED:
//SETUP包接收中断(代码省略)
break;
default:
break;
}
)
代码大体是这样,有些无关的就省略了,问题就是 如果我按照现在的代码运行,Host会对USB模块进行3次复位之后就是1次挂起,然后电脑右下角提示无法识别的USB设备,整个过程始终没有触发SETUP包的接收中断…但是如果我把红色的代码剪切到蓝色代码的上一行,整个枚举就正常了… 谁能帮我看下这个是什么原因…
还有一个诡异的问题,就是每当我插入USB口的时候,过载标志位 VUOVLIFG 就会置位,但是我检查了硬件电路,VUSB和V18输出始终都是正常的啊,这个标志位为什么每次插入的时候都会置位呢?实在不解,不过这位置位并不影响枚举,到底怎么回事? 谁知道是什么原因啊,弄了好几天了,都要抓狂了…
John Chen:
楼主是自己写的代码吗?
建议下载TI的USB参考例程:
http://www.ti.com/tool/msp-exp430f5529
里面有完整的硬件driver和软件stack
james yin:
回复 John Chen:
可以看下你的源代码么 我也在弄这个5529的USB模块 也是枚举出现问题了