基礎(chǔ)知識(shí)之CAN總線
CAN - 英文Controller Area Network(控制器局域網(wǎng))的縮寫,是一種串行的車輛總線標(biāo)準(zhǔn),旨在允許微控制器和設(shè)備在沒有主機(jī)的情況下與彼此的應(yīng)用程序進(jìn)行通信。它專為比較惡劣的環(huán)境下還能夠保持可靠且靈活的性能而設(shè)計(jì),比較適合于工業(yè)和汽車領(lǐng)域。
本文引用地址:http://www.ex-cimer.com/article/202404/457293.htmCAN總線最早是由Bosch發(fā)明,后成了標(biāo)準(zhǔn)ISO11898-1,它定義了開放系統(tǒng)互聯(lián)模型(OSI)中的數(shù)據(jù)鏈路和物理層,為高速車內(nèi)通信提供了一種底層的網(wǎng)絡(luò)方案。值得一提的是,CAN被設(shè)計(jì)為減少電纜的連線,因此車內(nèi)不同的電氣控制單元(ECUs)可以通過只有一對(duì)電纜進(jìn)行通信。
車載診斷 (OBD) 是車輛的診斷和報(bào)告系統(tǒng),幫助技術(shù)人員通過診斷故障代碼 (DTC) 排除問題。 當(dāng)“檢查發(fā)動(dòng)機(jī)”燈亮起時(shí),技術(shù)人員通常會(huì)使用手持設(shè)備讀取車輛的發(fā)動(dòng)機(jī)代碼。 在最低層,該數(shù)據(jù)通過信令協(xié)議傳輸,大多數(shù)情況下是使用CAN總線。
DeviceNet是工業(yè)應(yīng)用中使用的高級(jí)網(wǎng)絡(luò)協(xié)議。 它大大減少了控制系統(tǒng)和I/O設(shè)備之間所需的接線。 設(shè)備可以通過四線連接器連接在一起并連接到 PLC 上的網(wǎng)絡(luò)掃描儀,而不是將每個(gè)設(shè)備連接到 PLC I/O 模塊上的單獨(dú)輸入/輸出。 在最低層,我們發(fā)現(xiàn)CAN在DeviceNet協(xié)議中發(fā)揮著其魔力。 圖 2 顯示了PLC掃描通過DeviceNet進(jìn)行通信的工業(yè)設(shè)備網(wǎng)絡(luò)。
CAN總線采用雙絞線提供抗共模干擾能力強(qiáng)的差分信號(hào)傳輸,線的兩端分別接有120歐的電阻,每個(gè)模塊都有兩個(gè)腳分別連在這兩根線上,對(duì)于每個(gè)模塊的內(nèi)部,都包含一個(gè)CAN收發(fā)器。 CAN總線一般分為低速和高速,低速CAN傳輸速率<125kbps, 高速CAN傳輸速率<1Mbps,目前還有一種CAN FD可以視為CAN的升級(jí)版,傳輸速率<5Mbps。
2. CAN消息幀
那么CAN消息實(shí)際上是什么樣子的呢? 最初的ISO標(biāo)準(zhǔn)制定了所謂的標(biāo)準(zhǔn)CAN。 標(biāo)準(zhǔn)CAN對(duì)不同的報(bào)文使用11位標(biāo)識(shí)符,總共有211個(gè),即2048個(gè)不同的報(bào)文ID。 CAN后來做了修改,標(biāo)識(shí)符擴(kuò)展為29位,得到229個(gè)標(biāo)識(shí)符。 這稱為擴(kuò)展 CAN。 CAN使用多主總線,所有消息都在整個(gè)網(wǎng)絡(luò)上廣播。 標(biāo)識(shí)符提供仲裁的消息優(yōu)先級(jí)。
CAN使用具有兩種邏輯狀態(tài)的差分信號(hào),稱為隱性和主導(dǎo)。 隱性狀態(tài)表示差分電壓小于最小閾值電壓。 主導(dǎo)狀態(tài)指示差分電壓大于此最小閾值。 有趣的是,主導(dǎo)狀態(tài)是通過將邏輯“0”驅(qū)動(dòng)到總線上來實(shí)現(xiàn)的,而隱性狀態(tài)是通過邏輯“1”來實(shí)現(xiàn)的。 這與大多數(shù)系統(tǒng)中使用的傳統(tǒng)高和低相反。 重要的是,在仲裁過程中,主導(dǎo)狀態(tài)優(yōu)先于隱性狀態(tài)。
標(biāo)準(zhǔn)CAN
標(biāo)準(zhǔn)CAN消息幀由許多位字段組成。 這些如圖3所示。
第一位是幀開始 (SOF)。 該主導(dǎo)位代表CAN消息的開始。 接下來是11位標(biāo)識(shí)符,它確定CAN消息的優(yōu)先級(jí)。 標(biāo)識(shí)符越小,消息的優(yōu)先級(jí)越高。
遠(yuǎn)程傳輸請(qǐng)求(RTR)位通常為主導(dǎo)位,但當(dāng)一個(gè)節(jié)點(diǎn)向另一節(jié)點(diǎn)請(qǐng)求數(shù)據(jù)時(shí),該位會(huì)變?yōu)殡[性。 當(dāng)發(fā)送標(biāo)準(zhǔn)CAN幀而非擴(kuò)展幀時(shí),標(biāo)識(shí)符擴(kuò)展(IDE)位占主導(dǎo)地位。 r0 位被保留,當(dāng)前未使用。 數(shù)據(jù)長(zhǎng)度代碼 (DLC) 半字節(jié)表示此消息中有多少個(gè)數(shù)據(jù)字節(jié)。
接下來是數(shù)據(jù)本身,其字節(jié)數(shù)與 DLC 位中表示的字節(jié)數(shù)相同。 循環(huán)冗余校驗(yàn) (CRC) 是一個(gè) 16 位校驗(yàn)和,用于檢測(cè)傳輸數(shù)據(jù)中的錯(cuò)誤。 如果消息被正確接收,接收節(jié)點(diǎn)將用顯性位覆蓋隱性確認(rèn)位 (ACK)。 ACK 還包含一個(gè)分隔符位以保持同步。 幀結(jié)束 (EOF) 表示 CAN 消息的結(jié)束,為 7 位寬,用于檢測(cè)位填充錯(cuò)誤。 CAN 消息的最后一部分是幀間空間 (IFS),用作時(shí)間延遲。 該時(shí)間延遲正是 CAN 控制器將接收到的消息移至緩沖區(qū)以進(jìn)行進(jìn)一步處理所需的時(shí)間量。
擴(kuò)展CAN
擴(kuò)展CAN使用29位標(biāo)識(shí)符以及一些附加位。 擴(kuò)展消息在11位標(biāo)識(shí)符后面有一個(gè)替代遠(yuǎn)程請(qǐng)求 (SRR) 位,它充當(dāng)占位符以保持與標(biāo)準(zhǔn)CAN相同的結(jié)構(gòu)。 這次標(biāo)識(shí)符擴(kuò)展(IDE)應(yīng)該是隱性的,表示后面跟著擴(kuò)展標(biāo)識(shí)符。 RTR 位位于 18 位 ID 之后,后面是第二個(gè)保留位 r1。 消息的其余部分保持不變。
FlexCAN是一種CAN總線的擴(kuò)展,它是一種嵌入式網(wǎng)絡(luò)架構(gòu),由凱特林大學(xué)的胡安·皮門特爾博士設(shè)計(jì)的,它的靈感來自于FlexRay以及通過CAN網(wǎng)絡(luò)提供更具確定性行為的需求。 其重點(diǎn)是硬件級(jí)別的冗余以及協(xié)議級(jí)別基于時(shí)間的優(yōu)先通信。
關(guān)于FlexCAN參見文章FlexCAN: A Flexible Architecture for Highly Dependable Embedded Application
CAN消息類型
CAN允許四種不同的消息類型。 它們是數(shù)據(jù)幀、遠(yuǎn)程幀、過載幀和錯(cuò)誤幀。
標(biāo)準(zhǔn)CAN數(shù)據(jù)幀使用標(biāo)識(shí)符、數(shù)據(jù)和數(shù)據(jù)長(zhǎng)度代碼、循環(huán)冗余校驗(yàn)和確認(rèn)位。 RTR和IDE位在數(shù)據(jù)幀中均占主導(dǎo)地位。 如果接收端的隱性確認(rèn)位被顯性位覆蓋,則發(fā)送器和接收器都認(rèn)為這是成功的傳輸。
CAN遠(yuǎn)程幀看起來與數(shù)據(jù)幀類似,只是它不包含任何數(shù)據(jù)。 發(fā)送時(shí)RTR位處于隱性狀態(tài),這表明它是一個(gè)遠(yuǎn)程幀。 遠(yuǎn)程幀用于從節(jié)點(diǎn)請(qǐng)求數(shù)據(jù)。
當(dāng)節(jié)點(diǎn)檢測(cè)到CAN總線上的消息中存在錯(cuò)誤時(shí),它會(huì)發(fā)送錯(cuò)誤幀。 這會(huì)導(dǎo)致所有其他節(jié)點(diǎn)發(fā)送錯(cuò)誤幀。 此后,發(fā)生錯(cuò)誤的節(jié)點(diǎn)重新傳輸該消息。 過載幀的工作原理類似,但當(dāng)節(jié)點(diǎn)接收幀的速度快于處理幀的速度時(shí)使用。 該幀提供了時(shí)間緩沖區(qū),以便節(jié)點(diǎn)可以趕上。
3. 總線仲裁及信令
CAN 是一種 CSMA/CD 協(xié)議,這意味著總線上的每個(gè)節(jié)點(diǎn)都可以檢測(cè)沖突并在嘗試重新傳輸之前后退一定時(shí)間。 這種沖突檢測(cè)是通過基于消息標(biāo)識(shí)符的優(yōu)先級(jí)仲裁來實(shí)現(xiàn)的。 在討論仲裁之前,讓我們仔細(xì)看看 CAN 總線上使用的顯性位和隱性位。
反相邏輯
CAN 總線的一個(gè)有趣的方面是它使用具有兩種狀態(tài)(顯性狀態(tài)和隱性狀態(tài))的反轉(zhuǎn)邏輯形式。 下面的圖 5 顯示了 CAN 收發(fā)器輸出和輸入的簡(jiǎn)化版本。 “101”比特流來自/去往 CAN 控制器和/或微控制器。 請(qǐng)注意,當(dāng)控制器發(fā)送位流時(shí),這些位流會(huì)被補(bǔ)充并放置在 CANH 線上。 CANL 線始終是 CANH 的補(bǔ)充。 為了使仲裁正常工作,CAN 設(shè)備必須監(jiān)控它正在發(fā)送的內(nèi)容以及當(dāng)前總線上的內(nèi)容,即它正在接收的內(nèi)容。
圖 6 同時(shí)顯示了 CANH 和 CANL 信號(hào),以便您可以看到 CAN 總線的運(yùn)行情況。 總線信號(hào)下方繪制的是與 CAN 信號(hào)的顯性和隱性狀態(tài)相對(duì)應(yīng)的差分電壓。 時(shí)間上的前三個(gè)段 t1–t3 被繪制為與圖 5 中所示的三個(gè)位相匹配。我們將從輸出驅(qū)動(dòng)器的角度來看待這一點(diǎn)。 驅(qū)動(dòng)器的輸入最初看到“1”,并將其補(bǔ)為零,然后將其放置在 CANH 上。 CANL 看到 CANH 的補(bǔ)碼并走高。 這如圖 6 中的 t1 所示。請(qǐng)注意,CANH 和 CANL 電壓彼此偏移。 在時(shí)間 t1 期間,CANH – CANL 非常接近于零,因?yàn)?CANH 和 CANL 的電壓幾乎相同。 驅(qū)動(dòng)器發(fā)送邏輯“1”導(dǎo)致 CANH 和 CANL 接近相同電壓的這段時(shí)期,就是我們所說的 CAN 隱性狀態(tài)。
發(fā)送的下一位是“0”。 CANH 得到其補(bǔ)碼,CANL 再次得到 CANH 的補(bǔ)碼。 請(qǐng)注意,這次 CANH 和 CANL 電壓并不接近。 因此,差分電壓(VDIFF)較大。 這是 CAN 主導(dǎo)狀態(tài)。 我們說邏輯是顛倒的,因?yàn)椤?”使總線處于低電平,而“0”則使總線處于高電平。 輸入接收器以類似的方式工作。
優(yōu)先級(jí)仲裁
正如前面提到的,11 位標(biāo)識(shí)符越小,消息的優(yōu)先級(jí)就越高。 節(jié)點(diǎn)傳輸?shù)拿恳晃欢紩?huì)受到監(jiān)控。 這就是節(jié)點(diǎn)檢測(cè)總線上正在放置更高優(yōu)先級(jí)消息的方式。 當(dāng)節(jié)點(diǎn)發(fā)送隱性位但在總線上檢測(cè)到顯性位時(shí),它就會(huì)后退。 這稱為非破壞性仲裁,因?yàn)閯俪龅南⒗^續(xù)傳輸,沒有任何問題。 請(qǐng)注意,隱性邏輯“1”輸給了顯性邏輯“0”。 這是有道理的,因?yàn)檩^低的標(biāo)識(shí)符值代表較高的優(yōu)先級(jí)。 為了更好地了解這意味著什么,請(qǐng)查看圖 7,其中顯示了 CAN 總線上嘗試控制的三個(gè)節(jié)點(diǎn)。 請(qǐng)務(wù)必記住,每次顯示隱性位時(shí),控制器都會(huì)發(fā)送“1”,而顯性位對(duì)應(yīng)于發(fā)送“0”。
節(jié)點(diǎn) 1-3 都在發(fā)送比特流。 該位流代表消息標(biāo)識(shí)符及其優(yōu)先級(jí)。 首先,所有三個(gè)節(jié)點(diǎn)均發(fā)送“1”,該值在 CAN 總線上表示為隱性位。 接下來,每個(gè)節(jié)點(diǎn)發(fā)送“0”或顯性位。 總線上放置的第三位是另一個(gè)“1”,或隱性位。 此時(shí),沒有一個(gè)節(jié)點(diǎn)檢測(cè)到與總線上的另一個(gè)節(jié)點(diǎn)有任何沖突,因此它們繼續(xù)傳輸。
對(duì)于第四位,節(jié)點(diǎn) 1 發(fā)送“0”或顯性位。 節(jié)點(diǎn) 2 傳輸隱性位,但檢測(cè)總線上的顯性位。 它立即后退,知道當(dāng)前正在發(fā)送更高優(yōu)先級(jí)的消息。 節(jié)點(diǎn) 3 繼續(xù)發(fā)送,因?yàn)樗x回了與發(fā)送的相同的顯性位。 當(dāng)?shù)谖逦槐环胖迷诳偩€上時(shí),節(jié)點(diǎn) 3 就會(huì)識(shí)別出它的優(yōu)先級(jí)較低并停止傳輸。 節(jié)點(diǎn) 2 和節(jié)點(diǎn) 3 都會(huì)等待一定時(shí)間,然后再次嘗試。 如圖 7 的右半部分所示,節(jié)點(diǎn) 3 贏得了仲裁。 正如您所看到的,與較低消息標(biāo)識(shí)符相對(duì)應(yīng)的邏輯“0”顯性位允許進(jìn)行仲裁。
4. CAN總線控制器和收發(fā)器
CAN控制器
CAN控制器用于將欲收發(fā)的消息(報(bào)文),轉(zhuǎn)換為符合CAN規(guī)范的CAN幀,通過CAN收發(fā)器,在CAN-bus上交換信息。 CAN控制器芯片分為兩類:
CAN控制器工作原理圖
CAN收發(fā)器
CAN收發(fā)器是CAN控制器和物理總線之間的接口,將CAN控制器的邏輯電平轉(zhuǎn)換為CAN總線的差分電平,在兩條有差分電壓的總線電纜上傳輸數(shù)據(jù)。
CAN收發(fā)器的類型 汽車車載網(wǎng)絡(luò)CAN收發(fā)器也分為獨(dú)立型與組合型兩大類。由于前者應(yīng)用靈活,可以與多種CAN控制器進(jìn)行連接使用,故應(yīng)用最廣泛。后者通常與CAN控制器組合在一起,形成一個(gè)具有CAN收發(fā)功能的CAN控制器組件。
5. 總結(jié)
CAN是一種強(qiáng)大的串行通信總線,主要用于汽車和工業(yè)環(huán)境。 它使用差分信號(hào),具有更強(qiáng)的抗噪聲能力,并采用優(yōu)先仲裁方案來實(shí)現(xiàn)無損消息傳輸。 CAN非常適合處于危險(xiǎn)環(huán)境或存在大量電磁干擾的區(qū)域的嵌入式應(yīng)用。
評(píng)論