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





