你好!
有关该开发板的串口中断问题。我重新看了手册和HALCoGen生产的sci的中断代码。
1、对于发送中断,我在HAL的SCI2中使能了发送中断,VIM中使能LIN1 High。我在main函数中调用sciSend()函数的话,程序没进入中断函数就把数据发送了,在主函数不调用sciSend()函数,没有进入中断,数据发不出去。
2、对于接受中断的话,在HAL的SCI2中使能了接受中断,VIM中使能LIN1 High。我用串口调试助手向板子发数据,只用在main函数中调用sciReceive()函数才能进入中断,接受到数据。
现在 还是搞不明白,希望能得到讲解。由于HAL中帮助文档中没有相关SCI中断的例程,希望能上传一个看看
谢谢
Ken Wang:
weibin,
关于SCI模块中断功能的理解,我的看法是这样的:
1. 关于发送中断,首先你需要在主程序里面调用SciSend()函数,然后他会触发在sci.c里面定义的void linHighLevelInterrupt(void),如果你定义的是LIN1high的话,low对应的是另一个,这都是根据你的选择自动生成。进入到这个函数以后,系统会把你设置的需要发送的数据搬到SCI的TD的发送缓存寄存器中,然后SCI把数据立即发出,系统同时进入scinotification()函数。你所的进入函数之前就把数据发出了,指的是应该是在进入scinotification之前数据被发出。
2. 关于SCI的接收中断,在主程序中不需要调用SciReceive()函数,你只需要使能接收中断,然后保证SCI端口参数设置和你的超级终端的设置一样,无非就是波特率,停止位和校验位。这些都对了的话,你在终端上发送数据,系统是会自动跳进void linHighLevelInterrupt(void)函数,然后判断标志位,接着进入接收中断处理函数。
如果不清楚的地方,可以再讨论。
谢谢
weibin chi:
回复 Ken Wang:
ken,你好
1、发送中断,在主函数中调用SciSend()函数,那么我认为就用HALCoGen生成的sci.c的代码来说,不需要进入scinotification()函数就可以发送数据了,那这不是没必要写scinotification()函数了。
2、关于sci的接受中断,我实验了很多次,如果主函数中不调用SciReceive()函数的话,程序进不了接受中断函数,即收不到数据,只有主函数调用SciReceive()函数,才能将终端发来的数据接受。这个跟你说的不一样呀
Ken Wang:
回复 weibin chi:
weibin,
1. SCInotification()函数还是建议你加上去的,以为SCI的发送中断的本来就是在于你把数据发出去以后,系统给你一个中断做后续的操作。如果你觉得不需要做其他的操作,当然可以不用。
2. 我在你的另外一个帖子里面上传了一个关于3137做sci通信发送和接收中断的实验。里面很清楚的可以看到接收中断时,主程序不需要调用sciReceive函数的。
你在确认一下哦。
谢谢
Xiaomin Wang:
回复 weibin chi:
当你在sciInit中将sci2的rcv设定为中断模式后,再调用SciReceive(),则SciReceive()具有初始化g_sciTransfer[1]的作用,最重要是g_sciTransfer[1].length被赋了一个不为0的值,只有当g_sciTransfer[1].length>0时程序才可以在进入linhighlevelinterrupt后再进入scinotification。不知道这样说能不能解决你的疑问。
yuyin tan:
回复 Ken Wang:
不好意思,楼主,借用一下地盘,想劳驾 ken wang能去"TMS570ls3137的RAM ECC 初始化“的那个帖子回复一下吗?谢谢!
”
Ken Wang:
回复 yuyin tan:
yuyin,
不好意思,前段时间在休假,现在可以帮你解答。