×
单片机 > 单片机程序设计 > 详情

PIC16位单片机CAN(5)中断

发布时间:2020-05-16 发布时间:
|
CAN数据的接收使用中断来处理。ECAN 模块会产生三种不同中断,每种中断都具有自己的中断向量、中断允许控制位、中断状态标志和中断优先级控制位。这些中断是:
?  CiTX——ECAN 发送数据请求
?  CiRX——ECAN 接收数据就绪
?  Ci——ECAN 事件中断
具体这三种中断的意义就不说了,看手册就行了。我使用的是事件中断也就是当成功接收报文并装入一个接收缓冲区 (报文缓冲区 0 至 31)时产生中断。
中断算是比较简单的,看一下初始化代码:
/* Enable ECAN1 Interrupt */ 
void Interrupt_Init(void)   
{
INTCON2bits.GIE = 1;//使能全局中断
INTCON1bits.NSTDIS = 0;//使能中断嵌套
IPC8bits.C1IP=6;//ECAN1 事件中断优先级 6
IFS2bits.C1IF=0;//ECAN1 事件中断标志状态位
IEC2bits.C1IE = 1;//ECAN1 事件中断允许位
// C1INTEbits.TBIE = 1;
C1INTEbits.RBIE = 1;//接收缓冲区中断允许位
}
再看中断处理函数代码:
void __attribute__((__interrupt__,no_auto_psv))_C1Interrupt (void)  
{    
IFS2bits.C1IF = 0;        // clear interrupt flag ECAN1 事件中断标志状态位
if(C1INTFbits.TBIF)
    { 
     C1INTFbits.TBIF = 0;
    } 
 
    if(C1INTFbits.RBIF)//接收缓冲区中断标志位
    {      
// read the message 
    if(C1RXFUL1bits.RXFUL1==1)//接收缓冲区 n 满位
    {
//      rx_ecan1message.buffer=1;
     C1RXFUL1bits.RXFUL1=0;
    }     
//     rxECAN1(&rx_ecan1message);           
C1INTFbits.RBIF = 0;//接收缓冲区中断标志位清0
Nop();
Nop();
}
}
中断处理函数的写法可以参考文档的第六章,中断的示例代码。_C1Interrupt代表是CAN1事件中断,这个名称必须看编译器的说明文档,在头文件里可能是找不到的。MPLAB?XC16 C COMPILER USER’S GUIDE 里面的第十一章就是说的中断向量的名称写法。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容