林可春 (福建船政交通職業(yè)學(xué)院汽車運(yùn)用工程系,福建 福州350007)
隨著工業(yè)制造水平的不斷提高以及電子技術(shù)的快速發(fā)展,汽車能夠容納更多的電子設(shè)備,從而提升了汽車的舒適性和安全穩(wěn)定性。但是,汽車中日益增多的電子設(shè)備也帶來了諸如布線難度大、成本增加等問題。為此,筆者對(duì)基于CAN與LIN總線的BCM(Body Control Module,車身控制模塊)通信協(xié)議棧進(jìn)行了設(shè)計(jì)與實(shí)現(xiàn),以便解決上述問題。
CAN(Controller Area Network,控制器局域網(wǎng)絡(luò))是由德國BOSCH公司提出的一種串行通信總線[1]。LIN(Local Interconnect Network,局域互聯(lián)網(wǎng))總線被看作是CAN總線的有效補(bǔ)充[2]?;贑AN與LIN總線的BCM通信協(xié)議??傮w架構(gòu)如圖1所示。根據(jù)Autosar體系[3],為BCM所設(shè)計(jì)的通信協(xié)議??傮w架構(gòu)由驅(qū)動(dòng)層、接口層和服務(wù)層所組成。
圖1 BCM通信協(xié)議??傮w架構(gòu)圖
該模塊用于對(duì)CAN控制器進(jìn)行初始化,并負(fù)責(zé)CAN數(shù)據(jù)幀的收發(fā)。初始化主要是對(duì)控制器的工作模式、寄存器等進(jìn)行配置。在傳輸CAN數(shù)據(jù)幀時(shí),CAN驅(qū)動(dòng)模塊首先對(duì)數(shù)據(jù)格式進(jìn)行轉(zhuǎn)化,接著把轉(zhuǎn)換后的數(shù)據(jù)幀傳輸給目的端。而在接收數(shù)據(jù)幀時(shí),CAN驅(qū)動(dòng)模塊首先把收到的數(shù)據(jù)轉(zhuǎn)換成標(biāo)準(zhǔn)格式,然后把轉(zhuǎn)換后的數(shù)據(jù)放在緩存中,最后向上層發(fā)送新數(shù)據(jù)幀的到達(dá)通知。
該模塊用于對(duì)SCI接口進(jìn)行初始化,并根據(jù)LIN調(diào)度表來進(jìn)行LIN通信,此外還對(duì)數(shù)據(jù)的收發(fā)進(jìn)行監(jiān)管。
CAN接口模塊負(fù)責(zé)CAN接口的初始化、發(fā)送緩存、數(shù)據(jù)發(fā)送與數(shù)據(jù)接收的管理。
1)CAN接口的初始化 只有對(duì)CAN接口進(jìn)行了初始化,上層與下層才能夠通過它來進(jìn)行數(shù)據(jù)的收發(fā),而CAN接口的初始化工作只能在CAN接口處在未初始化或者停止?fàn)顟B(tài)時(shí)才能進(jìn)行。函數(shù)CAN_Init()具體來完成初始化工作。初始化工作包括全局初始化以及CAN控制器的初始化。全局初始化除了要負(fù)責(zé)標(biāo)識(shí)、結(jié)構(gòu)體以及全局變量的初始化,還要對(duì)CAN接口的接收緩存與發(fā)送緩存進(jìn)行初始化。CAN控制器的初始化是指對(duì)CAN控制器進(jìn)行配置,并通過接口函數(shù)來對(duì)驅(qū)動(dòng)層中的CAN驅(qū)動(dòng)子模塊進(jìn)行初始化。在CAN控制器的初始化過程中,CAN驅(qū)動(dòng)子模塊與CAN接口子模塊都處在停止?fàn)顟B(tài),即不能進(jìn)行數(shù)據(jù)的收發(fā)。
2)發(fā)送緩存的管理 CAN接口子模塊的發(fā)送緩存在以下工作模式[4]:①丟棄模式。當(dāng)PDU到達(dá)CAN接口子模塊后,CAN接口子模塊首先查詢CAN驅(qū)動(dòng)子模塊是否空閑,如果不空閑,再查詢其是否有可用的硬件資源,如果沒有,那么該P(yáng)DU將被丟棄。②緩存模式。當(dāng)PDU到達(dá)CAN接口子模塊并且CAN驅(qū)動(dòng)子模塊處于忙碌無空閑資源的情況下,PDU將被緩存在CAN接口子模塊所提供的緩存區(qū)中。為了保證數(shù)據(jù)安全,應(yīng)采用緩存模式。
3)發(fā)送數(shù)據(jù)的管理 當(dāng)服務(wù)層有數(shù)據(jù)要發(fā)送時(shí),其首先利用函數(shù)CANIF_Send()將數(shù)據(jù)PDU發(fā)送給CAN接口子模塊,然后CAN接口子模塊對(duì)該P(yáng)DU進(jìn)行編碼以及格式轉(zhuǎn)換,最后CAN接口子模塊調(diào)用函數(shù)CAN_PDUWrite()把數(shù)據(jù)發(fā)送給CAN驅(qū)動(dòng)子模塊。此外,函數(shù)CAN_PDUWrite()的工作流程如下:其首先判斷CAN驅(qū)動(dòng)子模塊是否空閑,如果該子模塊空閑,其會(huì)把格式轉(zhuǎn)換后的PDU寫入到CAN驅(qū)動(dòng)子模塊的發(fā)送區(qū),并且當(dāng)數(shù)據(jù)被成功發(fā)送后,CAN驅(qū)動(dòng)子模塊利用回調(diào)函數(shù)將發(fā)送結(jié)果通知CAN接口子模塊。否則,函數(shù)CAN_PDUWrite()需要判斷CAN接口子模塊是否有可用的發(fā)送緩存,如果有的話,待發(fā)送的數(shù)據(jù)幀將被存在發(fā)送緩存中,等待CAN驅(qū)動(dòng)子模塊空閑,否則將待發(fā)送的數(shù)據(jù)幀將被丟棄,同時(shí)函數(shù)CAN_PDUWrite()把發(fā)送失敗的信息通知CAN接口子模塊。
4)接收數(shù)據(jù)的管理 當(dāng)CAN驅(qū)動(dòng)子模塊收到數(shù)據(jù)幀后,其會(huì)產(chǎn)生一個(gè)中斷,來通知CAN接口子模塊有新數(shù)據(jù)幀到達(dá),接著CAN接口子模塊開始進(jìn)行數(shù)據(jù)過濾,其目的是驗(yàn)證數(shù)據(jù)幀的有效性。如果數(shù)據(jù)幀沒有通過驗(yàn)證,CAN接口子模塊通知CAN驅(qū)動(dòng)子模塊丟棄該數(shù)據(jù)幀,并通知服務(wù)層本次接收無效。如果數(shù)據(jù)幀通過驗(yàn)證,CAN接口子模塊把CAN驅(qū)動(dòng)子模塊所接收到的數(shù)據(jù)幀拷貝到自己的接收緩存中,并向服務(wù)層發(fā)送新數(shù)據(jù)幀到達(dá)通知,以等待服務(wù)層讀取該數(shù)據(jù)幀。
LIN接口子模塊負(fù)責(zé)數(shù)據(jù)配置、任務(wù)狀態(tài)機(jī)、API以及調(diào)度表的管理,根據(jù)LIN2.0協(xié)議進(jìn)行該子模塊的設(shè)計(jì)。數(shù)據(jù)配置管理主要是對(duì)LIN協(xié)議的版本號(hào)、傳輸?shù)臄?shù)據(jù)值、節(jié)點(diǎn)等進(jìn)行配置。由于在LIN網(wǎng)絡(luò)中,BCM只有一個(gè),其它節(jié)點(diǎn)都為從節(jié)點(diǎn),因而任務(wù)狀態(tài)機(jī)管理需要對(duì)主從節(jié)點(diǎn)進(jìn)行配置以及主從節(jié)點(diǎn)的行為進(jìn)行管理,而API管理需要對(duì)API的初始化、讀寫操作以及信號(hào)更新進(jìn)行管理。由于在LIN網(wǎng)絡(luò)中信息的傳遞是根據(jù)調(diào)度表來進(jìn)行的,因而調(diào)度表管理的內(nèi)容包括對(duì)調(diào)度表的結(jié)構(gòu)、調(diào)度時(shí)間等進(jìn)行配置與管理等。
首先需要對(duì)該模塊的工作狀態(tài)、全局變量等進(jìn)行初始化,同時(shí)還提供報(bào)文的拆分與組裝服務(wù)。這是由于網(wǎng)絡(luò)所能容納的最大報(bào)文長度是一定的,而上層所發(fā)送的報(bào)文長度可能會(huì)大于該最大值,因而在發(fā)送該報(bào)文時(shí)需要對(duì)該報(bào)文進(jìn)行拆分,在接收的時(shí)候,需要把拆分后的多個(gè)報(bào)文組裝成原報(bào)文。
該子模塊能夠?qū)W(wǎng)絡(luò)中節(jié)點(diǎn)的權(quán)限進(jìn)行配置,并且能夠?qū)W(wǎng)絡(luò)運(yùn)行進(jìn)行監(jiān)控。此外,還能夠進(jìn)行網(wǎng)絡(luò)狀態(tài)切換服務(wù),如等待休眠、等待喚醒等。
此外,COM能夠提供初始化、可靠性與信息交互服務(wù)。初始化服務(wù)包括通信端口、PDU、信號(hào)等的配置。而可靠性服務(wù)用于對(duì)PDU進(jìn)行監(jiān)控以及提供錯(cuò)誤報(bào)告。信息交互服務(wù)提供信息(組)接收與發(fā)送功能。PDU Router相當(dāng)于一個(gè)網(wǎng)關(guān),其會(huì)把接收到數(shù)據(jù)包轉(zhuǎn)發(fā)給相應(yīng)的上層模塊,同時(shí)把要發(fā)送的數(shù)據(jù)包發(fā)送到相應(yīng)的CAN接口子模塊。
為了對(duì)通信協(xié)議棧的性能進(jìn)行測試,在PC端利用CodeWarrior Development Studio進(jìn)行代碼編寫、調(diào)試并生成目標(biāo)代碼,然后將目標(biāo)代碼寫入BCM開發(fā)板以實(shí)現(xiàn)對(duì)車身臺(tái)架上設(shè)備的控制,同時(shí)通過串口把PC機(jī)與BCM開發(fā)板連接在一起。車身臺(tái)架包含了整個(gè)CAN/LIN網(wǎng)絡(luò)以及多個(gè)ECU(Electronic Control Unit,電控單元),其中,ECU負(fù)責(zé)控制車內(nèi)電子設(shè)備,比如車窗的升降、車燈的控制等,同時(shí)ECU通過PC卡(CANCaseXL)與仿真網(wǎng)絡(luò)節(jié)點(diǎn)進(jìn)行連接,并利用CANNoe對(duì)整個(gè)網(wǎng)絡(luò)進(jìn)行檢測(見圖2)。
圖2 BCM通信協(xié)議棧性能測試場景圖
表1所示為通信協(xié)議棧性能測試結(jié)果。從表1可以看出,設(shè)計(jì)的通信協(xié)議棧能夠正常工作,其不僅能夠很好地承載車內(nèi)電子設(shè)備之間的通信,而且能夠?qū)⑵淇刂菩畔⒓皶r(shí)地傳遞給車內(nèi)電子設(shè)備,因而達(dá)到了設(shè)計(jì)要求。
表1 BCM通信協(xié)議棧性能測試結(jié)果表
針對(duì)汽車中日益增多的電子設(shè)備帶來的諸如布線難度大、成本增加的問題,設(shè)計(jì)了基于CAN與LIN總線的BCM通信協(xié)議棧。通過性能測試,表明該通信協(xié)議棧既能很好地承載車內(nèi)電子設(shè)備之間的通信,也能夠及時(shí)地把BCM中的各種控制信息傳遞給車內(nèi)電子設(shè)備,在降低了生產(chǎn)成本的同時(shí)又提高了汽車的安全穩(wěn)定性,因而具有可行性。
[1] Farsi M,Ratcliff K,Barbosa M.An overview of controller area network [J] .Computing & Control Engineering Journal,1999,10(3):113-120.
[2] 謝芳,季愛明,俞一彪 .基于CAN總線的客車車身控制系統(tǒng)可配置模塊設(shè)計(jì) [J].客車技術(shù)與研究,2011,32(5):10-12.
[3] 蔣建春,萬瑩,易綱,等 .基于AUTOSAR架構(gòu)的通信系統(tǒng)的研究與實(shí)現(xiàn) [J].計(jì)算機(jī)測量與控制,2011,18(7):55-58.
[4] 何宏,鄭義,李建文,等 .基于LIN總線的汽車車窗控制系統(tǒng)的設(shè)計(jì) [J].天津理工大學(xué)學(xué)報(bào),2013,29(6):17-20.