CAN發(fā)送器(上)
CAN(Controller Area Network)總線作為一種高可靠性、實(shí)時性的串行通信協(xié)議,已廣泛應(yīng)用于汽車電子、工業(yè)控制、智能家居等眾多領(lǐng)域,其發(fā)送流程的嚴(yán)謹(jǐn)性和高效性是保障整個網(wǎng)絡(luò)穩(wěn)定運(yùn)行的核心。要理解CAN發(fā)送流程,首先需要明確其核心設(shè)計(jì)理念——基于總線仲裁的非破壞性競爭機(jī)制,這一機(jī)制貫穿于發(fā)送過程的每一個環(huán)節(jié),確保多個節(jié)點(diǎn)同時發(fā)送數(shù)據(jù)時不會造成信息丟失,同時實(shí)現(xiàn)優(yōu)先級的有序調(diào)度。
當(dāng)某個CAN節(jié)點(diǎn)需要發(fā)送數(shù)據(jù)時,流程的起點(diǎn)是數(shù)據(jù)的準(zhǔn)備與封裝。發(fā)送節(jié)點(diǎn)的微控制器(MCU)首先將需要傳輸?shù)挠行?shù)據(jù)按照應(yīng)用層協(xié)議的要求進(jìn)行整理,這些數(shù)據(jù)可能是傳感器采集的物理量、執(zhí)行器的控制指令或是設(shè)備狀態(tài)信息。隨后,MCU會將這些有效數(shù)據(jù)傳遞給CAN控制器,CAN控制器則根據(jù)CAN協(xié)議的規(guī)范,將數(shù)據(jù)封裝成標(biāo)準(zhǔn)的CAN數(shù)據(jù)幀。幀結(jié)構(gòu)的構(gòu)建是這一階段的關(guān)鍵,包括幀起始、仲裁場、控制場、數(shù)據(jù)場、CRC場、ACK場和幀結(jié)束七個部分,每個字段都有其特定的功能的——幀起始用于同步總線節(jié)點(diǎn),控制場定義數(shù)據(jù)長度,CRC場用于錯誤檢測,而仲裁場則是決定發(fā)送優(yōu)先級的核心,其包含的標(biāo)識符(ID)直接影響后續(xù)的總線競爭結(jié)果。值得注意的是,CAN協(xié)議分為標(biāo)準(zhǔn)幀(CAN 2.0A)和擴(kuò)展幀(CAN 2.0B),兩者的仲裁場長度不同,標(biāo)準(zhǔn)幀標(biāo)識符為11位,擴(kuò)展幀為29位,這一差異會在后續(xù)的仲裁過程中體現(xiàn),但封裝邏輯的本質(zhì)保持一致。
數(shù)據(jù)幀封裝完成后,CAN控制器并不會立即將數(shù)據(jù)發(fā)送到總線上,而是首先進(jìn)入總線狀態(tài)監(jiān)測階段。CAN總線采用雙線差分信號傳輸(CAN_H和CAN_L),正常情況下總線處于隱性電平狀態(tài)(CAN_H和CAN_L電壓差接近0V),只有當(dāng)有節(jié)點(diǎn)發(fā)送數(shù)據(jù)時才會切換為顯性電平(CAN_H比CAN_L高約2V)。發(fā)送節(jié)點(diǎn)的CAN控制器通過監(jiān)測總線電平,判斷當(dāng)前總線是否處于空閑狀態(tài)——如果總線為隱性電平,說明此時沒有其他節(jié)點(diǎn)正在發(fā)送數(shù)據(jù),控制器可以啟動發(fā)送流程;若檢測到顯性電平,則表明總線正被占用,節(jié)點(diǎn)需要等待,直到總線恢復(fù)隱性電平后再嘗試發(fā)送。這一監(jiān)測機(jī)制是避免總線沖突的第一道防線,確保每個節(jié)點(diǎn)都能在合適的時機(jī)接入總線。
總線空閑狀態(tài)確認(rèn)后,發(fā)送節(jié)點(diǎn)正式啟動數(shù)據(jù)發(fā)送,此時進(jìn)入最為關(guān)鍵的仲裁階段。CAN總線的核心優(yōu)勢之一就是其非破壞性仲裁機(jī)制,當(dāng)多個節(jié)點(diǎn)同時檢測到總線空閑并啟動發(fā)送時,仲裁過程會自動進(jìn)行,且不會導(dǎo)致任何數(shù)據(jù)丟失。仲裁的規(guī)則基于標(biāo)識符(ID)的優(yōu)先級:標(biāo)識符數(shù)值越小,優(yōu)先級越高。發(fā)送過程中,每個節(jié)點(diǎn)都會同時發(fā)送自己的標(biāo)識符,并實(shí)時監(jiān)測總線上的電平與自己發(fā)送的電平是否一致。由于顯性電平具有優(yōu)先級高于隱性電平的特性,當(dāng)兩個節(jié)點(diǎn)發(fā)送的標(biāo)識符位不同時,發(fā)送隱性電平的節(jié)點(diǎn)會檢測到總線上的顯性電平與自身發(fā)送的信號不一致,從而判斷出存在優(yōu)先級更高的節(jié)點(diǎn)正在發(fā)送數(shù)據(jù),此時該節(jié)點(diǎn)會立即停止發(fā)送,切換為接收模式,等待下一次總線空閑;而發(fā)送顯性電平的節(jié)點(diǎn)則繼續(xù)發(fā)送后續(xù)位,直到整個標(biāo)識符發(fā)送完成。這一過程持續(xù)進(jìn)行,直到只有一個節(jié)點(diǎn)保持發(fā)送狀態(tài),該節(jié)點(diǎn)即獲得總線控制權(quán),后續(xù)將繼續(xù)發(fā)送數(shù)據(jù)幀的其余部分。例如,節(jié)點(diǎn)A的標(biāo)識符為0x001(二進(jìn)制00000000001),節(jié)點(diǎn)B的標(biāo)識符為0x002(二進(jìn)制00000000010),當(dāng)兩者同時發(fā)送時,在第2位(從最低位計(jì)數(shù))節(jié)點(diǎn)A發(fā)送0,節(jié)點(diǎn)B發(fā)送1,此時總線電平為顯性(節(jié)點(diǎn)B發(fā)送的1),節(jié)點(diǎn)A檢測到不一致后停止發(fā)送,節(jié)點(diǎn)B則順利獲得仲裁權(quán),繼續(xù)發(fā)送數(shù)據(jù)。





