基于Microchip單片機(jī)及收發(fā)器實(shí)現(xiàn)的低成本LIN總線
4.2 軟件實(shí)現(xiàn)
4.2.1 主節(jié)點(diǎn)
主節(jié)點(diǎn)完全按照LIN規(guī)范實(shí)現(xiàn)。主節(jié)點(diǎn)的任務(wù)就是發(fā)送報(bào)文頭和發(fā)送接收數(shù)據(jù),實(shí)現(xiàn)一個網(wǎng)關(guān)的作用。另外,單片機(jī)的剩余功能,可以用來做一些A/D和開關(guān)量的采集,還可以驅(qū)動一些蜂鳴器、小電機(jī)或者LED和LCD等器件。主節(jié)點(diǎn)發(fā)送流程如圖5所示。
LIN總線的通信可以通過配置單片機(jī)的EUSART來實(shí)現(xiàn)。每次通信都由主節(jié)點(diǎn)啟動,此處不考慮從節(jié)點(diǎn)到從節(jié)點(diǎn)的通信。總線的配置也由主節(jié)點(diǎn)來實(shí)現(xiàn),具體波特率可以通過波特率控制寄存器來實(shí)現(xiàn)。這里采用9 600的波特率。
標(biāo)識符不是一個節(jié)點(diǎn)的地址,而是一個報(bào)文的描述符。當(dāng)主節(jié)點(diǎn)發(fā)送一個0x3C的命令后,再發(fā)送8 B的00H,總線就進(jìn)入休眠模式。在休眠模式下,總線處于空閑狀態(tài),因此任何一個從節(jié)點(diǎn)都可以喚醒總線。
主節(jié)點(diǎn)采用高精度的石英晶振作為時(shí)鐘源,可以產(chǎn)生低誤差的時(shí)鐘信號。在這里,要把主節(jié)點(diǎn)設(shè)置為異步半雙工通信模式,8 bit數(shù)據(jù)模式。時(shí)鐘選擇為內(nèi)部時(shí)鐘。
由于EUSART有“發(fā)送間隔字符位(SENDB)”,可以在每次發(fā)送數(shù)據(jù)前發(fā)送同步間隔字符,這樣可以省掉不少軟件開銷,使單片機(jī)可以致力于其他邏輯的運(yùn)算。
4.2.2 從節(jié)點(diǎn)
從節(jié)點(diǎn)不需要系統(tǒng)配置的信息,所有從節(jié)點(diǎn)接收所有報(bào)文,然后再判斷是否需要執(zhí)行。
從節(jié)點(diǎn)不需要外接石英晶振,可以用單片機(jī)內(nèi)部自帶的RC震蕩器實(shí)現(xiàn)。MICROCHIP的中端8位單片機(jī)大多數(shù)都內(nèi)帶高精度的RC震蕩器,在常溫下(25℃),經(jīng)過校準(zhǔn)可以達(dá)到±1%的精度。
每個單片機(jī)在出廠時(shí)都經(jīng)過校準(zhǔn),并把校準(zhǔn)字寫在Flash空間的最后一位。在程序開始運(yùn)行時(shí),會把校準(zhǔn)值裝載到W寄存器里。在程序的第一條指令中執(zhí)行MOVWF OSCCAL,即可將W寄存器里的值送到內(nèi)部RC震蕩器的校準(zhǔn)寄存器里,從而實(shí)現(xiàn)校準(zhǔn)。
從節(jié)點(diǎn)先檢測總線電平,當(dāng)長時(shí)間的隱性電平結(jié)束,出現(xiàn)大于10個位定時(shí)的顯性電平后,開始數(shù)5個下降沿的時(shí)間,用時(shí)間值除以8,就可以算出波特率。然后從總線上讀取數(shù)據(jù),解碼ID,處理響應(yīng)。
EUSART支持波特率的自動檢測和校準(zhǔn),可以使軟件代碼大量簡化。從節(jié)點(diǎn)可以在總線空閑時(shí)進(jìn)入休眠狀態(tài),當(dāng)從節(jié)點(diǎn)檢測到主節(jié)點(diǎn)發(fā)出的同步間隔時(shí),可以從休眠狀態(tài)喚醒。
當(dāng)從節(jié)點(diǎn)被其他外部中斷喚醒時(shí)(例如A/D轉(zhuǎn)換完成,外部IO電平變化等),從節(jié)點(diǎn)可以喚醒休眠的總線。
如果從節(jié)點(diǎn)的功能比較簡單,工作電流比較小,可以通過收發(fā)器MCP2021的參考電壓輸出端來供電。MCP2021有兩種型號,參考電壓的輸出分別為5 V和3.3 V,適應(yīng)5 V和3.3 V的單片機(jī)。這個參考電壓的輸出電流最大為50 mA,所以不適合工作電流比較大的場合[3-4]。
評論