CAN總線工作原理

    CAN是控制器局域網絡(Controller Area Network, CAN)的簡稱。CAN總線有兩條信號線構成,分別是CANL和CANH。相比於RS485總線構成的網絡,CAN總線構成的網絡更有優勢。
CAN的報文格式
    在總線中傳送的報文,每幀由7部分組成。CAN協議支持兩種報文格式,其唯一的不同是標識符(ID)長度不同,標準格式爲11位,擴展格式爲29位。
    在標準格式中,報文的起始位稱爲幀起始(SOF),然後是由11位標識符和遠程發送請求位 (RTR)組成的仲裁場。RTR位標明是數據幀還是請求幀,在請求幀中沒有數據字節。
    控制場包括標識符擴展位(IDE),指出是標準格式還是擴展格式。它還包括一個保留位 (ro),爲將來擴展使用。它的最後四個位用來指明數據場中數據的長度(DLC)。數據場範圍爲0~8個字節,其後有一個檢測數據錯誤的循環冗餘檢查(CRC)。
    應答場(ACK)包括應答位和應答分隔符。發送站發送的這兩位均爲隱性電平(邏輯1),這時正確接收報文的接收站發送主控電平(邏輯0)覆蓋它。用這種方法,發送站可以保證網絡中至少有一個站能正確接收到報文。
    報文的尾部由幀結束標出。在相鄰的兩條報文間有一很短的間隔位,如果這時沒有站進行總線存取,總線將處於空閒狀態。

   

如上圖所示,幀格式包括擴展幀和標準幀兩種。幀類型包括數據幀和遠程幀。數據部分最大長度共8個字節。在編程時,如下的數據結構可以用來描述一個CAN消息:

typedef struct 
{
    uint32_t id;            /**< 29 bit identifier, it depend on "format" value
                                 - if format = STD_ID_FORMAT, id should be 11 bit identifier
                                 - if format = EXT_ID_FORMAT, id should be 29 bit identifier
                             */
    uint8_t dataA[4];       /**< Data field A */
    uint8_t dataB[4];       /**< Data field B */
    uint8_t len;            /**< Length of data field in bytes, should be:
                                 - 0000b-0111b: 0-7 bytes
                                 - 1xxxb: 8 bytes
                            */
    uint8_t format;         /**< Identifier Format, should be:
                                 - STD_ID_FORMAT: Standard ID - 11 bit format
                                 - EXT_ID_FORMAT: Extended ID - 29 bit format
                            */
    uint8_t type;           /**< Remote Frame transmission, should be:
                                 - DATA_FRAME: the number of data bytes called out by the DLC
                                 field are send from the CANxTDA and CANxTDB registers
                                 - REMOTE_FRAME: Remote Frame is sent
                            */
} CAN_MSG_Type;


另外,還有如下圖所示的參數可以進行設置。如CAN總線的波特率,工作模式,過濾器裏的內容等。














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