CAN匯流排的編碼方式

2022-10-04 22:39:05 字數 2945 閱讀 6082

對can匯流排的常見編碼格式解析

我們在進行can匯流排的通訊設計過程中,對於通訊矩陣的建立,我們常常會選擇一種編碼方式,最常見的編碼格式是intel格式和motorola格式。但是往往人們都是以一種習慣去選擇,究竟兩種格式具體的區別在**呢?我們需要明白兩種格式對訊號是如何排布的,又是按照什麼順序進行正確解析的。

本篇文章就是作者根據在整理通訊矩陣和dbc檔案中遇到的一些問題,提出的自己的一些體會和見解,希望大家通過此篇文章對兩種格式有更加深刻的理解。

我們在設計初期,都會首先選擇一種編碼格式,這種選擇大多都是根據設計者自己的習慣,具體intel格式和motorola格式哪個更有優勢的問題,在這裡沒有區別。但是就使用者而言,需要對接收到資料幀進行正確的解析,否則就無法得到想要的訊號。下面我們就來說一下兩種格式的區別。

首先我們需要明確一點,無論是intel格式還是motorola格式,在每個位元組中,資料傳輸順序都是從高位(msb)傳向低位(lsb)。如下圖所示。

圖1一般主機廠設計人員在設計初期都會定義好位元組的傳送順序,定義byte0為lsb,byte7為msb。第一種情況:先傳送byte0,然後byte1到byte7;第二種情況:

先傳送byte7,然後byte6到byte0。根據我了解到的大部分主機廠都會採取第一種傳送方法,很少會採取後者。我們在用canoe中的candb++編輯資料庫時,肯定會用到如下圖所示的編輯介面。

圖2結合工作中的出現的問題,有的網路設計者會在排布訊號的時候出現誤區。上圖中用的是比較常規的排布方式,即位在位元組中的索引是從右至左,還有一種是顛倒過來的,即從左至右。如下圖所示。

圖3我們現在以第一種矩陣模式進行說明。在這種情況下,如果主機廠在初期定義先傳送lsb,再傳送的msb的形式,那麼資料訊號可以按照從上到下,從左到右的順序傳送,非常方便,接收器解析起來也比較容易。如果主機廠定義先傳送msb再傳送lsb的形式,那樣資料傳輸比較複雜,所以一般都不建議用這種方案。

至於設計者常出現的錯誤我們在下文中會重點說明,下面我們先了解一下intel格式和motorola格式在candb++中的區別。

一、motorola編碼格式:

如果我們選擇使用motorola編碼格式,那需要知道它在candb++中的3種訊號排布方式。這三種排布的主要區別在於它們的起始位不同。我們假設乙個訊號的位長為12,那麼它就要跨位元組排布。

在motorola格式中的第一種排布形式為motorola forward lsb,即從小端開始,它的起始位為lsb(16);第二種排布形式為motorola forward msb,即從大端開始,它的起始位為msb(11);第三種排布形式為motorola backward,它的起始位為第8位,這種形式基本不採用,因為排布規律相對於前兩種比較複雜。如下圖所示;

圖4針對上述motorola格式第一種排布形式,訊號的起始位為高位元組的低位。在candb++中的具體體現如圖所示。

圖5在candb++中,無法區別這三種排布形式,它的起始位也是自動定義的,所以我們在設計通訊矩陣時,一般都會採用第一種,即motorola forward lsb。只是有的工程師根據自己的個人習慣,去改變起始位,但我們需要明確一點就是,在canoe軟體中,一種格式的訊號排布是沒有區別的。

二、intel編碼格式

如果我們選擇使用intel編碼格式,它在candb++中也有兩種訊號排布方式。我們假設乙個訊號位長為12,它也是要跨位元組排布。

第一種排布形式為intel standard,即標準形式,它的起始位為lsb(12)。訊號的起始位為低位元組的低位。如下圖所示:

圖6圖7

第二種排布形式為intel sequential,即順序排布形式或者叫顛倒排布。這種形式不太常用,但我們也需要了解,它的起始位為lsb(11)。如下圖所示:

