基于CAN總線通信協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)
本文設(shè)計(jì)的信息優(yōu)先級(jí)從高到低依次為:信息功能標(biāo)識(shí)、任務(wù)功能標(biāo)識(shí)和目標(biāo)節(jié)點(diǎn)地址標(biāo)識(shí)。信息功能標(biāo)識(shí)設(shè)在ID的最高幾位,通過(guò)3位的功能代碼可以區(qū)分某些情況的8種基本功能:這些功能可以為節(jié)點(diǎn)狀態(tài)控制、節(jié)點(diǎn)保護(hù)、緊急情況通報(bào)以及有時(shí)間標(biāo)記的信息等;接收任務(wù)標(biāo)識(shí)表明本幀數(shù)據(jù)的任務(wù)屬性,容量為32;目標(biāo)節(jié)點(diǎn)地址指示本次數(shù)據(jù)的目的地址,容量為8。
DATA0.0在本協(xié)議中作為標(biāo)志位,用來(lái)區(qū)別單幀傳輸和多幀傳輸,解決了大于8字節(jié)的字符串的傳輸問(wèn)題。當(dāng)標(biāo)志位為1時(shí),表示傳送的是多幀數(shù)據(jù);為0時(shí)表明是單幀數(shù)據(jù)。這樣克服了CAN 只能傳輸小于等于8字節(jié)數(shù)據(jù)的缺點(diǎn),實(shí)現(xiàn)了大于8字節(jié)的數(shù)據(jù)的傳輸。
為了識(shí)別多幀傳輸中可能會(huì)出現(xiàn)的重幀和丟幀現(xiàn)象,本協(xié)議規(guī)定數(shù)據(jù)場(chǎng)第一字節(jié)作為多幀數(shù)據(jù)傳輸次序的索引。按照本協(xié)議制定的格式傳輸數(shù)據(jù)時(shí),單幀最多傳輸7字節(jié)的實(shí)際數(shù)據(jù):當(dāng)數(shù)據(jù)流長(zhǎng)度大于7字節(jié)時(shí),就要分成多幀傳送。
3 應(yīng)用層協(xié)議設(shè)計(jì)
在CANV2.0規(guī)范標(biāo)準(zhǔn)中,只規(guī)定了ISO參考模型的物理層和數(shù)據(jù)鏈路層,沒(méi)有規(guī)定媒體的連接單元以及駐留媒體,也沒(méi)有規(guī)定應(yīng)用層。物理層負(fù)責(zé)譬如物理信號(hào)傳輸、譯碼、位時(shí)序和位同步等功能,而數(shù)據(jù)鏈路層負(fù)責(zé)總線仲裁、信息分段以及數(shù)據(jù)安全、數(shù)據(jù)確認(rèn)、錯(cuò)誤檢測(cè)、信號(hào)傳輸和錯(cuò)誤控制的功能。實(shí)際上,即使在執(zhí)行一些非常簡(jiǎn)單的基于CAN的分布式系統(tǒng)時(shí)。除了基本的兩層服務(wù)之外,還要求或希望有更多功能,如發(fā)送長(zhǎng)于8字節(jié)的字符串、響應(yīng)或確定數(shù)據(jù)傳送、標(biāo)識(shí)符分配、網(wǎng)絡(luò)啟動(dòng)或監(jiān)控節(jié)點(diǎn)。
由于這些附加的功能直接支持應(yīng)用過(guò)程,所以它可以被認(rèn)作“應(yīng)用層”。如果正確執(zhí)行,則應(yīng)用層以及相應(yīng)的應(yīng)用層接口(子協(xié)議)為通訊和應(yīng)用過(guò)程提供了一個(gè)清晰定義的分界以便把它們區(qū)分開來(lái)。在一些利用簡(jiǎn)單的通信協(xié)議就可以滿足要求的情況下,采用復(fù)雜的協(xié)議會(huì)造成資源的浪費(fèi),而且,使用起來(lái)也很不方便,反而限制了CAN的靈活性。所以在一些情況下制定適合要求的通信協(xié)議,對(duì)CAN的開發(fā)和使用至關(guān)重要。本文根據(jù)實(shí)際系統(tǒng)設(shè)計(jì)的需要,在2.0A技術(shù)規(guī)范的基礎(chǔ)上制定了CAN應(yīng)用層通信協(xié)議。
CAN應(yīng)用層協(xié)議主要負(fù)責(zé)建立CPU與底層之間的橋梁,它主要由四部分組成:節(jié)點(diǎn)的開關(guān)機(jī)制、數(shù)據(jù)的收發(fā)機(jī)制、錯(cuò)誤處理機(jī)制和中斷管理機(jī)制五部分組成。四種機(jī)制互相聯(lián)系、互相制約,共同維護(hù)系統(tǒng)的運(yùn)轉(zhuǎn)。限于篇幅本文主要介紹關(guān)鍵的數(shù)據(jù)收發(fā)機(jī)制。
3.1 數(shù)據(jù)發(fā)送機(jī)制
發(fā)送機(jī)制主要實(shí)現(xiàn)將CPU要發(fā)送的數(shù)據(jù)接過(guò)來(lái),并整理為符合應(yīng)用層協(xié)議規(guī)定的幀格式,將拆卸好的小包(數(shù)據(jù)幀)順序放入循環(huán)隊(duì)列中等待發(fā)送,并負(fù)責(zé)管理和維護(hù)發(fā)送循環(huán)隊(duì)列的止常運(yùn)轉(zhuǎn)。在定時(shí)器定時(shí)中斷中定期對(duì)循環(huán)隊(duì)列進(jìn)行掃描,如果發(fā)現(xiàn)隊(duì)列中有數(shù)據(jù)等待發(fā)送,則調(diào)用發(fā)送函數(shù)將數(shù)據(jù)發(fā)送到CAN總線。
在底層開辟了一個(gè)臨時(shí)緩沖區(qū)用于暫時(shí)存放等待發(fā)送的小包,臨時(shí)緩沖區(qū)采用循環(huán)隊(duì)列的存儲(chǔ)結(jié)構(gòu),對(duì)數(shù)據(jù)實(shí)行先入先出的管理模式。循環(huán)隊(duì)列是一個(gè)42*11的二維數(shù)組,用來(lái)暫時(shí)安置CPU即將發(fā)送的數(shù)據(jù),數(shù)據(jù)被順序安排在循環(huán)隊(duì)列中等待發(fā)送。每增加一幀數(shù)據(jù),循環(huán)隊(duì)列的尾指針加1;每成功發(fā)送完一幀數(shù)據(jù),循環(huán)隊(duì)列的頭指針減1。當(dāng)循環(huán)隊(duì)列中沒(méi)有數(shù)據(jù)時(shí),隊(duì)列的狀態(tài)為空,否則指示為不空;若循環(huán)隊(duì)列的頭指針和尾指針重合而隊(duì)列又處于不空的狀態(tài),此時(shí)隊(duì)列為滿的狀態(tài)。當(dāng)隊(duì)列處于滿的狀態(tài)時(shí),禁止向隊(duì)列再寫入數(shù)據(jù),否則容易導(dǎo)致數(shù)據(jù)的覆蓋或丟失。隊(duì)列中數(shù)據(jù)遵循先入先出的原則,CPU將數(shù)據(jù)從隊(duì)列尾部裝入,向CAN總線發(fā)送數(shù)據(jù)時(shí)則從隊(duì)列頭部將數(shù)據(jù)讀走。發(fā)送循環(huán)隊(duì)列的曾理單位為幀,每次操作都是11個(gè)字節(jié)為單位。在發(fā)送機(jī)制運(yùn)轉(zhuǎn)前,首先對(duì)發(fā)送循環(huán)隊(duì)列初始化,將循環(huán)隊(duì)列的頭指針、尾指針賦值為零,將已占用的空間也賦值為零。
CAN發(fā)送機(jī)制主要由兩大模塊組成:打小包模塊和幀發(fā)送模塊。當(dāng)CPU有數(shù)據(jù)需要發(fā)送時(shí),調(diào)用打小包函數(shù),要求給出待發(fā)送數(shù)據(jù)的存放地址。打小包函數(shù)將會(huì)按照本協(xié)議規(guī)定的格式將發(fā)送節(jié)點(diǎn)地址、接收節(jié)點(diǎn)地址、信息類型、任務(wù)標(biāo)識(shí)、數(shù)據(jù)標(biāo)識(shí)等參數(shù)整理為CAN數(shù)據(jù)鏈路層ID的格式,將數(shù)據(jù)組裝成符合應(yīng)用層協(xié)議所規(guī)定的數(shù)據(jù)幀(小包),實(shí)現(xiàn)對(duì)長(zhǎng)度大于7字節(jié)的數(shù)據(jù)的打小包處理,按照所填加索引號(hào)的順序放到發(fā)送循環(huán)隊(duì)列中等待發(fā)送。打小包函數(shù)的流程圖如圖1所示:
評(píng)論