新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > PIC16位單片機(jī)CAN(5)中斷

PIC16位單片機(jī)CAN(5)中斷

作者: 時間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
CAN數(shù)據(jù)的接收使用中斷來處理。ECAN 模塊會產(chǎn)生三種不同中斷,每種中斷都具有自己的中斷向量、中斷允許控制位、中斷狀態(tài)標(biāo)志和中斷優(yōu)先級控制位。這些中斷是:
? CiTX——ECAN 發(fā)送數(shù)據(jù)請求
? CiRX——ECAN 接收數(shù)據(jù)就緒
? Ci——ECAN 事件中斷
具體這三種中斷的意義就不說了,看手冊就行了。我使用的是事件中斷也就是當(dāng)成功接收報文并裝入一個接收緩沖區(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 事件中斷標(biāo)志狀態(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 事件中斷標(biāo)志狀態(tài)位
if(C1INTFbits.TBIF)
{
C1INTFbits.TBIF = 0;
}
if(C1INTFbits.RBIF)//接收緩沖區(qū)中斷標(biāo)志位
{
// read the message
if(C1RXFUL1bits.RXFUL1==1)//接收緩沖區(qū) n 滿位
{
// rx_ecan1message.buffer=1;
C1RXFUL1bits.RXFUL1=0;
}
// rxECAN1(&rx_ecan1message);
C1INTFbits.RBIF = 0;//接收緩沖區(qū)中斷標(biāo)志位清0
Nop();
Nop();
}
}
中斷處理函數(shù)的寫法可以參考文檔的第六章,中斷的示例代碼。_C1Interrupt代表是CAN1事件中斷,這個名稱必須看編譯器的說明文檔,在頭文件里可能是找不到的。MPLAB?XC16 C COMPILER USER’S GUIDE 里面的第十一章就是說的中斷向量的名稱寫法。


關(guān)鍵詞: PIC16位單片機(jī)中

評論


技術(shù)專區(qū)

關(guān)閉