PIC16位单片机CAN(5)中断
? 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位单片机中 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)