一段usbd的中断服务程序——为什么第4次中断以后,不再进入这段中断服务程序
CBEMA 2009-05-08 04:57:20 这是我在网上找到的一个跟我有着同样原因的人的帖子:
通过串口打印,可以知道当usb线插入pc时,有中断产生.
void __irq IsrUsbd(void) //usb设备中断服务程序
{
U8 usbdIntpnd,epIntpnd;
U8 saveIndexReg=rINDEX_REG;
usbdIntpnd=rUSB_INT_REG;
epIntpnd=rEP_INT_REG;
DbgPrintf( "[INT:EP_I=%x,USBI=%x]",epIntpnd,usbIntpnd );
if(usbdIntpnd&SUSPEND_INT)
{
rUSB_INT_REG=SUSPEND_INT;
DbgPrintf( "<SUS]");
}
if(usbdIntpnd&RESUME_INT)
{
rUSB_INT_REG=RESUME_INT;
DbgPrintf("<RSM]");
}
if(usbdIntpnd&RESET_INT)
{
DbgPrintf( "<RST]"); 4次中断都是进入这里
//ResetUsbd();
ReconfigUsbd();
rUSB_INT_REG=RESET_INT; //RESET_INT should be cleared after ResetUsbd().
PrepareEp1Fifo();
}
if(epIntpnd&EP0_INT) //正常情况下,在复位中断处理以后的下一次中断应该执行到这里,可以始终执行不到
{
rEP_INT_REG=EP0_INT;
Ep0Handler();
}
if(epIntpnd&EP1_INT)
{
rEP_INT_REG=EP1_INT;
Ep1Handler();
}
if(epIntpnd&EP2_INT)
{
rEP_INT_REG=EP2_INT;
DbgPrintf("<2:TBD]"); //not implemented yet
//Ep2Handler();
}
if(epIntpnd&EP3_INT)
{
rEP_INT_REG=EP3_INT;
Ep3Handler();
}
if(epIntpnd&EP4_INT)
{
rEP_INT_REG=EP4_INT;
DbgPrintf("<4:TBD]"); //not implemented yet
//Ep4Handler();
}
ClearPending(BIT_USBD);
rINDEX_REG=saveIndexReg;
}
每次都是执行4次DbgPrintf( "<RST]")
然后就没有中断了 。
我用的是立于泰的s3c2410开发板,将程序从ads移植到keil下执行的,由于二者启动代码不同,我将ads下的中断向量表移植到keil下,中断可以响应了,但是在ads下这个中断要响应60次左右,用作整个枚举状态。但是在keil下响应到第4次就不行了,这4次都是在响应复位中断。
本人对usbd的枚举具体过程不是很熟,通过跟踪程序我发现,在ads下的中断响应第1、2、6次都是执行复位,第3-5、7-60次都在执行配置工作。有没有高人指点一下,为何我的keil下的程序只是执行4次复位中断就不行了。这段代码是从ads下移植过来的,只是修改了中断向量表,而且现在已经能形影中断了。问题出在哪了(硬件没问题,同一块板子,ads可以,keil不行)