CAN是控制器局域網(wǎng)絡(luò)(Controller Area Network, CAN)的簡(jiǎn)稱。CAN總線有兩條信號(hào)線構(gòu)成,分別是CANL和CANH。相比于RS485總線構(gòu)成的網(wǎng)絡(luò),CAN總線構(gòu)成的網(wǎng)絡(luò)更有優(yōu)勢(shì)。
CAN的報(bào)文格式
在總線中傳送的報(bào)文,每幀由7部分組成。CAN協(xié)議支持兩種報(bào)文格式,其唯一的不同是標(biāo)識(shí)符(ID)長(zhǎng)度不同,標(biāo)準(zhǔn)格式為11位,擴(kuò)展格式為29位。
在標(biāo)準(zhǔn)格式中,報(bào)文的起始位稱為幀起始(SOF),然后是由11位標(biāo)識(shí)符和遠(yuǎn)程發(fā)送請(qǐng)求位 (RTR)組成的仲裁場(chǎng)。RTR位標(biāo)明是數(shù)據(jù)幀還是請(qǐng)求幀,在請(qǐng)求幀中沒(méi)有數(shù)據(jù)字節(jié)。
控制場(chǎng)包括標(biāo)識(shí)符擴(kuò)展位(IDE),指出是標(biāo)準(zhǔn)格式還是擴(kuò)展格式。它還包括一個(gè)保留位 (ro),為將來(lái)擴(kuò)展使用。它的最后四個(gè)位用來(lái)指明數(shù)據(jù)場(chǎng)中數(shù)據(jù)的長(zhǎng)度(DLC)。數(shù)據(jù)場(chǎng)范圍為0~8個(gè)字節(jié),其后有一個(gè)檢測(cè)數(shù)據(jù)錯(cuò)誤的循環(huán)冗余檢查(CRC)。
應(yīng)答場(chǎng)(ACK)包括應(yīng)答位和應(yīng)答分隔符。發(fā)送站發(fā)送的這兩位均為隱性電平(邏輯1),這時(shí)正確接收?qǐng)?bào)文的接收站發(fā)送主控電平(邏輯0)覆蓋它。用這種方法,發(fā)送站可以保證網(wǎng)絡(luò)中至少有一個(gè)站能正確接收到報(bào)文。
報(bào)文的尾部由幀結(jié)束標(biāo)出。在相鄰的兩條報(bào)文間有一很短的間隔位,如果這時(shí)沒(méi)有站進(jìn)行總線存取,總線將處于空閑狀態(tài)。
如上圖所示,幀格式包括擴(kuò)展幀和標(biāo)準(zhǔn)幀兩種。幀類型包括數(shù)據(jù)幀和遠(yuǎn)程幀。數(shù)據(jù)部分最大長(zhǎng)度共8個(gè)字節(jié)。在編程時(shí),如下的數(shù)據(jù)結(jié)構(gòu)可以用來(lái)描述一個(gè)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;
另外,還有如下圖所示的參數(shù)可以進(jìn)行設(shè)置。如CAN總線的波特率,工作模式,過(guò)濾器里的內(nèi)容等。