8245|2

19

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

一个有关CAN总线自接收的发送中断和接收中断的问题 [复制链接]

最近在学习CAN总线,是基于NXP LPC1756芯片的, CAN的自接收官方例程。
首先代码中出现的是这样的问题:

官方例程中开启了can的发送中断和接收中断:


中断服务函数是这样的:


在主函数里想让TX不断发送:


思考的结果应该是TX能不断地发送数据,RX能不断地接收数据。

可是结果并不是这样,TX发送完一次后,RX也能接收一次数据,可是以后再也不能接收到数据了,程序不断地执行中断服务函数,while函数里也没有循环,卡在了发送函数那里。

想了想觉得应该是第二次以后发送不成功,一直在执行中断服务函数。可是这个中断服务函数是哪个出发的呢?因为开启了发送中断和接收中断。

后面对程序进行调试,想把读取的SR寄存器读取出来,对其进行打印:


打印出来的IntStatus一直是00000012;

查阅了数据手册,寄存器的值说明接收缓冲区没有足够的空间存放数据,报文丢失了,以及CAN一直在接收数据。

如果说是接收缓冲区满了不能接收数据的话,在第一次接收到数据时已经对缓冲区进行了清空了。

所以,这个问题难以解决。

后面尝试把发送中断给注释掉了,数据就能正常的发送和接收了,即while大循环里的发送函数能不断执行。

所以,考虑是不是不断的发送数据给接收缓冲区的数据塞满了,可是数据在缓冲区满了的话应该会产生接收中断,赶紧翻阅接收缓冲触发中断的寄存器,触发接收中断除了要使能接收中断以外,还需要SR寄存器的RBS位置1:

这个位说明了置1以后,会清空接收缓冲区,并不再接收之后的报文(报文不可用是不是不接收的意思了呢?)。

如果是由于接收中断导致SR寄存器的RBS位置1而不再接收之后的报文,那为什么注释掉了发送中断以后数据就能无限发送和无限接收了呢?

希望能得到各位的帮助呢。
此帖出自NXP MCU论坛

最新回复

nmg
多谢楼主来分享自己的解决问题的办法  详情 回复 发表于 2017-4-12 13:25
点赞 关注
 

回复
举报

19

帖子

2

TA的资源

一粒金砂(中级)

沙发
 
终于解决了这个问题,开启发送中断和接收中断后,在while循环里不能使用发送函数不断发送数据,只能发送一次。

在中断函数里加入读取ICR寄存器值的函数,就可以正常无限发送和无限接收数据了。

之前的问题是:不断地执行中断服务函数,这个中断服务函数是在第一次执行了发送函数产生中断服务函数后,导致了ICR的第1位一直保持1的状态,即没有清除发送中断函数标志位,导致不断进入由发送函数产生的中断服务函数,在读取ICR位以后,寄存器里的从1到10位将清0,接收中断的标志位在清除接收数据缓冲区的时候会暂时清0,所以注释了使能发送中断函数后也能无限发送和无限接收。
此帖出自NXP MCU论坛

点评

nmg
多谢楼主来分享自己的解决问题的办法  详情 回复 发表于 2017-4-12 13:25
 
 
 

回复

5263

帖子

239

TA的资源

管理员

板凳
 
三不沾 发表于 2017-4-7 16:32
终于解决了这个问题,开启发送中断和接收中断后,在while循环里不能使用发送函数不断发送数据,只能发送一 ...

多谢楼主来分享自己的解决问题的办法
此帖出自NXP MCU论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表