新聞中心

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

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 报价| 武功县| 墨脱县| 宾川县| 鹤庆县| 青浦区| 连江县| 富川| 固阳县| 辽宁省| 儋州市| 葵青区| 剑川县| 富川| 临泉县| 东至县| 孟津县| 莒南县| 鱼台县| 长兴县| 五台县| 轮台县| 长阳| 仪陇县| 怀远县| 环江| 定陶县| 五寨县| 茶陵县| 肃南| 民县| 思茅市| 正镶白旗| 桑植县| 通江县| 交城县| 乌拉特前旗| 青海省| 清涧县| 山阳县| 酉阳|