用于汽車(chē)網(wǎng)絡(luò )的LIN協(xié)議分析
LIN協(xié)議適用于汽車(chē)內進(jìn)行低成本、短距離、低速網(wǎng)絡(luò )通信,其用途是傳輸開(kāi)關(guān)設置狀態(tài)以及對開(kāi)關(guān)變化響應。本文詳細分析了LIN總線(xiàn)協(xié)議的特性、消息協(xié)議的組成、檢錯機制等,并介紹如何基于PICmicro器件來(lái)實(shí)現LIN總線(xiàn)從節點(diǎn)。
本文引用地址:http://dyxdggzs.com/article/155598.htmLIN協(xié)議是由歐洲車(chē)輛制造商協(xié)會(huì )開(kāi)發(fā)用來(lái)進(jìn)行低成本、短距離、低速網(wǎng)絡(luò )通信,其用途是傳輸開(kāi)關(guān)設置狀態(tài)以及對開(kāi)關(guān)變化響應,因此通信事件是在百毫秒以上時(shí)間內發(fā)生,而不像引擎管理等其它速度快得多的汽車(chē)應用。此協(xié)議支持在單根線(xiàn)上進(jìn)行雙向通信,使用由RC振蕩器驅動(dòng)的低成本微控制器,這樣可以省去晶振或陶瓷振蕩器的成本。另外,此協(xié)議實(shí)際上是以時(shí)間和軟件上的代價(jià)換取硬件上成本的節約。LIN協(xié)議的每一條消息都包含自動(dòng)波特率步進(jìn)的數據,最高可以支持波特率為20k,同時(shí)低功耗睡眠模式可以關(guān)斷總線(xiàn),以避免產(chǎn)生不必要的功耗??偩€(xiàn)可以由任意一個(gè)節點(diǎn)提供電源。
LIN總線(xiàn)特性
LIN總線(xiàn)融合了I2C和RS232的特性:像I2C總線(xiàn)那樣,LIN總線(xiàn)通過(guò)一個(gè)電阻上拉到高電平,而每一個(gè)節點(diǎn)又都可以通過(guò)集電極開(kāi)路驅動(dòng)器將總線(xiàn)拉低;像RS232那樣通過(guò)起始位和停止位標識出每一個(gè)字節,每一位在時(shí)鐘上異步傳輸。
圖1給出了典型的LIN協(xié)議配置。當任意一個(gè)節點(diǎn)將總線(xiàn)拉低時(shí),總線(xiàn)處于低電平,標識著(zhù)總線(xiàn)進(jìn)入占用狀態(tài);而當所有節點(diǎn)都使總線(xiàn)浮空時(shí)總線(xiàn)處于電池的電壓(9-18V),則意味著(zhù)總線(xiàn)處于非占用狀態(tài)(Recessive state);在空閑狀態(tài)下浮空的總線(xiàn)通過(guò)電阻被上拉到高電平。
總線(xiàn)工作在9到18伏的電壓下,但所有連接到總線(xiàn)上的器件必須能承受40V的電壓。一般情況下,微控制器通過(guò)線(xiàn)路驅動(dòng)器或接收器與總線(xiàn)隔離??偩€(xiàn)在每一個(gè)節點(diǎn)上被端接到Vbat,主節點(diǎn)通過(guò)一個(gè)1kΩ的電阻端接而從節點(diǎn)則通過(guò)一個(gè)20kΩ到47kΩ的電阻端接??偩€(xiàn)最大長(cháng)度為40米。
總線(xiàn)上傳輸的每一個(gè)字節都是與起始位和停止位一起組成幀。起始位的狀態(tài)與空閑狀態(tài)相反(即為0),而停止位則與空閑狀態(tài)同為1。在每個(gè)字節中,首先傳輸的是最低有效位。
消息協(xié)議
主節點(diǎn)控制總線(xiàn)的方式是輪詢(xún)各個(gè)從節點(diǎn)并與總線(xiàn)上其余部分共享從節點(diǎn)的數據。從節點(diǎn)僅在接到主節點(diǎn)的命令時(shí)才進(jìn)行數據傳輸,這樣就可以進(jìn)行雙向傳輸并且無(wú)需進(jìn)一步的仲裁。消息傳輸是以主節點(diǎn)發(fā)出一次同步中斷開(kāi)始,緊接著(zhù)是消息的同步字段和消息字段。通過(guò)在每條消息的起始處傳送的同步字段還設定了整個(gè)總線(xiàn)的時(shí)鐘,每個(gè)從節點(diǎn)用該字節來(lái)調整其波特率。
同步中斷使總線(xiàn)進(jìn)入占用狀態(tài),該狀態(tài)保持時(shí)間為13位數據的傳輸時(shí)間,緊接著(zhù)是一個(gè)停止位(非占用狀態(tài)),這告知從節點(diǎn)即將有消息傳輸。主節點(diǎn)與從節點(diǎn)的時(shí)鐘漂移最大允許在15%,因此從節點(diǎn)接收的同步中斷可能只有11位或長(cháng)達15位數據位的傳輸時(shí)間。
每一條消息的第二個(gè)字節是標示字節,用來(lái)告知總線(xiàn)在該字節后面傳輸的是什么數據和哪一個(gè)節點(diǎn)應該應答,以及應答的長(cháng)度(標示字段如圖2所示)。一條命令僅會(huì )有一個(gè)從節點(diǎn)對其進(jìn)行響應,從節點(diǎn)僅在主節點(diǎn)的指示下才發(fā)送數據。數據只要出現在總線(xiàn)上,每一個(gè)節點(diǎn)都可以接收到。因此,無(wú)須主節點(diǎn)專(zhuān)門(mén)控制從節點(diǎn)之間的通信。
由于設計中采用廉價(jià)的RC振蕩器,從節點(diǎn)必須在每一次傳輸時(shí)檢測主節點(diǎn)的波特率并調整其自身當前的波特率。因此,每一次通信都由一個(gè)由交替的“0”和“1”組成的同步字節開(kāi)始。標識字段緊跟在同步字段的后面,它告知總線(xiàn)后面傳輸的內容是什么。標識字段又分為三個(gè)子字段,最低4位(0-3位)是尋址總線(xiàn)上的器件,中間兩位(4-5位)是后面傳輸的消息的長(cháng)度,最高兩位(6-7)用作奇偶校驗位。
除了睡眠命令,LIN協(xié)議并沒(méi)有定義每一條消息的內容。其它命令是由具體應用來(lái)定義的。
檢錯機制
下面描述的錯誤必須被檢測出,并且在每個(gè)節點(diǎn)內進(jìn)行計數。
位錯誤-傳輸節點(diǎn)必須將它認為應該傳輸的數據位與總線(xiàn)上實(shí)際出現的數據位進(jìn)行比較。由于總線(xiàn)需要響應時(shí)間,控制器必須在檢測數據位之前等待足夠長(cháng)的時(shí)間。假設最小的電壓翻轉速率為1V/μs,而總線(xiàn)最高電壓為18V,則發(fā)送器必須等待18μs才能檢測總線(xiàn)上的數據位是否正確。
校驗和錯誤-每一條消息的內容都是由校驗和字節進(jìn)行保護。
奇偶校驗錯-命令字節的6個(gè)數據位由兩個(gè)奇偶校驗位進(jìn)行保護,需要重新進(jìn)行計算這些位并比較。如果錯誤出現,應當忽略當前命令并且記錄下錯誤。LIN協(xié)議中沒(méi)有直接的錯誤報告機制,但每一個(gè)從節點(diǎn)應當跟蹤其自身的錯誤,主節點(diǎn)可以要求從節點(diǎn)將錯誤狀態(tài)作為正常消息協(xié)議的一部分來(lái)傳輸。
LIN總線(xiàn)與CAN總線(xiàn)
LIN協(xié)議并不直接與CAN總線(xiàn)兼容,但人們期望兩者進(jìn)行相互操作。CAN總線(xiàn)可能用在整個(gè)汽車(chē)內來(lái)實(shí)現通信,而LIN總線(xiàn)僅用在汽車(chē)的局部電路內,如車(chē)門(mén)。為了連接兩種總線(xiàn),需要采用CAN-LIN協(xié)議接口節點(diǎn),該節點(diǎn)從LIN總線(xiàn)節點(diǎn)收集信息然后傳送到CAN總線(xiàn)上。
低功耗睡眠模式
主節點(diǎn)通過(guò)發(fā)送標識碼0x80指示所有節點(diǎn)進(jìn)入睡眠模式,睡眠命令后面跟隨的數據字節的內容沒(méi)有定義。收到睡眠命令的從節點(diǎn)應當對本身進(jìn)行設置,以便當總線(xiàn)發(fā)生改變時(shí)能喚醒,并關(guān)閉自身的電壓以使電流消耗最低。當處于睡眠模式時(shí)總線(xiàn)將處于高電平并且不消耗電流。
任意一個(gè)節點(diǎn)都可以通過(guò)發(fā)送喚醒信號來(lái)喚醒總線(xiàn)。當收到喚醒信號后,一般情況下所有的節點(diǎn)應當激活并等待主節點(diǎn)開(kāi)始總線(xiàn)輪詢(xún)。
硬件示例
圖3給出了有兩個(gè)按鈕和三個(gè)LED組成的硬件示例。每按動(dòng)十下按鈕1 LED1改變一次狀態(tài)。同樣,每按動(dòng)十下按鈕2,LED2改變一次狀態(tài)。作為標識為ID1的響應,按鈕的按動(dòng)次數被傳送到總線(xiàn)上。作為標識為ID4的響應,按鈕的按動(dòng)次數的刷新被傳送到總線(xiàn)上。
軟件操作
LIN協(xié)議程序工作在由RB0觸發(fā)的中斷下以實(shí)現總線(xiàn)的睡眠/喚醒。在觸發(fā)中斷時(shí),程序對低電平數據位的長(cháng)度進(jìn)行計數,然后讀同步字節并確定數據位時(shí)間,最后再將其與最初的數據位時(shí)間進(jìn)行比較,以確定最初的低電平時(shí)間是否大于10個(gè)數據位的時(shí)間,大于10為同步中斷,小于10為喚醒信號。如果是喚醒信號,程序退出并繼續等待同步中斷;如果是同步中斷,程序就讀取命令字節,檢查奇偶位并檢查動(dòng)作表(action table)來(lái)確定接下來(lái)的動(dòng)作。動(dòng)作表定義了總線(xiàn)上數據的來(lái)源或目的地。
為了初始化LIN協(xié)議的從節點(diǎn)句柄(Slavehandler),用戶(hù)必須調用InitLinSlave程序,這個(gè)程序初始化RB0中斷引腳和TMR0寄存器。TMR0寄存器用來(lái)測量數據位的長(cháng)度并生成波特率。初始化完成之后,用戶(hù)可以執行自己的程序。一旦檢測到RB0引腳上的下降沿,用戶(hù)程序就將被中斷。當檢測到下降沿時(shí),程序就跳轉到中斷服務(wù)程序。必須禁止除了TMR0和RB0中斷之外所有的中斷源,以便對同步字段進(jìn)行精確測量。計算出波特率之后,中斷服務(wù)程序就退出執行。
在下一次RB0中斷發(fā)生時(shí),LIN協(xié)議Slavehandler自動(dòng)進(jìn)入接收模式,以接收標識字段或數據字節。如果檢測到標識字段的起始位,就對標識字段進(jìn)行接收和解碼。然后,根據收到的標識執行相應的代碼,例如存儲數據或點(diǎn)亮LED??偩€(xiàn)上一個(gè)幀傳輸完成之后,標志FCOMPLETE被置位。這個(gè)標志指示所有的數據都已正確接收完畢并可以進(jìn)行后續的處理。此標志由用戶(hù)固件清除。
LIN協(xié)議從節點(diǎn)句柄Slavehandler最高可以工作在20K的波特率下,需要420字的程序存儲空間以及23字節的數據存儲空間。
由于其低成本,LIN協(xié)議具有在汽車(chē)應用中廣泛采用的潛力??梢允褂脙戎玫腞C振蕩器并且運行在4MHz的時(shí)鐘頻率下的諸如Microchip的各種器件的微處理器,使得設計師們能以最低的可能成本設計應用系統。
評論