基於dsPIC33EP256MC504的CAN總線數據傳輸的小結

本文是建立在CAN總線可以接收、發送單個報文的基礎上


連續發送:

       對於連續發送,需要注意的地方是,每傳輸一個報文前,都需要重新設置ECAN模塊,具體設置流程如下:

       1、將ECAN模式設置在配置模式下(即C1CTRL1bits.REQOP = 4;)

       2、SFR映射窗口使用緩衝區窗口(即C1CTRL1bits.WIN = 0;)

       3、配置用於發送的報文緩衝區,並指定緩衝區的優先級

       4、此時ECAN模塊準備發送數據,應將ECAN模式設爲正常工作模式(即C1CTRL1bits.REQOP = 0;)

       5、將CAN報文寫入位於器件RAM中的報文緩衝區

       6、將緩衝區的發送請求位置1,以啓動報文發送

       其中1和2的作用是允許報文的連續發送,3、4、5和6項是每傳輸一個報文所需要的步驟

連續接收:

       對於連續接收,首先需要主意的地方和連續發送類似;其次需要注意的地方是,在清零接收緩衝區標誌位前,確定數據已傳輸完。具體流程如下:

       1、將ECAN模式設置在配置模式下(即C1CTRL1bits.REQOP = 4;)

       2、SFR映射窗口使用過濾器窗口(即C1CTRL1bits.WIN = 1;)

       3、選擇接收過濾寄存器器,並使能該過濾器

       4、設置屏蔽器(確定需要過濾的位)

       5、設置過濾器(只有傳入的報文中包含相應的標識符時,其內容才能接收到相應的緩衝區中)

       6、SFR映射窗口使用緩衝區窗口(即C1CTRL1bits.WIN = 0;)

       7、此時ECAN模塊準備接收數據,應將ECAN模式設爲正常工作模式(即C1CTRL1bits.REQOP = 0;)

      以上7步也是單個報文的接收流程。

       對於清零接收緩衝區標誌位,建議在事件中斷裏進行清零操作。如下:

       /*CAN事件中斷*/
void __attribute__((__interrupt__,  no_auto_psv)) _C1Interrupt(void)
{
    IFS2bits.C1IF = 0;
    if(1 == C1INTFbits.TBIF)
    {
        C1INTFbits.TBIF = 0;         //清零發送中斷
    }
    if(1 == C1INTFbits.RBIF)
    {
        C1INTFbits.RBIF = 0;        //清零接收中斷
        C1RXFUL1bits.RXFUL0 = 0;    //清零接收緩衝區標誌位
    }

    if(1 == C1RXOVF1bits.RXOVF0)
        C1RXOVF1bits.RXOVF0 = 0;      //清零溢出標誌位
}


收發交替進行:

       你的連續發送、連續接收都沒問題,並不代表收發交替就是沒問題的,往往是有問題的  …………

       需要注意的暫時只有一點:在接收報文前,必須清零發送標誌位,而該清零步驟不能隨便加,必須加在連續接收的第6步與第7步之間(即C1TR01CONbits.TXEN0 = 0;



     剛剛接觸CAN總線,如有不妥,請QQ聯繫,歡迎指點:375830746


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章