找回密码
 立即注册
查看: 729|回复: 8

FreeRTOS库函数版的CAN功能设置问题请教

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:322
  • 最近打卡:2025-05-02 10:02:36
已绑定手机

21

主题

487

回帖

1041

积分

金牌会员

积分
1041
发表于 2024-3-21 00:52:03 | 显示全部楼层 |阅读模式
使用FreeRTOS库函数版自己增加了CAN功能,但是我发现CAN中断里始终没有对B_Can1Send = 0; B_Can1Read = 1;进行赋值,那么我在FreeRTOS系统里如何检测是否收到CAN数据呢?

void CAN1_ISR_Handler (void) interrupt CAN1_VECTOR
{
        uint8_t isr;
        uint8_t store;
        uint8_t arTemp;

        arTemp = CANAR;     //先CANAR现场保存,避免主循环里写完 CANAR 后产生中断,在中断里修改了 CANAR 内容
        store = AUXR2;      //后AUXR2现场保存
       
        AUXR2 &= ~0x08;                //选择CAN1模块
        isr = CanReadReg(ISR);
        CANAR = ISR;
        CANDR = isr;     //写1清除标志位

        if((isr & 0x04) == 0x04)  //TI
        {
//                CANAR = ISR;
//                CANDR |= 0x04;    //CLR FLAG
                B_Can1Send = 0;
  }       
        if((isr & 0x08) == 0x08)  //RI
        {
//                CANAR = ISR;
//                CANDR |= 0x08;    //CLR FLAG
                B_Can1Read = 1;
        }

        if((isr & 0x40) == 0x40)  //ALI
        {
//                CANAR = ISR;
//                CANDR |= 0x40;    //CLR FLAG
        }       

        if((isr & 0x20) == 0x20)  //EWI
        {
                CANAR = MR;
                CANDR &= ~0x04;  //清除 Reset Mode, 从BUS-OFF状态退出
               
//                CANAR = ISR;
//                CANDR |= 0x20;    //CLR FLAG
        }       

        if((isr & 0x10) == 0x10)  //EPI
        {
//                CANAR = ISR;
//                CANDR |= 0x10;    //CLR FLAG
        }       

        if((isr & 0x02) == 0x02)  //BEI
        {
//                CANAR = ISR;
//                CANDR |= 0x02;    //CLR FLAG
        }       

        if((isr & 0x01) == 0x01)  //DOI
        {
//                CANAR = ISR;
//                CANDR |= 0x01;    //CLR FLAG
        }       

        AUXR2 = store;     //先AUXR2现场恢复
        CANAR = arTemp;    //后CANAR现场恢复
}


回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-04-28 08:49:07
已绑定手机

90

主题

961

回帖

2318

积分

超级版主

积分
2318
QQ
发表于 2024-3-21 09:01:32 | 显示全部楼层
参考我们的范例程序
截图202403210901239413.jpg
热线19952583534
www.STCAI.com
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:322
  • 最近打卡:2025-05-02 10:02:36
已绑定手机

21

主题

487

回帖

1041

积分

金牌会员

积分
1041
发表于 2024-3-21 09:18:14 | 显示全部楼层
国学*** 发表于 2024-3-21 09:01
参考我们的范例程序

感谢提示,例程我都看过的,并且已经移植到FreeRTOS里了,设定间隔时间能正常进入CAN收发信息,但是不知为什么CAN中断里的B_Can1Send; B_Can1Read;在FreeRTOS系统里好像没有被赋值,引申的问题为如果我连续发送CAN信息无法检测CAN是否已经完成上一帧发送,而接收信息时由于B_Can1Read没有被置位,在CAN任务里我怎么判断是否有收到新信息?我初学FreeRTOS,还请指教,是否在FreeRTOS系统里不需要这样检测或者用其他方法?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-3-21 11:26:39 | 显示全部楼层
lly*** 发表于 2024-3-21 09:18
感谢提示,例程我都看过的,并且已经移植到FreeRTOS里了,设定间隔时间能正常进入CAN收发信息,但是不知 ...

举个例子,实验箱例程包:“51-CAN1-CAN2总线标准帧扩展帧同时使用收发测试”
主循环里通过判断 B_Can1Read、B_Can2Read 标志位确定是否有收到CAN总线数据,有的话根据需要进行处理:

