本發(fā)明屬于汽車(chē)電子技術(shù)領(lǐng)域,更具體的說(shuō)是一種汽車(chē)CAN總線網(wǎng)關(guān)的報(bào)文收發(fā)方法及系統(tǒng)。
背景技術(shù):
隨著汽車(chē)電子部件的增多和智能化程度的提高,CAN總線系統(tǒng)已經(jīng)成為汽車(chē)的重要組成部分。根據(jù)功能劃分、拓?fù)浣Y(jié)構(gòu)設(shè)計(jì)和實(shí)時(shí)性的不同要求,汽車(chē)一般會(huì)設(shè)計(jì)多個(gè)CAN網(wǎng)絡(luò)。CAN網(wǎng)絡(luò)之間的信息交互由網(wǎng)關(guān)實(shí)現(xiàn),網(wǎng)關(guān)包括多個(gè)CAN接口,接入不同的CAN網(wǎng)絡(luò),實(shí)現(xiàn)報(bào)文的接收和轉(zhuǎn)發(fā)。在所有的CAN網(wǎng)絡(luò)節(jié)點(diǎn)中,從報(bào)文接收和發(fā)送的角度看,網(wǎng)關(guān)的負(fù)荷是最高的。
CAN網(wǎng)絡(luò)采用非破壞性仲裁方式競(jìng)爭(zhēng)總線,任一節(jié)點(diǎn)可以在任意時(shí)刻向總線發(fā)送數(shù)據(jù),連接多個(gè)CAN網(wǎng)絡(luò)的網(wǎng)關(guān)可能會(huì)在較短的時(shí)間內(nèi)接收到大量報(bào)文,并需要在短時(shí)間內(nèi)轉(zhuǎn)發(fā)大量需要路由的報(bào)文。進(jìn)行周期報(bào)文的轉(zhuǎn)發(fā)時(shí),根據(jù)不同汽車(chē)廠家的要求,報(bào)文周期一般需要保證在規(guī)定值的±10%以?xún)?nèi),這對(duì)網(wǎng)關(guān)的實(shí)時(shí)性、準(zhǔn)確性都提出了較高的要求。
出于成本節(jié)約和集成化的要求,汽車(chē)電子零部件都采用MCU內(nèi)部的CAN控制器結(jié)合物理層芯片實(shí)現(xiàn)CAN總線通信。低成本MCU的內(nèi)部CAN控制器的硬件接收緩沖區(qū)和硬件發(fā)送緩沖區(qū)很小,當(dāng)CAN網(wǎng)絡(luò)上短時(shí)間內(nèi)出現(xiàn)大量報(bào)文時(shí),如果未能及時(shí)讀取硬件接收緩沖區(qū)中的數(shù)據(jù)并清零標(biāo)志位,便無(wú)法接收新的報(bào)文。當(dāng)CAN網(wǎng)關(guān)短時(shí)間內(nèi)需要轉(zhuǎn)發(fā)大量報(bào)文時(shí),如果硬件發(fā)送緩沖區(qū)已滿,但仍存在需要發(fā)送的報(bào)文時(shí),如果未能及時(shí)轉(zhuǎn)發(fā)報(bào)文,可能會(huì)造成漏發(fā)報(bào)文或者周期不準(zhǔn)確的錯(cuò)誤。如果選用CAN控制器硬件接收緩沖區(qū)和硬件發(fā)送緩沖區(qū)都比較大的MCU,會(huì)增加成本,影響經(jīng)濟(jì)效益和社會(huì)效益。
中國(guó)發(fā)明專(zhuān)利:一種控制器局域網(wǎng)絡(luò)CAN總線報(bào)文的發(fā)送方法及裝置(申請(qǐng)?zhí)枺?01610064343.3),介紹了一種配置各個(gè)CAN節(jié)點(diǎn)的報(bào)文發(fā)送時(shí)段的方法,避免了因多個(gè)節(jié)點(diǎn)同時(shí)發(fā)送報(bào)文導(dǎo)致總線競(jìng)爭(zhēng)以及報(bào)文過(guò)于密集的現(xiàn)象。這種方法能夠改善總線報(bào)文在時(shí)間軸上的分布,降低對(duì)CAN控制器硬件緩沖區(qū)的要求,但是這種方法需要分析總線波特率、網(wǎng)絡(luò)內(nèi)所有報(bào)文的優(yōu)先級(jí)和周期,不僅需要每個(gè)CAN節(jié)點(diǎn)都實(shí)現(xiàn)這種方法,而且靈活性很差,一旦由于網(wǎng)絡(luò)拓?fù)涞母淖冊(cè)黾踊驕p少了某個(gè)節(jié)點(diǎn),便會(huì)影響整個(gè)設(shè)計(jì)。
中國(guó)發(fā)明專(zhuān)利:CAN總線網(wǎng)關(guān)控制器及CAN總線之間數(shù)據(jù)傳輸方法(申請(qǐng)?zhí)枺?00710075363.1),采用周期性掃描數(shù)據(jù)緩沖區(qū)的方法判斷是否有需要發(fā)送的數(shù)據(jù)包,在很多情況下,不存在需要發(fā)送的數(shù)據(jù)包,這時(shí)仍然進(jìn)行周期性掃描,會(huì)白白浪費(fèi)嵌入式系統(tǒng)寶貴的計(jì)算資源。另外,如果設(shè)置的掃描周期時(shí)間較長(zhǎng),會(huì)造成需要轉(zhuǎn)發(fā)的短周期報(bào)文不滿足周期準(zhǔn)確性要求,如果設(shè)置的掃描周期時(shí)間較短,會(huì)加大系統(tǒng)負(fù)荷。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的就是為了解決上述問(wèn)題,提供一種汽車(chē)CAN總線網(wǎng)關(guān)的報(bào)文收發(fā)方法及系統(tǒng),以軟件緩沖區(qū)配合CAN控制器的硬件緩沖區(qū),設(shè)計(jì)軟件緩沖區(qū)管理模塊,通過(guò)與硬件緩沖區(qū)的聯(lián)動(dòng),能夠?qū)崟r(shí)地接收?qǐng)?bào)文,保證報(bào)文不丟失,同時(shí)在CAN控制器硬件發(fā)送緩沖區(qū)未滿時(shí)及時(shí)將報(bào)文發(fā)送到總線上,不漏發(fā)報(bào)文,也不影響周期報(bào)文的周期準(zhǔn)確性。
為了實(shí)現(xiàn)上述目的,本發(fā)明采用如下技術(shù)方案:
一種汽車(chē)CAN總線網(wǎng)關(guān)的報(bào)文收發(fā)方法,包括:
步驟(1):針對(duì)CAN報(bào)文的接收和發(fā)送分別定義軟件接收緩沖區(qū)和軟件發(fā)送緩沖區(qū),
所述軟件接收緩沖區(qū)由報(bào)文接收中斷服務(wù)程序和軟件接收緩沖區(qū)管理子模塊管理;
所述軟件發(fā)送緩沖區(qū)由報(bào)文發(fā)送函數(shù)、報(bào)文發(fā)送中斷服務(wù)程序和軟件發(fā)送緩沖區(qū)管理子模塊管理;
軟件發(fā)送緩沖區(qū)管理子模塊和軟件接收緩沖區(qū)管理子模塊組成軟件緩沖區(qū)管理模塊;
步驟(2):在軟件緩沖區(qū)管理模塊中,若接收到信號(hào),首先判斷信號(hào)是否是接收到新報(bào)文,若是則進(jìn)入軟件接收緩沖區(qū)管理子模塊;如果否,則進(jìn)入步驟(3);
步驟(3):進(jìn)一步判斷接收到的信號(hào)是否是硬件發(fā)送緩沖區(qū)未滿,若是就進(jìn)入軟件發(fā)送緩沖區(qū)管理子模塊;若否就結(jié)束。
所述軟件接收緩沖區(qū)和軟件發(fā)送緩沖區(qū)均為結(jié)構(gòu)體數(shù)組,結(jié)構(gòu)體數(shù)組包括報(bào)文ID、報(bào)文長(zhǎng)度和報(bào)文數(shù)據(jù)。
軟件接收緩沖區(qū)對(duì)應(yīng)的結(jié)構(gòu)體數(shù)組為接收數(shù)組;軟件發(fā)送緩沖區(qū)對(duì)應(yīng)的結(jié)構(gòu)體數(shù)組為發(fā)送數(shù)組。
接收數(shù)組和發(fā)送數(shù)組的長(zhǎng)度根據(jù)CAN網(wǎng)絡(luò)負(fù)載率進(jìn)行設(shè)置,保證在CAN網(wǎng)絡(luò)正常通信的情況下,不會(huì)出現(xiàn)緩沖區(qū)溢出的情形。
數(shù)組元素通過(guò)索引進(jìn)行尋址,接收數(shù)組和發(fā)送數(shù)組均分別包括兩個(gè)索引:存入索引和取出索引。將索引加一時(shí),判斷索引值是否等于數(shù)組長(zhǎng)度,如果索引值等于數(shù)組長(zhǎng)度,將索引值置零。
所述步驟(2)進(jìn)入軟件接收緩沖區(qū)管理子模塊后的步驟為:
步驟(201):判斷存入索引是否等于取出索引,若是就結(jié)束;若否就進(jìn)入步驟(202);
步驟(202):讀取接收數(shù)組中由取出索引標(biāo)記的元素;
步驟(203):對(duì)報(bào)文進(jìn)行處理,將取出的索引加一;判斷取出索引是否等于數(shù)組長(zhǎng)度,若等于就將取出索引值置零,然后返回步驟(201);否則直接返回步驟(201)。
所述步驟(3)進(jìn)入軟件發(fā)送緩沖區(qū)任務(wù)管理子模塊后的步驟為:
步驟(301):判斷存入索引是否等于取出索引,若是就禁止報(bào)文發(fā)送中斷,結(jié)束;若否就進(jìn)入步驟(302);
步驟(302):判斷CAN控制器硬件發(fā)送緩沖區(qū)是否已滿,若是就結(jié)束;若否就進(jìn)入步驟(303);
步驟(303):將發(fā)送數(shù)組中由取出索引標(biāo)記的數(shù)組元素賦值到CAN控制器的寄存器;將取出索引加一;判斷取出索引值是否等于數(shù)組長(zhǎng)度;若是就將取出索引置零,然后返回步驟(301),若否就直接返回步驟(301)。
所述步驟(1)與步驟(2)之間還有步驟(10);所述步驟(10)包括:
步驟(101):當(dāng)發(fā)送報(bào)文時(shí),根據(jù)CAN控制器的寄存器判斷硬件發(fā)送緩沖區(qū)是否已滿,若未滿,則將待發(fā)送的報(bào)文填充到硬件發(fā)送緩沖區(qū),CAN控制器自動(dòng)完成報(bào)文發(fā)送任務(wù);若已滿,則將待發(fā)送報(bào)文存入軟件發(fā)送緩沖區(qū),將存入索引加一,同時(shí)開(kāi)啟CAN報(bào)文發(fā)送中斷;若存入索引值等于接收數(shù)組的長(zhǎng)度,則將存入索引值置零;
當(dāng)CAN控制器成功發(fā)送報(bào)文后,觸發(fā)報(bào)文發(fā)送中斷,在CAN報(bào)文發(fā)送中斷服務(wù)程序中,向軟件緩沖區(qū)管理模塊發(fā)送硬件發(fā)送緩沖區(qū)未滿信號(hào);
步驟(102):當(dāng)接收?qǐng)?bào)文時(shí),在CAN報(bào)文接收中斷服務(wù)程序中,將CAN控制器硬件接收緩沖區(qū)中的數(shù)據(jù)存入由存入索引尋址的軟件接收緩沖區(qū),向軟件緩沖區(qū)管理模塊發(fā)送接收到新報(bào)文的信號(hào),同時(shí)將存入索引加一,若存入索引值等于接收數(shù)組的長(zhǎng)度,則將存入索引值置零。
一種汽車(chē)CAN總線網(wǎng)關(guān)的報(bào)文收發(fā)系統(tǒng),包括:
CAN控制器,所述CAN控制器與物理層芯片連接,所述物理層芯片與總線連接,所述CAN控制器上有硬件接收緩沖區(qū)和硬件發(fā)送緩沖區(qū);
MCU,設(shè)有軟件接收緩沖區(qū)和軟件發(fā)送緩沖區(qū),所述軟件接收緩沖區(qū)由報(bào)文接收中斷服務(wù)程序和軟件接收緩沖區(qū)管理子模塊管理;所述軟件發(fā)送緩沖區(qū)由報(bào)文發(fā)送函數(shù)、報(bào)文發(fā)送中斷服務(wù)程序和軟件發(fā)送緩沖區(qū)管理子模塊管理;軟件發(fā)送緩沖區(qū)管理子模塊和軟件接收緩沖區(qū)管理子模塊組成軟件緩沖區(qū)管理模塊;
在軟件緩沖區(qū)管理模塊中,若接收到信號(hào),首先判斷信號(hào)是否是接收到新報(bào)文,若是則進(jìn)入軟件接收緩沖區(qū)管理子模塊;如果否,則進(jìn)一步判斷接收到的信號(hào)是否是硬件發(fā)送緩沖區(qū)未滿,若是就進(jìn)入軟件發(fā)送緩沖區(qū)管理子模塊;若否就結(jié)束。
當(dāng)發(fā)送報(bào)文時(shí),根據(jù)CAN控制器的寄存器判斷硬件發(fā)送緩沖區(qū)是否已滿,若未滿,則將待發(fā)送的報(bào)文填充到硬件發(fā)送緩沖區(qū),CAN控制器自動(dòng)完成報(bào)文發(fā)送任務(wù);若已滿,則將待發(fā)送報(bào)文存入軟件發(fā)送緩沖區(qū),將存入索引加一,同時(shí)開(kāi)啟CAN報(bào)文發(fā)送中斷;若存入索引值等于接收數(shù)組的長(zhǎng)度,則將存入索引值置零;
當(dāng)CAN控制器成功發(fā)送報(bào)文后,觸發(fā)報(bào)文發(fā)送中斷,在CAN報(bào)文發(fā)送中斷服務(wù)程序中,向軟件緩沖區(qū)管理模塊發(fā)送硬件發(fā)送緩沖區(qū)未滿信號(hào);
當(dāng)接收?qǐng)?bào)文時(shí),在CAN報(bào)文接收中斷服務(wù)程序中,將CAN控制器硬件接收緩沖區(qū)中的數(shù)據(jù)存入由存入索引尋址的軟件接收緩沖區(qū),向軟件緩沖區(qū)管理模塊發(fā)送接收到新報(bào)文的信號(hào),同時(shí)將存入索引加一,若存入索引值等于接收數(shù)組的長(zhǎng)度,則將存入索引值置零。
本發(fā)明的有益效果:
1、可以選用CAN控制器硬件緩沖區(qū)較小的MCU,降低了汽車(chē)零部件的成本,提高了經(jīng)濟(jì)效益和社會(huì)效益。
2、以中斷方式觸發(fā)報(bào)文緩沖區(qū)任務(wù)管理模塊,能夠保證數(shù)據(jù)的一致性和報(bào)文周期的準(zhǔn)確性。
3、當(dāng)網(wǎng)絡(luò)拓?fù)浒l(fā)生改變或者增減CAN網(wǎng)絡(luò)報(bào)文時(shí),不必修改本方法的設(shè)計(jì),靈活性很高。
4、可以適用于普通的CAN節(jié)點(diǎn),具有很強(qiáng)的通用性。
附圖說(shuō)明
圖1為本專(zhuān)利的整體工作流程圖。
圖2為本發(fā)明的軟件緩沖區(qū)任務(wù)管理模塊流程圖。
圖3為本發(fā)明的軟件接收緩沖區(qū)任務(wù)管理模塊流程圖。
圖4為本發(fā)明的軟件發(fā)送緩沖區(qū)任務(wù)管理子模塊流程圖。
圖5為本發(fā)明的軟件與硬件連接示意圖。
具體實(shí)施方式
下面結(jié)合附圖與實(shí)施例對(duì)本發(fā)明作進(jìn)一步說(shuō)明。
如圖1所示,
1、針對(duì)CAN報(bào)文的接收和發(fā)送分別定義軟件接收緩沖區(qū)和軟件發(fā)送緩沖區(qū),建立緩沖區(qū)管理模塊,在CAN控制器中斷服務(wù)程序中向緩沖區(qū)管理模塊發(fā)送“接收到新報(bào)文”或“硬件發(fā)送緩沖區(qū)未滿”信號(hào),在緩沖區(qū)管理模塊中,處理軟件接收緩沖區(qū)中的報(bào)文、發(fā)送軟件發(fā)送緩沖區(qū)中的報(bào)文。
2、軟件接收緩沖區(qū)和軟件發(fā)送緩沖區(qū)為結(jié)構(gòu)體數(shù)組,結(jié)構(gòu)體成員包括報(bào)文ID、報(bào)文長(zhǎng)度和報(bào)文數(shù)據(jù)。接收數(shù)組和發(fā)送數(shù)組的長(zhǎng)度根據(jù)CAN網(wǎng)絡(luò)負(fù)載率進(jìn)行設(shè)置,保證在CAN網(wǎng)絡(luò)正常通信的情況下,不會(huì)出現(xiàn)緩沖區(qū)溢出的情形。
3、數(shù)組元素通過(guò)索引進(jìn)行尋址,接收數(shù)組和發(fā)送數(shù)組各包括兩個(gè)索引:存入索引和取出索引。將索引加一時(shí),如果索引值等于數(shù)組長(zhǎng)度,將索引值置零。
4、在CAN報(bào)文接收中斷服務(wù)程序中,將CAN控制器硬件接收緩沖區(qū)中的數(shù)據(jù)存入由接收數(shù)組存入索引尋址的接收緩沖區(qū)位置,向緩沖區(qū)管理模塊發(fā)送“接收到新報(bào)文”信號(hào)。同時(shí),將存入索引加一,如果存入索引值等于數(shù)組長(zhǎng)度,將存入索引值置零。
5、當(dāng)應(yīng)用需要發(fā)送報(bào)文時(shí),首先通過(guò)CAN控制器的寄存器判斷硬件發(fā)送緩沖區(qū)是否已滿,如果未滿,將待發(fā)送報(bào)文填充到硬件發(fā)送緩沖區(qū),CAN控制器自動(dòng)完成報(bào)文發(fā)送任務(wù)。如果已滿,將待發(fā)送報(bào)文存入由發(fā)送數(shù)組存入索引標(biāo)記的軟件發(fā)送緩沖區(qū)位置,將存入索引加一,同時(shí)開(kāi)啟CAN報(bào)文發(fā)送中斷。如果存入索引值等于數(shù)組長(zhǎng)度,將存入索引值置零。
6、CAN控制器成功發(fā)送報(bào)文后,觸發(fā)報(bào)文發(fā)送中斷,在CAN報(bào)文發(fā)送中斷服務(wù)程序中,向緩沖區(qū)管理模塊發(fā)送“硬件發(fā)送緩沖區(qū)未滿”信號(hào)。
7、如圖2所示,在緩沖區(qū)管理模塊中,如果接收到的信號(hào)是“接收到新報(bào)文”,進(jìn)入軟件接收緩沖區(qū)管理子模塊,如果接收到的信號(hào)是“硬件發(fā)送緩沖區(qū)未滿”,進(jìn)入軟件發(fā)送緩沖區(qū)管理子模塊。
8、如圖3所示,軟件接收緩沖區(qū)管理子模塊的處理流程為:
步驟一:如果接收數(shù)組的存入索引等于取出索引,表示不存在未被處理的報(bào)文,進(jìn)入步驟四。否則,進(jìn)入步驟二。
步驟二:讀取接收數(shù)組中由取出索引標(biāo)記的元素,根據(jù)報(bào)文ID、長(zhǎng)度和數(shù)據(jù)進(jìn)行相應(yīng)處理,進(jìn)入步驟三。
步驟三:將取出索引加一,如果取出索引值等于數(shù)組長(zhǎng)度,將取出索引置零。返回步驟一。
步驟四:退出軟件接收緩沖區(qū)管理子模塊。
9、如圖4所示,軟件發(fā)送緩沖區(qū)任務(wù)管理子模塊的處理流程為:
步驟一:如果發(fā)送數(shù)組的存入索引等于取出索引,表示不存在未被發(fā)送的報(bào)文,關(guān)閉報(bào)文發(fā)送中斷,進(jìn)入步驟五,否則,進(jìn)入步驟二。
步驟二:通過(guò)CAN控制器寄存器判斷硬件發(fā)送緩沖區(qū)是否已滿,如果已滿,進(jìn)入步驟五,否則,進(jìn)入步驟三。
步驟三:讀取發(fā)送數(shù)組中由取出索引標(biāo)記的元素,將報(bào)文ID、長(zhǎng)度和數(shù)據(jù)賦值到CAN控制器硬件發(fā)送緩沖區(qū)對(duì)應(yīng)的寄存器,進(jìn)入步驟四。
步驟四:將取出索引加一,如果取出索引值等于數(shù)組長(zhǎng)度,將取出索引置零。返回步驟一。
步驟五:退出軟件發(fā)送緩沖區(qū)管理子模塊。
10、在CAN控制器初始化程序中使能接收中斷,CAN控制器以中斷方式接收總線報(bào)文。
11、當(dāng)應(yīng)用需要發(fā)送報(bào)文而CAN控制器硬件發(fā)送緩沖區(qū)已滿時(shí),開(kāi)啟報(bào)文發(fā)送中斷。在軟件發(fā)送緩沖區(qū)任務(wù)管理子模塊中將軟件發(fā)送緩沖區(qū)中的待發(fā)送報(bào)文全部發(fā)送完后,關(guān)閉報(bào)文發(fā)送中斷。
如圖5所示,為本發(fā)明的軟件與硬件連接示意圖。
上述雖然結(jié)合附圖對(duì)本發(fā)明的具體實(shí)施方式進(jìn)行了描述,但并非對(duì)本發(fā)明保護(hù)范圍的限制,所屬領(lǐng)域技術(shù)人員應(yīng)該明白,在本發(fā)明的技術(shù)方案的基礎(chǔ)上,本領(lǐng)域技術(shù)人員不需要付出創(chuàng)造性勞動(dòng)即可做出的各種修改或變形仍在本發(fā)明的保護(hù)范圍以?xún)?nèi)。