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