一段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不行)
...全文
234 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2011-01-15
  • 打赏
  • 举报
回复
我也是在一个人瞎折腾 , 请问,楼主,你的时钟是怎么错的?

我现在也遇到了这个类似的问题。
CBEMA 2009-05-11
  • 打赏
  • 举报
回复
现在程序在还没有进入过Ep0Handler()。
程序4次都是进入下面这段代码:
if(usbdIntpnd&RESET_INT)
{
DbgPrintf( " <RST]"); 4次中断都是进入这里

//ResetUsbd();
ReconfigUsbd();

rUSB_INT_REG=RESET_INT; //RESET_INT should be cleared after ResetUsbd().

PrepareEp1Fifo();
}
host在这对USB DEVICE有什么要求啊??
CBEMA 2009-05-11
  • 打赏
  • 举报
回复
呵呵,我也是一个人瞎折腾。
gooogleman 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 CBEMA 的回复:]
搞定。我真弱,居然是时钟给配错了。揭帖给分,呵呵。
[/Quote]

恭喜,接分。

我的CETK用不了不知道咋回事。一个人瞎折腾的日子很难进步。
CBEMA 2009-05-11
  • 打赏
  • 举报
回复
搞定。我真弱,居然是时钟给配错了。揭帖给分,呵呵。
gooogleman 2009-05-09
  • 打赏
  • 举报
回复
楼主,请参考优龙的 2410 ADS bootloader代码即可。我看里面初始化不复杂。就是传输数据有点复杂。
博说医械研发 2009-05-09
  • 打赏
  • 举报
回复
第3-5、7-60次中少部分是配置工作,大部分是HOST获取USB DEVICE的描述符等信息。
可能是USB HOST让你做的某些事你没有正确处理,建议在Ep0Handler()中输出从USB HOST得到的数据,判断一下HOST让你做什么事,这样才好判断到底停在哪里了。
一般情况下输出那些打印信息不会导致超时的,包括我以前用AVR单片机外挂PDIUSBD12在枚举过程中通过串口输出打印信息也没有导致超时,还有别人用80C51单片机,速度要比ARM9慢很多呢。
CBEMA 2009-05-09
  • 打赏
  • 举报
回复
没死机,可以继续响应其他中断,应该是与它相连的电脑单方面认为它在规定时间没有作出什么相应的动作,而不再与其通信。

我现在不太清楚到底是什么原因。

依据它的枚举过程以及在ads下中断的那60次,可以知道这个过程很复杂。我曾加过很多调试信息,但是由于输出调试信息占用了很多时间,导致它不能在规定的时间内回应计算机,就连ads的程序,在运转过程中也被电脑认为是无法识别的usb设备。

有没有对usbd枚举过程比较熟悉的大侠指点一下,问题出在哪里,或使用什么样的调试手段更好。
CBEMA 2009-05-09
  • 打赏
  • 举报
回复
我用的是立于泰对1Mflash的那段代码,也使用ads做的,现在移植到keil下了。串口操作没问题了,只是usbd的驱动这里不行,跟电脑连接,又不能用断点调试(电脑要求他在固定的毫秒内响应的)。
morris88 2009-05-08
  • 打赏
  • 举报
回复
复位不成功?
gooogleman 2009-05-08
  • 打赏
  • 举报
回复
死机了?

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