野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10024|回复: 8

CAN—通讯实验,无法接受到报文

[复制链接]
发表于 2019-7-7 23:04:35 | 显示全部楼层 |阅读模式
在CAN通讯实验中使用的回环检测,无法接受到报文,经过测试,中断也进入了,标志位判断也置位了。

22222222222222222222221.jpg
如图中断程序,这蓝色的一段程序在测试时,没有被执行。
我在后面加了一小段测试,这个中断标志却是已经被置位了,C输出为2。
之后我又不进行中断标识位的判断,直接把can_rx_flag置一,报文就接受到了。
搞不懂为什么蓝色的这一段程序没被执行,或是直接被跳过了?

我找出野火官方文件
0-视频配套的PPT和程序汇总参考资料(视频里写的代码都放在这里)
中的CAN—通讯实验的程序,按键KEY1后,也是没有显示接受到的报文。
CAN.png

只有在3—程序源码中的例程运行成功了,但前后对比也并没找出什么差别来,时钟开启也都是放前面的。
34-CAN.rar (601.53 KB, 下载次数: 35)
附上我的程序,还请各位前辈帮忙指出有误之处。

回复

使用道具 举报

发表于 2019-7-8 10:01:43 | 显示全部楼层
那就直接按照例程写,视频里的可能写得太匆忙有bug
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-8 10:55:12 | 显示全部楼层
笑你像狗 发表于 2019-7-8 10:01
那就直接按照例程写,视频里的可能写得太匆忙有bug

找到问题了,我在中断里直接receive,把中断标志位清0了,所以后面的if语句判断为RESET了。
找了好久,总算是找到问题所在了,这波不亏。
回复 支持 反对

使用道具 举报

发表于 2019-7-15 16:15:58 | 显示全部楼层
steady 发表于 2019-7-8 10:55
找到问题了,我在中断里直接receive,把中断标志位清0了,所以后面的if语句判断为RESET了。
找了 ...

你好, 请问这个中断里不应该直接receive么? (例程是这个IRQHandler里面有CAN_Receive
这样放是不对的么
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-15 19:04:30 | 显示全部楼层
CNPOWER 发表于 2019-7-15 16:15
你好, 请问这个中断里不应该直接receive么? (例程是这个IRQHandler里面有CAN_Receive
这样放是不对的 ...

问题出在顺序上,请看上一楼。
回复 支持 反对

使用道具 举报

发表于 2019-7-16 10:15:00 | 显示全部楼层
steady 发表于 2019-7-15 19:04
问题出在顺序上,请看上一楼。

sorry 我没太理解 您介意把正确的中断让我看一眼么?
回复 支持 反对

使用道具 举报

发表于 2019-7-16 10:20:20 | 显示全部楼层
steady 发表于 2019-7-15 19:04
问题出在顺序上,请看上一楼。

void CAN_RX_IRQHandler(void)
{
        /*从邮箱中读出报文*/
        CAN_Receive(CANx, CAN_FIFO0, &RxMessage);
        printf("inside the RX_IRQHandler");

        /* 比较ID是否为0x1314  */
        if( RxMessage.DLC==8 )
        {

        flag = 1;                                                //接收成功  
        }
        else
        {
//        printf("\r\n key is 0 \r\n");       
        flag = 0;                                            //接收失败
        }
}
我的是这个样子 我的也是在中断里先放的CAN Receive
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-16 15:21:32 | 显示全部楼层
CNPOWER 发表于 2019-7-16 10:20
void CAN_RX_IRQHandler(void)
{
        /*从邮箱中读出报文*/

int c=0;
extern uint8_t can_rx_flag;
extern                 CanRxMsg can_rx_message;//接收到的数据
void CAN1_RX0_IRQHandler(void)
{
       

        if((CAN_GetITStatus(CAN_num,CAN_IT_FMP0))!=RESET)
        {        c=(CAN_GetITStatus(CAN_num,CAN_IT_FMP0));
                can_rx_flag=1;
        CAN_Receive(CAN1,CAN_FIFO0,&can_rx_message);   //切记不能放到if语句前面,否则接受数据后会把中断标志位清零!!!!!!!!!!!!!!!!!!!!!!
        }       

   printf("\n标志位置\n");
//                c=((CAN1->IER)&CAN_IT_FMP0);
                printf("\n在中断c=%d\n",c);
//        can_rx_flag=1;
}
因为我的中断程序中还检查了中断标志位作为判断,所以必须把Receive这个语句放到中断标志位检测后面。
回复 支持 反对

使用道具 举报

发表于 2019-7-16 15:53:55 | 显示全部楼层
steady 发表于 2019-7-16 15:21
int c=0;
extern uint8_t can_rx_flag;
extern                 CanRxMsg can_rx_message;//接收到的数据

ohh 了解了 谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 13:29 , Processed in 0.033154 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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