大家好,最近在学习2440的USB功能,现在主要先从USB的设备开始着手,但是在学习过过程遇到了一个问题,纠结了几天,想请教下大家,有没有遇到过类似的问题,问题如下:
调试过程中发现,设置断点在USB的中断函数,当设备插入PC的USB口,会跳到断点处,也就是说前面的初始化应该都没问题,中断初始化也没啥问题,进了USB中断后,复位USB总线并重新配置USB相关寄存器(ReconfigUsbd函数),配置完之后下一步是应该要给PC端发送设备的描述符,应该执行Ep0Handler()这个函数,而执行这个函数的条件是epIntpnd=rEP_INT_REG这个标志位的第一位要置1,在2440寄存器说明这个会自动置1,但是调试查看epIntpnd没有置1,想问问大家有没有知道原因的,谢了。
void __irq IsrUsbd(void)
{
U8 usbdIntpnd,epIntpnd;
U8 saveIndexReg=rINDEX_REG;
usbdIntpnd=rUSB_INT_REG;
epIntpnd=rEP_INT_REG;
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]");
ReconfigUsbd();
rUSB_INT_REG=RESET_INT; //RESET_INT should be cleared after ResetUsbd().
// PrepareEp1Fifo();
TransportStage=COMMAND_STAGE; rev_stat=0; Ep2DataLength=0;
Uart_Printf("bus Reset \n");
}
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;
}
|