llyymm 发表于 2024-3-21 00:52:03

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

使用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现场恢复
}


国学芯用 发表于 2024-3-21 09:01:32

参考我们的范例程序

llyymm 发表于 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系统里不需要这样检测或者用其他方法?

乘风飞扬 发表于 2024-3-21 11:26:39

llyymm 发表于 2024-3-21 09:18
感谢提示,例程我都看过的,并且已经移植到FreeRTOS里了,设定间隔时间能正常进入CAN收发信息,但是不知 ...

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



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



llyymm 发表于 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的动作,新代码增加了超时处理,那也只是跳过,所以第二帧会一直发不出去!

乘风飞扬 发表于 2024-3-21 13:09:36

llyymm 发表于 2024-3-21 11:57
您没明白我想表达的意思,我是说标准的库程序用在FreeRTOS里以后,用判断读取B_Can1Send的值始终没有变化 ...

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

llyymm 发表于 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任务

乘风飞扬 发表于 2024-3-21 18:28:21

本帖最后由 乘风飞扬 于 2024-3-21 18:29 编辑

llyymm 发表于 2024-3-21 15:49
总线已经搭好,使用CAN分析仪进行通信验证的,通信没有问题,顺带验证了FIFO标准帧可以缓存5帧,扩展帧可以 ...我不太明白,你初始化,收发都是使用CAN1,可是判断接收标志却又使用CAN2的标志,而且你在帖子里面提的也都是B_Can1Read。

另外,建议移植最新版本库函数例程包里面的CAN总线库文件。

llyymm 发表于 2024-3-21 21:01:13

乘风飞扬 发表于 2024-3-21 18:28
我不太明白,你初始化,收发都是使用CAN1,可是判断接收标志却又使用CAN2的标志,而且你在帖子里面提的也都 ...

我知道的,这是我为了上传这个程序临时加上去的代码,当时着急没注意看,位置也没有放对,应该是在n = CanReadMsg(CAN1_Rx);前面的,我要表达的意思是这些发送接收标志根本就没有在CAN中断被处理,你可以把代码改正确去试试,因为我来回试来回改,所以往上发的时候拷贝粘贴错了,唉。。。{:4_167:}
页: [1]
查看完整版本: FreeRTOS库函数版的CAN功能设置问题请教