PIC16位單片機CAN(5)中斷
? CiTX——ECAN 發(fā)送數(shù)據(jù)請求
? CiRX——ECAN 接收數(shù)據(jù)就緒
? Ci——ECAN 事件中斷具體這三種中斷的意義就不說了,看手冊就行了。我使用的是事件中斷也就是當成功接收報文并裝入一個接收緩沖區(qū) (報文緩沖區(qū) 0 至 31)時產(chǎn)生中斷。
中斷算是比較簡單的,看一下初始化代碼:
/* Enable ECAN1 Interrupt */
void Interrupt_Init(void)
{
INTCON2bits.GIE = 1;//使能全局中斷
INTCON1bits.NSTDIS = 0;//使能中斷嵌套
IPC8bits.C1IP=6;//ECAN1 事件中斷優(yōu)先級 6
IFS2bits.C1IF=0;//ECAN1 事件中斷標志狀態(tài)位
IEC2bits.C1IE = 1;//ECAN1 事件中斷允許位
// C1INTEbits.TBIE = 1;
C1INTEbits.RBIE = 1;//接收緩沖區(qū)中斷允許位
}
再看中斷處理函數(shù)代碼:
void __attribute__((__interrupt__,no_auto_psv))_C1Interrupt (void)
{
IFS2bits.C1IF = 0; // clear interrupt flag ECAN1 事件中斷標志狀態(tài)位
if(C1INTFbits.TBIF)
{
C1INTFbits.TBIF = 0;
}
if(C1INTFbits.RBIF)//接收緩沖區(qū)中斷標志位
{
// read the message
if(C1RXFUL1bits.RXFUL1==1)//接收緩沖區(qū) n 滿位
{
// rx_ecan1message.buffer=1;
C1RXFUL1bits.RXFUL1=0;
}
// rxECAN1(&rx_ecan1message);
C1INTFbits.RBIF = 0;//接收緩沖區(qū)中斷標志位清0
Nop();
Nop();
}
}
中斷處理函數(shù)的寫法可以參考文檔的第六章,中斷的示例代碼。_C1Interrupt代表是CAN1事件中斷,這個名稱必須看編譯器的說明文檔,在頭文件里可能是找不到的。MPLAB?XC16 C COMPILER USER’S GUIDE 里面的第十一章就是說的中斷向量的名稱寫法。
評論