如何進行汽車CAN總線開發?
接上壹篇:
我們先研究數據幀吧。
壹,數據幀由7 個不同位場組成(幀起始、仲裁場、控制場、數據場、CRC場、應答場、幀結尾)。
這裏的位場,就是不同位的組合,這名字起的很爛,讓人看了感覺很抽象。我們來看看這些個不同的位場吧。壹開始是壹位幀起始,也叫SOF。它用顯性位表示,也就是0;它告訴我們,兩個線上有電壓差了,也就是有數據了。
這個幀起始看起來只有壹位,其實不簡單了。為了讓所有的分站都同步於發送報文的發送站,好接收數據,有很多要考慮的地方。
報文的數據幀結構
然後下壹個場是仲裁場。這個仲裁很抽象,其實在這裏就是為了解決壹個問題。如果2個或2個以上的單元同時開始傳送報文,那麽就會有總線訪問沖突,那麽仲裁機制就是用來根據標識符優先級來壹個壹個的去掉低級別的數據。我們可以詳細的描述這場生動的爭搶總線的戰鬥。
當總線處於空閑狀態時呈隱性電平,此時任何節點都可以向總線發送顯性電平作為幀的開始。2個或2個以上的節點同時發送開始爭搶總線,但是總線只能被壹個人搶走。這時候到底怎麽決定誰留下,誰滾蛋呢。我們開始思索,我們以前定義了標識符,標識符有優先級,它越小,它優先級越高。那麽怎麽實現的呢。看下面圖:
首先搞明白兩點,
壹、下圖中,低波形代表0(顯性),高波形代表1(隱性);
二、當隱性碰到顯性,就變為顯性。
如圖所示,節點 A 和節點B 的標識符的第10、9、8位電平相同,因此兩個節點偵聽到的信息和它們發出的信息相同。第7位節點B發出壹個“1”,但從節點上接收到的消息卻是“0”。
為什麽呢,因為A 節點同時發出顯性位,讓總線也變成顯性了,也就是0。節點B 會退出發送處於單純監聽方式而不發送數據;節點A 成功發送仲裁位從而獲得總線的控制權,繼而發送全部消息。
總線中的信號持續跟蹤最後獲得總線控制權發出的報文,本例中節點A的報文將被跟蹤。這種非破壞性位仲裁方法的優點在於,在網絡最終確定哪個節點被傳送前,報文的起始部分已經在網絡中傳輸了,因此具有高優先級的節點的數據傳輸沒有任何延時。
在獲得總線控制權的節點發送數據過程中,其他節點成為報文的接收節點,並且不會在總線再次空閑之前發送報文,在這逐位的比較中,最終節點B 因為第七位的偏差丟掉了總線。從此單純監聽,江山就拱手讓給了節點A 了。這就是仲裁機制
上面我們說過,報文有兩種格式,標準和擴展。這裏,不同的格式仲裁場是不壹樣的。標準格式下,仲裁場由11位識別符和RTR 位組成。
但在擴展格式裏,包括29位識別符、SRR 位、IDE 位、RTR 位。
RTR 位,Remote Tranmission Request BIT 全稱為遠程發送請求位。它在數據幀裏必須為顯性0,但在遠程幀裏為隱性1。
我暈,為什麽這麽搞呢,不急,先留著這個問題。
SRR 位,替代遠程請求位,SRR 是壹隱性位,也就是1,它在擴展格式的標準幀RTR 位位置,那麽標準幀怪不得優先於擴展幀了,因為在傳輸完11位標識符之後(擴展幀的後18位在最後發送,先發送11位標識符),輪到標準幀的RTR 位和擴展幀的SRR 位了。
這時候,標準幀的RTR 為顯性,而擴展幀SRR 為隱性,這樣,總線自然就被標準幀占據。
同時上面那個問題,也壹目了然了,CAN 總線協議設計者,肯定是設計了數據幀優先於遠程幀。所以IDE(Identifier Extension Bit),全稱識別符擴展位,它屬於擴展格式的仲裁場
對於擴展格式,IDE位屬於仲裁場;對於標準格式,IDE位屬於控制場。標準格式的IDE位為“顯性”,而擴展格式的IDE
位為“隱性”。
標準格式中的數據幀
拓展格式中的數據幀
控制場
控制場由6個位組成,標準格式和擴展格式的控制場格式不同。標準格式裏的幀包括數據長度代碼、IDE位(為顯性位)及保留位r0。擴展格式裏的幀包括數據長度代碼和兩個保留位:r1和r0。其保留位必須發送為顯性,但是接收器認可“顯性”和“隱性”位的任何組合。其結構如圖所示:
控制場結構
數據長度代碼(標準格式以及擴展格式)DLC,如下表所示
數據幀長度代碼DLC
數據長度代碼指示了數據場裏的字節數量。其中:d—“顯性”, r—“隱性”,數據幀允許的數據字節數為{0,1,...,7,8}。其他的數值不允許使用。
數據場
數據場由數據幀裏的發送數據組成。它可以為0~8個字節,每字節包含了8個位,首先發送最高有效位(MSB)。
循環冗余碼CRC場
是數據通信領域中最常用的壹種差錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。
CRC場包括CRC序列(CRC Sequence),其後是CRC界定符(CRC Delimiter),結構如圖:
生成 CRC 碼的基本原理:
任意壹個由二進制位串組成的代碼都可以和壹個系數僅為‘0’和‘1’取值的多項式壹壹對應。例如:代碼1010111對應的多項式為x6+x4+x2+x+1,而多項式為x5+x3+x2+x+1對應的代碼101111。
參考壹下下面的例題,自已再領悟壹下吧!已知信息位為1101,生成多項式G(x)= x3+x+1,求CRC 碼。
要傳輸的信息序列為1101,在末尾添加所給多項式的最高次階個0,如本題為x^3,則添加3個0,變為:1101000;
由多項式G(X)=X3+X+1,得其階數為1的二進制編碼為:1011;1101000對1011進行模二除法,所得到的余數即為校驗碼,把校驗碼添加在原數據尾部即為所求的編碼,則實際發送的數據序列為1101001。校驗碼計算過程如圖所示:
模二除法
應答場(ACK Field)
應答場長度為2個位,包含應答間隙(ACK Slot)和應答界定符(ACK Delimiter),如圖所示。在ACK場(應答場)裏,發送節點發送兩個“隱性”位。
當接收器正確地接收到有效的報文,接收器就會在應答間隙(ACK Slot)期間向發送器發送壹“顯性”位以示應答。
幀結尾
每壹個數據幀和遠程幀均由壹標誌序列界定。這個標誌序列由7個“隱性”位組成。