发 帖  
原厂入驻New
[问答] C6748的UPP口完成接收和发射数据后,无法进入其中断服务程序是怎么回事
2020-5-25 14:02:16  53 UPP cpu
分享
使用UPP的B口,向外面发送64bytes,同时也使用A口接收64bytes的数据,发送的数据可以在逻辑分析仪中看到64bytes,接收的也能从memory窗口看到。
但是不管是发送完,还是接收完,都无法进入UPP的中断服务程序

HWI的interrupt number为9,事件为94,对应event ID为2,利用UPP事件联合EventCombiner产生中断。

以上为cfg文件的EventCombiner的设置。

其中upp的CPU中断号uppIntNum为9,事件uppEvt值为94。


以上代码,debug下,程序会走IF语句,也就是说根据ECM来注册我的uppIsr。




以上BUFSIZE为64。GIO_ISSUE的底层,在最后,会调用函数 Upp_localEnableInterrupts(单步调试发现的)


现在的问题是都有64bytes的数据发出去,也有64bytes的数据接收到了,为何仍然无法进入中断服务程序uppIsr?
然后,我试着在cfg文件中加入以下几句:
var hwi0Params = new Hwi.Params();
hwi0Params.instance.name = "hwi9";
hwi0Params.eventid = 2;
Program.global.hwi9 = Hwi.create(9, "&uppIsr", hwi0Params);
它会报错了,因为跟cfg的EventCombiner定义重复了。
EventCombiner.eventGroupHwiNum[0] = 7;
EventCombiner.eventGroupHwiNum[1] = 8;
EventCombiner.eventGroupHwiNum[2] = 9;
EventCombiner.eventGroupHwiNum[3] = 10;
现在也不知道问题出在哪里,还请各位大神指点一下,非常感谢!
0
2020-5-25 14:02:16   评论 分享淘帖

相关讨论

3 个讨论
检查一下中断状态寄存器,看看有没有触发
这样可以定位问题是中断没触发还是触发后没响应
2020-5-25 14:11:51 评论

举报

liyabn1 发表于 2020-5-25 18:06
检查一下中断状态寄存器,看看有没有触发
这样可以定位问题是中断没触发还是触发后没响应

观察中断状态寄存器之后,感觉确实是触发了的!
在此处设置断点,
if (IOM_COMPLETED != GIO_issue(uppOutHandle, (Ptr)&transParam[0], BUFSIZE, NULL))
[
System_printf("Issue to output stream failed.");
System_abort("Issue to output stream failed\n");
]
执行完这句话后,寄存器状态对应为


然后在这里设断点
if (IOM_COMPLETED != GIO_issue(uppInHandle, (Ptr)&transParam[1], BUFSIZE, NULL))
[
System_printf("Issue to Input stream failed.");
System_abort("Issue to input stream failed\n");
]
执行完这句话,寄存器状态为


其中GIO_issue这句话内在的调用了函数


对比C6748关于UPP寄存器的手册,可以确认中断应该是触发的!


只是这里不大明白,为何UPIER为何不跟UPIES一样,不是0x1F,而是0x18(可以看到函数里面5个中断全设置了),这样的话,只算是设置了EOL和EOW中断,而没有ERR,UOR和DPE,所以UPISR也只能为0x18了。

不过没关系,从UPISR可以看到,关键的EOL和EOW都触发了(因为我这里只有一页的数据,lineCount = 1),但是随后,程序仍然没有进入中断服务程序,所以很奇怪!

于是,是不是uppRegisterIntrHandler(&(Upp_Instances[0]),uppIntNum,uppEvt,(EventCombiner_FuncPtr)uppIsr);出了问题?


接着我就将uppRegisterIntrHandler(&(Upp_Instances[0]),uppIntNum,uppEvt,(EventCombiner_FuncPtr)uppIsr);这句话屏蔽掉,改用CFG进行配置中断服务程序,除了之前的

现在加了两句

试了一下,还是无法进入中断服务程序uppIsr,现在也不知道是怎么回事了?
客来看我可怜我看 发表于 2020-5-25 18:25
观察中断状态寄存器之后,感觉确实是触发了的!
在此处设置断点,
if (IOM_COMPLETED != GIO_issue(uppOutHandle, (Ptr)&transParam[0], BUFSIZE, NULL))

找到原因了,没有注册回调函数,在UPP.C的驱动文件里面,绑定时,默认已经注册了中断服务程序,需要在这个中断服务程序里面调用一个回调函数,而这个回调函数我之前设置是空NULL,所以。。。

只有小组成员才能发言,加入小组>>

1290个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表