LIN總線作為一種輔助的總線網(wǎng)絡(luò)也是存在同步機制的,但是LIN在作為接收節(jié)點接收數(shù)據(jù)時是有自動修正總線上通訊的波特率偏差的能力的。那這是怎么做到的呢?本文將與大家深入探討。
LIN(Local Interconnect Network)是一種低成本的串行通訊網(wǎng)絡(luò),用于實現(xiàn)汽車中的分布式電子系統(tǒng)控制。LIN的目標(biāo)是為現(xiàn)有汽車網(wǎng)絡(luò)(例如CAN總線)提供輔助功能,因此LIN總線是一種輔助的總線網(wǎng)絡(luò)。在不需要CAN總線的帶寬和多功能的場合,比如智能傳感器和制動裝置之間的通訊使用LIN總線可大大節(jié)省成本。LIN 通訊是基于SCI(UART)數(shù)據(jù)格式,采用單主控制器/多從設(shè)備的模式。僅使用一根12V信號總線和一個無固定時間基準(zhǔn)的節(jié)點同步時鐘線。
LIN幀結(jié)構(gòu)
LIN幀(frame)包含幀頭(Header)和應(yīng)答(Response)兩部分。幀頭包括同步間隔段、同步段以及PID(Protected Identifier,受保護ID)段,應(yīng)答包括數(shù)據(jù)段和校驗和段,如圖1所示,其中值“0”為顯性電平(Dominant),值“1”為隱性電平(Recessive)。
圖1 LIN幀結(jié)構(gòu)
UART的基本時序
再介紹LIN同步機制之前,我們需要介紹一下UART的基本時序,了解一下底層信號是怎么傳送的。
以波特率9600為例,可以理解為將1s分解為9600等份,對于發(fā)送端來說,每bit電平的維持時間是1/9600s,對于接收端來說,在1/9600s內(nèi)要完成數(shù)據(jù)的采樣。因此對于不同時間源的設(shè)備,如何實現(xiàn)這個發(fā)送“節(jié)拍”以及設(shè)置接收采樣頻率非常重要。
圖2 波特率示意圖
UART的基本時序:
發(fā)送端:
圖3 發(fā)送端
接收端:
圖4 接收端
UART的每一幀數(shù)據(jù)一般有10位,分別為初始位、8位數(shù)據(jù)和結(jié)束位。對于發(fā)送端,將待發(fā)送的數(shù)據(jù)存入發(fā)送寄存器,產(chǎn)生起始位,即將電平拉低,隨后每1/9600s將寄存器中的數(shù)據(jù)一位一位的發(fā)送出去。當(dāng)數(shù)據(jù)發(fā)送完畢后,將電平拉高等待下一次的發(fā)送。對于接收端來說首先要檢測是否有數(shù)據(jù)來,它采用下降沿檢測的方式來檢測起始位。對于數(shù)據(jù)位的采樣,選取數(shù)據(jù)位的中點位置的電平作為采樣數(shù)據(jù),因為中點位置的電平較為穩(wěn)定。假設(shè)采樣間隔為N,那么當(dāng)采樣8N后,就可以停止采樣了。
LIN同步機制
LIN總線協(xié)議規(guī)定,LIN網(wǎng)絡(luò)主機節(jié)點必須采用較高精度時鐘,作為LIN網(wǎng)絡(luò)時間基準(zhǔn),保證位速率的準(zhǔn)確性,而從機節(jié)點可以使用較低精度時鐘,所以主從節(jié)點的時鐘就會有頻率偏差,需要進行調(diào)整同步,否則難以保證數(shù)據(jù)的正確收發(fā)。若不進行LIN同步會有多大的影響呢?我們可通過控制器對同步間隔段識別的閾值來量化。
圖5 同步間隔段
同步間隔段由同步間隔(Break)和同步間隔段間隔符(Break Delimiter)構(gòu)成,如圖5所示。同步間隔是至少持續(xù)13位(以主機節(jié)點的位速率為準(zhǔn))的顯性電平,由于幀中的所有間隔或總線空閑時都應(yīng)保持隱性電平,并且?guī)械娜魏纹渌侄味疾粫l(fā)出大于9位的顯性電平(LIN報文以字節(jié)域格式通訊),因此13位的同步間隔可以標(biāo)志一個幀的開始,而能否識別這13位的同步間隔段就顯得尤為重要,這完全依賴于節(jié)點的一個參數(shù)-識別閾值,其計算方法如下:
假設(shè)從機節(jié)點所選擇的時鐘(精度不高的時鐘)精度為±14%時,(13–11.18)/13 = 14%,即是說當(dāng)精度為±14%時,主機節(jié)點發(fā)送13個位數(shù)據(jù),從機節(jié)點最差只能接收到11.18位(此值為上限),因此,只有當(dāng)識別閾值設(shè)置為小于11.18時,才能識別到同步間隔,若識別閾值高于11.18位,就會出現(xiàn)主機發(fā)送同步間隔,而從機檢測不到的情況。由于在除同步間隔段以外,幀中任何其余部分都不會發(fā)送超過9位的顯性電平,(10.26 - 9) / 9 = 14%,即是說主機節(jié)點發(fā)送9個位數(shù)據(jù)時,從機節(jié)點可能最多收到10.26位(此值為下限),因此,為了避免將其他字段識別為同步間隔,判斷閾值必須大于10.26位,綜上,識別閾值可設(shè)為11。
假設(shè)從機節(jié)點選擇的時鐘(精度較高的時鐘)在容限范圍內(nèi)(±1. 5%)時,按照上面的計算方法,識別閾值應(yīng)設(shè)在9.135位(由(9.135 - 9) / 9 = 1.5%計算而來)到12.805 位(由(13–12.805) / 13 =1.5%計算而來)之間。具體設(shè)定閾值會隨著所選時鐘的精度,取值范圍在9.135位到12.805位之間浮動。
LIN同步是以幀為單位,每幀進行一次同步。LIN接收節(jié)點在接收數(shù)據(jù)時,可以自動修正總線上通訊的波特率偏差,因為協(xié)議中帶有一個字節(jié)域的同步段(如圖6所示),采用固定的字節(jié)055(轉(zhuǎn)換為二進制為01010101b),會自動根據(jù)同步段計算主機節(jié)點的波特率來調(diào)整自身的時鐘,達到同步的效果。
圖6 LIN同步段
主機節(jié)點發(fā)送位速率計算公式如下:
通過計算,可以得到主機節(jié)點實際傳輸1位所用的時間,即位速率。
當(dāng)計算出位速率之后,就可以使用這個速率,基于UART采集原理,獲取到LIN的報文數(shù)據(jù)。
總結(jié)
其實LIN的本質(zhì)就是基于串口的通訊,常規(guī)串口需要知道波特率,但是在LIN通訊中,只有主機能夠設(shè)置通訊波特率,從機需要解析報文得到波特率,所以,LIN的同步其實就是解析波特率的過程。
CANDTU系列車載CAN-bus數(shù)據(jù)記錄儀,集成了1-2路符合ISO11898標(biāo)準(zhǔn)的獨立CAN-bus通道,可以長時間記錄CAN2.0A或CAN2.0B格式的CAN報文信息。另外,設(shè)備集成1路LIN總線接口,可支持LIN總線的數(shù)據(jù)收發(fā)測試。