新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > PIC16位单片机CAN(5)中断

PIC16位单片机CAN(5)中断

作者: 时间:2016-11-13 来源:网络 收藏
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 里面的第十一章就是说的中断向量的名称写法。


关键词: PIC16位单片机中

评论


技术专区

关闭