有两种不同的中断。一种中断是与信息对象相关的中断,例如,接收信息悬挂中断或发送终止应答中断。另一种中断是系统中断,它处理错误或系统相关的中断源,例如,错误无效中断或唤醒中断。图12-7所示为CAN中断框图。
以下事件将引起两种中断中的一种:
1)信息对象中断。
●信息接收中断:接收了一条信息。
●信息发送中断:成功发送一条信息。
●发送终止应答中断:信息发送时被终止。
●接收信息丢失中断:一条新的信息覆盖了未读的旧信息。
●邮箱超时中断(仅在eCAN模式):信息的发送或接收没有在预定义的时间帧内完成。
2)系统中断。
●拒绝写中断:CPU要写邮箱但却不允许。
●唤醒中断:该中断在唤醒后产生。
●总线关闭中断:CAN模块进入总线关闭状态。
●错误无效中断:CAN模块进入错误无效模式。
●警告级中断:一个或两个错误计数器大于或等于96。
●时间标志定时器溢出中断(仅在eCAN模式):时间标志计数器发生溢出。
1.中断设计
如果中断发生,则置位对应的中断标志位。系统中断标志位的置位取决于GIL位(CANGIM.2)的设置。如果置位GIL,则全局中断将寄存器CANGIF1中的位置位,否则,它们将寄存器CANGIF0中的位置位。
GMIF0/GMIF1(CANGIF0.15/CANCIF1.15)位的置位取决于CANMIL.n位的设置,而这与产生中断的信息对象相关。如果置位CANMIL.n位,对应信息对象中断标志位MIFn将把CANGIF1寄存器的GMIF1标志位置位,否则,它将置GMIF0的标志位。
如果清除所有中断标志,一个新的中断将置位标志,并且置位对应中断屏蔽位,则激活CAN模块中断输出线(ECAN0INT或ECAN1INT)。中断线保持激活的状态直到CPU清零中断标志,清中断标志位是通过向对应的位写入1来实现的。
图12-7 CAN中断
GMIF0或GMIF1位必须通过向CANTA寄存器或CANRMP寄存器(取决于邮箱配置)对应的位写入1来清零,并且不能在CANGIF0/CANGIF1寄存器中清零。
在清除一个或多个中断标志位后,当一个或多个中断标志位仍然悬挂,将产生一个新的中断。通过向对应的位写入1来清除中断标志位。如果置位GMIF0或GMIF1位,则邮箱中断向量MIV0(CANGIF0.4~0)或MIV1(CANGIF1.4~0)将指明引起GMIF0/1置位的邮箱序号。它总是显示分配到该中断线的最高序号邮箱的中断向量。
2.信息对象中断
eCAN模式的32个邮箱或标准模式的16个邮箱中的任何一个都可以启动两条中断输出线(1或0)之一。根据邮箱的配置,这些中断可以是接收或发送中断。
每一个邮箱都有一个中断屏蔽位(CANMIM.n)和一个中断优先级位(CANMIL.n)。要产生一个接收/发送中断,必须置位CANMIM位,如果CAN信息被一个接收邮箱接收(CANRMP.n=1)或从一个发送邮箱发送(CANTA.n=1),则将产生一个中断。如果配置邮箱为一个远程请求邮箱(CANMD.n=1,MSGCTRL寄存器的位RTR=1),则当接收到回复帧时产生中断。远程回复邮箱(CANMD.n=0,MSGID寄存器的位AAM=1)在成功发送回复帧后产生中断。
如果置位对应的中断标志位,则对CANRMP.n位或CANTA.n位置位也会将CANGIF0/CANGIF1寄存器的GMIF0/GMIF1标志位置位,然后GMIF0/GMIF1标志位产生一个中断,并且对应邮箱向量(=邮箱序号)可以从CANGIF0/CANGIF1寄存器的位域MIV0/MIV1读出。如果有多个邮箱中断悬挂,则MIV0/MIV1的实际值反映了最高优先级的中断向量。中断的产生取决于邮箱中断优先级寄存器(CANMIL)的设置。
当发送信息由于设置CANTRR.n位为1而终止时,发送终止应答标志位(CANAA.n)和终止应答中断标志位(AAIF)被置位。如果置位了CANGIM寄存器中的屏蔽位AAIM,则发送终止后就会产生一个中断。清除CANAA.n标志位不会复位AAIF0/AAIF1标志位。应该单独清零中断标志位。发送终止应答中断所选择的中断线要与相关邮箱的CANMIL.n位一致。
接收信息的丢失通过设置接收信息丢失标志位CANRML.n和CANGIF0/CANGIF1寄存器的接收信息丢失中断标志位RMLIF0/RMLIF1来告知。如果要产生一个接收信息丢失事件的中断,需要置位CANGIM寄存器中的接收信息丢失中断屏蔽位(RMLIM)。清除CAN⁃RML.n标志位不会复位RMLIF0/RMLIF1标志位。应该单独清零中断标志位。接收信息丢失中断所选择的中断线要与相关邮箱的中断优先级CANMIL.n一致。
eCAN的每一个邮箱(仅在eCAN模式)都连接到一个信息对象超时寄存器(MOTO)。如果一个超时事件发生(CANTOS.n=1),且置位了CANGIM寄存器中的邮箱超时中断屏蔽位(MTOM),则在两条中断线的其中之一上将产生一个邮箱超时中断。清除CANTOS.n标志位不会复位MTOF0/MTOF1标志位。邮箱超时中断所选的中断线要与相关邮箱的中断优先级CANMIL.n一致。
3.中断处理
CPU的中断通过两条中断线之一来申请。中断处理完成以后(通常会清除中断源),CPU必须清零中断标志位,即清除CANGIF0或CANGIF1寄存器的中断标志位,而该标志位的清零是通过写入1来实现的。也有一些例外,见表12-4。如果没有其他的中断悬挂,将释放中断线。
表12-4 中断的申明及清除
(www.daowen.com)
(续)
注:1.中断标志列:适用于寄存器CANGIF0/1的中断标志名称。
2.中断条件列:表中该列是引起中断的条件。
3.CANGIF0/1设定位列:中断标志位可以在寄存器CANGIF0或CANGIF1中设置,这由CANGIM寄存器中的GIL位或CANMIL寄存器中的MILn位来决定(取决于所用的中断)。这一列显示了特定的中断是由GIL位决定还是MILn位来决定。
4.清除机制列:这一列解释了怎样清除某个标志位。有些标志位可以通过写入1来清除,另一些则是通过对CAN控制寄存器的某些位进行操作来清除。
4.中断处理的配置
为了对中断处理进行配置,就必须对邮箱中断优先级寄存器(CANMIL)、邮箱中断屏蔽寄存器(CANMIM)以及全局中断屏蔽寄存器(CANGIM)进行配置。具体配置步骤如下:
1)写CANMIL寄存器。这将确定一次成功的发送是申请中断线0还是中断线1。例如,CANMIL=0xFFFF FFFF将设置所有的邮箱中断连接到中断线1。
2)配置邮箱中断屏蔽寄存器(CANMIM)来指明不引起中断的邮箱。可以设置该寄存器为0xFFFF FFFF,这将使能所有的邮箱中断。没有使用的邮箱不会引起任何中断。
3)配置CANGIM寄存器。应该始终置位(使能对应中断)标志位AAIM、WDIM、WUIM、BOIM、EPIM和WLIM(CANGIM.14~9)。另外,可以将GIL位(CANGIM.2)置位来使全局中断处于与邮箱中断不同的中断优先级。应该置位I1EN(CANGIM.1)和I0EN(CANGIM.0)两个标志位来使能两条中断线。也可以置位RMLIM标志位(CANGIM.11),这取决于CPU的负荷。
这样的配置将所有的邮箱中断放在中断线1,而所有的系统中断放在中断线0。因此,CPU可以将所有系统中断(通常比较重要)处理为高优先级,而将所有邮箱中断(在另一个中断线上)处理为较低的优先级。可以指定所有高优先级信息连接到中断线0上。
5.邮箱中断的处理
邮箱中断有3个中断标志位。具体描述如下:
GMIF0/GMIF1:有一个对象接收或发送了一条信息。邮箱的序号在MIV0/MIV1(CAN-GIF0.4~0/CANGIF1.4~0)中。通常的处理办法如下:
1)在引起中断的CANGIF0/1寄存器上进行半字的读。如果值为负,则是邮箱引起中断。否则,检测AAIF0/AAIF1(CANGIF0.14/CANGIF1.14,终止应答中断标志位)或RM-LIF0/RMLIF1位(CANGIF0.11/CANGIF1.11,接收信息丢失中断标志位),不然将产生系统中断。在这种情况下,应该检测每一个系统中断标志位。
2)如果是RMLIF(CANGIF0.11)标志位引起中断,则有一个邮箱中的信息已经被新信息覆盖了。这在正常操作下是不应该发生的事情。CPU需要向该标志位写入1来清零。CPU必须检查接收信息丢失寄存器(CANRML)来确定是哪个邮箱引起的中断。根据应用情况决定CPU下一步要作什么事情。该中断与GMIF0/GMIF1中断一起出现。
3)如果是AAIF(GIF.14)标志位引起的中断,则CPU将终止发送操作。CPU应该检查终止应答寄存器(CANAA寄存器的位31~0)来确定是哪个邮箱引起的中断,并且如果需要将重发信息。必须向标志位写入1来清零标志位。
4)如果是GMIF0/GMIF1(CANGIF0.15/CANGIF1.15)标志位引起的中断,引起中断的邮箱序号可以从MIV0/MIV1位域读取。可以作为向量用来跳转到需要处理的那个邮箱位置;如果它是一个接收邮箱,则CPU应该读取数据,并且向CANRMP.31~0标志位写入1从而清除该标志位;如果它是一个发送邮箱,则没有更多的操作要求,除非CPU需要发送更多数据。在这种情况下,前面描述的正常发送程序是必要的。CPU应该向发送应答位(CAN⁃TA.31~0)写入1从而清除该位。
6.中断处理的顺序
为了让CPU内核识别并处理CAN中断,在任何CAN中断服务程序(ISR)中必须进行以下操作:
1)必须清除寄存器GMIF0/GMIF1中引起中断的标志位。这些寄存器中有两类标志位:
第一类:必须通过对标志位写入1来清除。包括:TCOFn、WDIFn、WUIFn、BOIFn、EPIFn和WLIFn。
第二类:必须通过对相关寄存器中的对应位进行写操作来清除。包括:MTOFn、GMIFn、AAIFn和RMLIFn。
①通过清除CANTOS寄存器中的对应位来清除MTOFn位。例如,如果由于MTOFn位被置位而使27号邮箱发生了超时中断,ISR(在正确处理完超时条件后)需要清除CAN⁃TOS.27来使MTOFn位清零。
②通过清除CANTA或CANRMP寄存器中的对应位来清除GMIFn位。例如,邮箱19已被配置为发送邮箱并完成了一次发送操作,则CANTA.19会置位,然后置位GMIFn位。ISR需要清除CANTA.19来清除GMIFn位。如果邮箱8已被配置为接收邮箱并完成一次接收操作,则CANRMP.8会置位,然后置位GMIFn位。ISR需要清除CANRMP.8来使GMIFn位清零。
③通过清除CANAA寄存器中的对应位来清除AAIFn位。例如,如果由于置位AAIFn位而使邮箱13的发送终止,则ISR就需要清除CANAA.13来使AAIFn位清零。
④通过清除CANRMP寄存器中的对应位来清除RMLIFn位。例如,如果由于邮箱13的信息发生过冲情况,而置位了RMLIFn位,则ISR就需要清除CANRMP.13来清零RMLIFn位。
2)与CAN模块对应的PIEACK位必须写入1,这可以用以下的C语言语句来实现:
PieCtrlRegs.PIEACK.bit.ACK9=1;
3)必须使能CAN模块对应的进入CPU的中断线。这可以用以下的C语言语句来实现:
IER |=0x0100; //使能INT9
4)必须清除INTM位来使能CPU的全局中断。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。