久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

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位單片機中

評論


技術專區

關閉