圖8 以上文字介紹了當訊號的位長超過乙個位元組的情況下,訊號分別以motorola編碼格式和intel編碼格式排布時的區別。我們現在假設乙個訊號的位長為4,觀察在candb++中訊號的排布有什麼區別。

motorola編碼格式下的訊號排布:(綠色訊號)

圖9intel編碼格式下的訊號排布:(綠色訊號)

圖10由圖可知,兩種格式的起始位不同,但是他們的排布方式相同,都是訊號的高位放在該位元組的高位(msb),訊號的低位放在該位元組的低位(lsb)。所以,當乙個訊號的位長小於8時,那麼兩種編碼格式沒有區別。如果訊號的位長大於8,那麼兩種編碼格式將會產生很大差別。

這是我們在網路通訊設計初期必須要掌握的。

下面我們說一下一些工程師在做通訊矩陣的設計時,常會出現的幾個問題:

1. 在編寫通訊矩陣時,在起始位的編寫中,常會將intel格式和motorola格式弄混。例如:如下圖所示的通訊矩陣

如果乙個訊號的位長為4,那麼若是motorola編碼格式,那它的起始位就是4;而若是intel編碼格式,那它的起始位就是0。

2. 在candb++中進行通訊矩陣的調整時,首先應明確訊號選取的編碼格式,然後進行拖曳,有的工程師常常在沒有區分編碼格式,憑藉主觀感覺對通訊矩陣進行調整,這往往會導致訊號的傳輸錯誤。

3. 在訊號跨位元組排布中,未明確msb和lsb,在拖曳過程中會出現錯誤。

綜上所述,,前者的規則:該訊號的高位(s_msb)將被放在低位元組(msb)的高位,訊號的低位(s_lsb)將被放在高位元組(lsb)的低位;後者的規則:該訊號的高位(s_msb)將被放在高位元組(msb)的高位,訊號的低位(s_lsb)將被放在低位元組(lsb)的低位。

希望大家能從此篇文章中收穫一些經驗。

文中術語解釋及定義:

1. 訊號的高位,即最能表達訊號特性的因子,比如:車速訊號500km/h按照給定的公式,轉換成十六進製制數為0x6a5,因為6代表的數量級最大(162),那麼其中6就是其訊號的高位。

2. 訊號的低位,即最不能表達訊號特性的因子,比如:車速訊號500km/h按照給定的公式,轉換成十六進製制數為0x6a5,因為5代表的數量級最小(160),那麼其中5就是其訊號的低位。

3. 訊號的起始位,一般來講,主機廠在定義整車can匯流排通訊矩陣時,其每乙個訊號都從其最低位開始填寫,這樣也符合使用習慣。所以訊號的起始位就是訊號的最低位。

這也與canoe中candb++的定義startbit含義一致。

CAN匯流排與485匯流排區別

現場匯流排是當今自動化領域技術發展的熱點之一,被譽為自動化領域的計算機區域網。它的出現為分布式控制系統實現各節點之間實時 可靠的資料通訊提供了強有力的技術支援。can controller area network 屬於現場匯流排的範疇,它是一種有效支援分布式控制或實時控制的序列通訊網路。較之目前許...

CAN匯流排防護方案說明

specialist of overvoltage protectorsocay 1 can 匯流排防護方案 碩凱電子 sylvia 說明 can 是控制器區域網路 controller area network,can 的簡稱。一 防護電路圖 二 應用背景 1 雷雨天氣增多 2 can匯流排傳輸距...

汽車匯流排 CAN線介紹

一 早期的汽車控制 汽車自誕生以來,如何更好的控制汽車,經歷了幾個發展階段。較早的汽車控制多數是通過機械與液壓元件的結合來實現的,由於電子技術的發展,汽車控制多數採用機電結合,大大提高了整車的安全性與可靠度,汽車的控制也就變成了由電子 機械與液壓元件的組合來實現。汽車是個複雜的系統,有多種資料需要監...