请教:
正常流程:CAN设置成中断接收方式,通过CAN调试助手,发送一帧数据,产生一个CAN接收中断,并进行数据处理;
异常流程:如果我发送CAN数据的速度足够快,使得在CAN接收中断处理函数中,还没处理完,新的一帧数据又发送完成,此时,DSP底层会怎么样?下次等新的数据再来的时候,还会再正常进入CAN接收中断吗?
user151383853:
不知道是什么型号, 28069 手册上有段话说明了这个问题:
RMP[n] (RMP.31-0) has to be reset by the CPU after reading the data. If a second message has been received for this mailbox and the receive-message-pending bit is already set, the corresponding message-lost bit (RML[n] (RML.31-0)) is set. In this case, the stored message is overwritten with the new data if the overwrite-protection bit OPC[n] (OPC.31-0) is cleared; otherwise, the next mailboxes are checked.
请教:
正常流程:CAN设置成中断接收方式,通过CAN调试助手,发送一帧数据,产生一个CAN接收中断,并进行数据处理;
异常流程:如果我发送CAN数据的速度足够快,使得在CAN接收中断处理函数中,还没处理完,新的一帧数据又发送完成,此时,DSP底层会怎么样?下次等新的数据再来的时候,还会再正常进入CAN接收中断吗?
kevin huang1:
回复 user151383853:
DSP型号为TMS320F28335;
我们碰到过一个问题,在某种情况下,即使往DSP发送数据,但该DSP就是无法进入CAN接收中断,这种情况下,只要将该中断邮箱对应的RMP标志位清零,就可以正常进入CAN接收中断了;
所以,我想了解一下,当处于CAN接收中断处理函数中时,如果新的一帧数据又接收成功(仅仅使能了发送中断和接收中断),会不会导致上述的问题?
请教:
正常流程:CAN设置成中断接收方式,通过CAN调试助手,发送一帧数据,产生一个CAN接收中断,并进行数据处理;
异常流程:如果我发送CAN数据的速度足够快,使得在CAN接收中断处理函数中,还没处理完,新的一帧数据又发送完成,此时,DSP底层会怎么样?下次等新的数据再来的时候,还会再正常进入CAN接收中断吗?
Hank Zhao:
回复 kevin huang1:
如果新的数据帧的优先级高的话,发生中断嵌套,否则新的中断pending,在中断处理函数的结尾清除RMP位,然后CPU开始处理等待中的中断。
请教:
正常流程:CAN设置成中断接收方式,通过CAN调试助手,发送一帧数据,产生一个CAN接收中断,并进行数据处理;
异常流程:如果我发送CAN数据的速度足够快,使得在CAN接收中断处理函数中,还没处理完,新的一帧数据又发送完成,此时,DSP底层会怎么样?下次等新的数据再来的时候,还会再正常进入CAN接收中断吗?
kevin huang1:
回复 Hank Zhao:
感谢HankZhao的耐心解答,我对问题补充如下:
1、同样的数据,优先级一样,按照HankZhao的说法,此时应该处于中断Pending状态;
2、如果没有在中断函数的结尾处清除RMP位,此时会怎样?我怀疑如果没有清除RMP位的话,就会导致新的数据进来,也无法触发接收中断;
3、我的中断处理函数结构如下:
接收到一帧数据,进中断;
interupt void CAN_Receive()
{
(1)清除邮箱消息挂起标志位,即RMP[n];
(2)中断接收函数具体处理程序;
(3)清除GIF0标志位,清除PIEACK标志位;
}
出中断,等待接收新的数据;
类似的问题,在上述的中断处理函数中,极端情况下,如果第二步(2)中断接收函数具体处理程序的处理时间非常长,假设为200us,这样就超出了一帧CAN数据的传送时间(8个字节的为120us左右),此时,就会出现即使接收到CAN数据也无法进入CAN接收中断的现象,查询此时的标志位,发现消息接收挂起标志RMP一直是1,但就是无法进入中断;
不知道这样,我的问题描述是否清楚,谢谢大家。
请教:
正常流程:CAN设置成中断接收方式,通过CAN调试助手,发送一帧数据,产生一个CAN接收中断,并进行数据处理;
异常流程:如果我发送CAN数据的速度足够快,使得在CAN接收中断处理函数中,还没处理完,新的一帧数据又发送完成,此时,DSP底层会怎么样?下次等新的数据再来的时候,还会再正常进入CAN接收中断吗?
Hank Zhao:
回复 kevin huang1:
1,是的,如果优先级一样,新的中断也会处于pending状态。
2,是的,如果没有清除RMP位,无法触发新的中断,置位RMP位在清除RMP位的同时也会清除GIF标志位。
3,中断处理函数不宜过长。步骤(1)已经清除过一次GIF0标志位,步骤(3)就不需要再清除了。
请教:
正常流程:CAN设置成中断接收方式,通过CAN调试助手,发送一帧数据,产生一个CAN接收中断,并进行数据处理;
异常流程:如果我发送CAN数据的速度足够快,使得在CAN接收中断处理函数中,还没处理完,新的一帧数据又发送完成,此时,DSP底层会怎么样?下次等新的数据再来的时候,还会再正常进入CAN接收中断吗?
kevin huang1:
回复 Hank Zhao:
我最终解释一下,请HankZhao看一下是否正确。
28335的CAN接收中断的产生必须得有GIFn有一个从0到1的电平跳变过程,当DSP芯片底层CAN电路捕捉到该上升沿跳变过程时,就会产生一个中断;
而GIFn这个标志位是由消息挂起寄存器即RMPn决定的,当RMP为0时,GIF也为0;当RMP为1时,GIF也为1,所以,对于RMP的清零或者置1都会相应地引起GIF相同的变化;
在这个问题中,由于中断嵌套或者通讯机制不太合理,并且RMP的清零是在CAN接收中断函数起始处就进行的,因此,如果在CAN接收中断函数处理程序中,如果又接收到新的数据,那么RMP又置1,并且相应的GIF也置1,因此当退出CAN接收中断时,当接收到新的数据时,由于RMP和GIF始终为1,即高电平,DSP无法捕捉到上升沿电平的跳变,所以,没办法再次进入中断;
为了防止上述问题的发生,我们在每次退出CAN接收中断函数之前,得再次检查RMP是否被再次复位。