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
参考我们的范例程序
感谢提示,例程我都看过的,并且已经移植到FreeRTOS里了,设定间隔时间能正常进入CAN收发信息,但是不知为什么CAN中断里的B_Can1Send; B_Can1Read;在FreeRTOS系统里好像没有被赋值,引申的问题为如果我连续发送CAN信息无法检测CAN是否已经完成上一帧发送,而接收信息时由于B_Can1Read没有被置位,在CAN任务里我怎么判断是否有收到新信息?我初学FreeRTOS,还请指教,是否在FreeRTOS系统里不需要这样检测或者用其他方法? llyymm 发表于 2024-3-21 09:18
感谢提示,例程我都看过的,并且已经移植到FreeRTOS里了,设定间隔时间能正常进入CAN收发信息,但是不知 ...
举个例子,实验箱例程包:“51-CAN1-CAN2总线标准帧扩展帧同时使用收发测试”
主循环里通过判断 B_Can1Read、B_Can2Read 标志位确定是否有收到CAN总线数据,有的话根据需要进行处理:
在 CanSendMsg 函数里面判断 B_Can1Send、B_Can1Send 标志位确定上次发送是否完成,完成的话才进行本次发送:
乘风飞扬 发表于 2024-3-21 11:26
举个例子,实验箱例程包:“51-CAN1-CAN2总线标准帧扩展帧同时使用收发测试”
主循环里通过判断 B_Can1Re ...
您没明白我想表达的意思,我是说标准的库程序用在FreeRTOS里以后,用判断读取B_Can1Send的值始终没有变化,永远是无消息状态!包括发送标志也是如此,发送完一帧后B_Can1Send被置1,然后CAN发送完一帧也不会有清除B_Can1Send的动作,新代码增加了超时处理,那也只是跳过,所以第二帧会一直发不出去! llyymm 发表于 2024-3-21 11:57
您没明白我想表达的意思,我是说标准的库程序用在FreeRTOS里以后,用判断读取B_Can1Send的值始终没有变化 ...
那有可能是你没移植好,CAN数据发送完成后会产生TI中断,例程在发送完成中断里面修改B_Can1Send标志,主循环每秒钟发送一帧CAN数。
当然也可能是CAN总线没有搭建好,CAN数据通信需要总线上有2个以上节点,当你发送时总线上有其它节点进行应答,才能正常将数据发送出去,才能产生发送完成中断。 总线已经搭好,使用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:29 编辑
llyymm 发表于 2024-3-21 15:49
总线已经搭好,使用CAN分析仪进行通信验证的,通信没有问题,顺带验证了FIFO标准帧可以缓存5帧,扩展帧可以 ...我不太明白,你初始化,收发都是使用CAN1,可是判断接收标志却又使用CAN2的标志,而且你在帖子里面提的也都是B_Can1Read。
另外,建议移植最新版本库函数例程包里面的CAN总线库文件。
乘风飞扬 发表于 2024-3-21 18:28
我不太明白,你初始化,收发都是使用CAN1,可是判断接收标志却又使用CAN2的标志,而且你在帖子里面提的也都 ...
我知道的,这是我为了上传这个程序临时加上去的代码,当时着急没注意看,位置也没有放对,应该是在n = CanReadMsg(CAN1_Rx);前面的,我要表达的意思是这些发送接收标志根本就没有在CAN中断被处理,你可以把代码改正确去试试,因为我来回试来回改,所以往上发的时候拷贝粘贴错了,唉。。。{:4_167:}
页:
[1]