打印
[DSP编程]

求can总线发送接收超时中断程序

[复制链接]
4621|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
heixue509|  楼主 | 2013-12-18 14:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zhangmangui| | 2013-12-18 14:49 | 只看该作者
2812开发板中自带的代码   没详细看  
你看看能不能帮到你
EX12_CAN.rar (289.36 KB)

使用特权

评论回复
板凳
heixue509|  楼主 | 2013-12-18 14:59 | 只看该作者
zhangmangui 发表于 2013-12-18 14:49
2812开发板中自带的代码   没详细看  
你看看能不能帮到你

不管有没有用 先谢谢了

使用特权

评论回复
地板
heixue509|  楼主 | 2013-12-18 15:05 | 只看该作者
zhangmangui 发表于 2013-12-18 14:49
2812开发板中自带的代码   没详细看  
你看看能不能帮到你

有没有关于超时的程序  发送超时重发的?

使用特权

评论回复
5
zhangmangui| | 2013-12-18 15:55 | 只看该作者
heixue509 发表于 2013-12-18 15:05
有没有关于超时的程序  发送超时重发的?

只有这个了呀

使用特权

评论回复
6
raoxianbin| | 2013-12-18 16:08 | 只看该作者
你设计超时中断有什么实际运用还是单纯的调式啊

使用特权

评论回复
7
pinda_| | 2013-12-18 18:02 | 只看该作者
        :L我的想法认为很简单,就是发不出去。。 也就是说你可以写一个需要发送的列表,然后,通过CAN中断发送。

        因为没有终端,也就是说总线上没有响应发送过程,那么就会进入发送超时中断(你需要打开自动重发),同时,错误会进行累计,错误数分别为96,127,255,又会产生三种不同的中断方式,其中,当错误数达到255的时候,CAN的总线就会被关闭,需要重新打开。也就是关闭CAN后,重新使能CAN,使能中断。

使用特权

评论回复
8
llf021421| | 2014-10-13 21:00 | 只看该作者
pinda_ 发表于 2013-12-18 18:02
我的想法认为很简单,就是发不出去。。 也就是说你可以写一个需要发送的列表,然后,通过CAN中断 ...

楼主,你的can发送,接收超时搞好了没有?我现在搞好了发送超时,但接收超时搞不错,能不能交流下,谢谢!
QQ717046727

使用特权

评论回复
9
pinda_| | 2014-10-14 16:37 | 只看该作者
llf021421 发表于 2014-10-13 21:00
楼主,你的can发送,接收超时搞好了没有?我现在搞好了发送超时,但接收超时搞不错,能不能交流下,谢谢 ...

接收超时要自己在应用层写,根据你的CAN协议来。一旦发送超时了,有可能接收吗?

使用特权

评论回复
10
llf021421| | 2014-10-15 23:19 | 只看该作者
pinda_ 发表于 2014-10-14 16:37
接收超时要自己在应用层写,根据你的CAN协议来。一旦发送超时了,有可能接收吗? ...

发送超时了肯定不能接收,也有可能发送成功,但是接收超时了!
我现在已经实现了发送超时和接收超时,先前中断配置的时候有问题
现在我遇到的问题是:使用中断接收和发送,邮箱0~15能正常接收和发送,但是使用邮箱16~31就不能引起中断的产生。但如果不使用中断而采用轮徇的话,邮箱0~31都可以使用发送和接收,CAN是工作在正常模式的。
这说明了中断配置有问题,等下我把我的中断配置发上来,大家帮我看一下什么情况引起这个原因的

使用特权

评论回复
11
pinda_| | 2014-10-16 08:44 | 只看该作者
llf021421 发表于 2014-10-15 23:19
发送超时了肯定不能接收,也有可能发送成功,但是接收超时了!
我现在已经实现了发送超时和接收超时,先 ...

中断对应的那个接收和发送寄存器是32位的,而对应接收和发送寄存器是16位的,这里需要使用影子寄存器,你看下,是否用影子寄存器shadow来配置。

使用特权

评论回复
12
llf021421| | 2014-10-17 01:47 | 只看该作者
pinda_ 发表于 2014-10-16 08:44
中断对应的那个接收和发送寄存器是32位的,而对应接收和发送寄存器是16位的,这里需要使用影子寄存器,你 ...

原因已经找到时了,是我的中断处理函数有问题。如下:
if(ECanaShadow.CANGIF0.bit.GMIF0 == 1)  //表示有接收或发送中断产生
{
MboxNum = ECanaShadow.CANGIF0.bit.MIV0;
Canta = ECanaRegs.CANTA.all;
Canrmp = ECanaRegs.CANRMP.all;
if((Canta & (1<<MboxNum)) >0) //表示是发送中断
{
//处理发送中断
}
if((Canrmp & (1<<MboxNum)) >0)  //表示是接收中断
{
//处理接收中断
}
}
上面示例代码中的(1<<MboxNum)有问题,生成的是16位的整数,所以0~15邮箱中断能响应,16~31邮箱中断
不能进来处理。把(1<<MboxNum)改成((Uint32)1<<MboxNum)就可以了!
自己调试的时候粗心大意了,没有仔细看中断处理函数,谢谢大家了

使用特权

评论回复
13
rainlive| | 2014-12-9 14:57 | 只看该作者
can的超时功能如何实现啊?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

9

帖子

0

粉丝