截图202403211126317766.jpg

在 CanSendMsg 函数里面判断 B_Can1Send、B_Can1Send 标志位确定上次发送是否完成,完成的话才进行本次发送:
截图202403211123262015.jpg


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:322
  • 最近打卡:2025-05-02 10:02:36
已绑定手机

21

主题

487

回帖

1041

积分

金牌会员

积分
1041
发表于 2024-3-21 11:57:30 | 显示全部楼层
乘风*** 发表于 2024-3-21 11:26
举个例子,实验箱例程包:“51-CAN1-CAN2总线标准帧扩展帧同时使用收发测试”
主循环里通过判断 B_Can1Re ...

您没明白我想表达的意思,我是说标准的库程序用在FreeRTOS里以后,用判断读取B_Can1Send的值始终没有变化,永远是无消息状态!包括发送标志也是如此,发送完一帧后B_Can1Send被置1,然后CAN发送完一帧也不会有清除B_Can1Send的动作,新代码增加了超时处理,那也只是跳过,所以第二帧会一直发不出去!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-3-21 13:09:36 | 显示全部楼层
lly*** 发表于 2024-3-21 11:57
您没明白我想表达的意思,我是说标准的库程序用在FreeRTOS里以后,用判断读取B_Can1Send的值始终没有变化 ...

那有可能是你没移植好,CAN数据发送完成后会产生TI中断,例程在发送完成中断里面修改B_Can1Send标志,主循环每秒钟发送一帧CAN数。
当然也可能是CAN总线没有搭建好,CAN数据通信需要总线上有2个以上节点,当你发送时总线上有其它节点进行应答,才能正常将数据发送出去,才能产生发送完成中断。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:322
  • 最近打卡:2025-05-02 10:02:36
已绑定手机

21

主题

487

回帖

1041

积分

金牌会员

积分
1041
发表于 2024-3-21 15:49:11 | 显示全部楼层
总线已经搭好,使用CAN分析仪进行通信验证的,通信没有问题,顺带验证了FIFO标准帧可以缓存5帧,扩展帧可以缓存4帧,但是由于任务无法用B_Can1Read标志判断接收(B_Can1Read始终为0),所以在任务里每次都是跳过判断if(B_Can1Read)用n=CanReadMsg()直接读取,当没有CAN数据帧时,总是有莫名随机的ID和帧数据(因为CAN网络此时没有数据),发送也是这种情况,发送一帧数据后B_Can1Send被置1,但是CAN TI发送完应该置0,但是却没有,所以发送一帧后会一直卡在判断里,关闭B_Can1Send判断就可以直接再次发送!附件是我修改的源代码,只保留了UART和CAN任务

FreeRTOS-STC32G-CORE-Library-Demo.zip

3.69 MB, 下载次数: 69

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-3-21 18:28:21 | 显示全部楼层
本帖最后由 乘风飞扬 于 2024-3-21 18:29 编辑
lly*** 发表于 2024-3-21 15:49
总线已经搭好,使用CAN分析仪进行通信验证的,通信没有问题,顺带验证了FIFO标准帧可以缓存5帧,扩展帧可以 ...
我不太明白,你初始化,收发都是使用CAN1,可是判断接收标志却又使用CAN2的标志,而且你在帖子里面提的也都是B_Can1Read。
截图202403211826087739.jpg
另外,建议移植最新版本库函数例程包里面的CAN总线库文件。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:322
  • 最近打卡:2025-05-02 10:02:36
已绑定手机

21

主题

487

回帖

1041

积分

金牌会员

积分
1041
发表于 2024-3-21 21:01:13 | 显示全部楼层
乘风*** 发表于 2024-3-21 18:28
我不太明白,你初始化,收发都是使用CAN1,可是判断接收标志却又使用CAN2的标志,而且你在帖子里面提的也都 ...

我知道的,这是我为了上传这个程序临时加上去的代码,当时着急没注意看,位置也没有放对,应该是在n = CanReadMsg(CAN1_Rx);前面的,我要表达的意思是这些发送接收标志根本就没有在CAN中断被处理,你可以把代码改正确去试试,因为我来回试来回改,所以往上发的时候拷贝粘贴错了,唉。。。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 20:53 , Processed in 0.244690 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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