微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC16位单片机CAN(5)中断

PIC16位单片机CAN(5)中断

时间: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 里面的第十一章就是说的中断向量的名称写法。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top