01 首語(yǔ)
隨著人們對(duì)汽車(chē)功能需求越來(lái)越多樣化、智能化,汽車(chē)的零部件(ECU,Electronic Control Unit)的數(shù)量也越來(lái)越多、越來(lái)越復(fù)雜,像自動(dòng)駕駛、主動(dòng)安全等功能加入,普通汽車(chē)搭載ECU數(shù)量大約為50-100個(gè),而豪華智能汽車(chē)的ECU數(shù)量平均可達(dá)到300個(gè)以上。在如此龐大數(shù)量的ECU的汽車(chē)中,各個(gè)ECU之間是如何進(jìn)行信息交換、共同協(xié)作,以及ECU是如何完成在線升級(jí)(OTA,On The Air)的呢?本文將介紹汽車(chē)電子中常用的通信協(xié)議——控制器局部網(wǎng)(CAN,Controller Area Network)。
02 CAN基礎(chǔ)概念介紹
CAN通信技術(shù)是由博世(BOSCH)公司于1986 年開(kāi)發(fā)出面向汽車(chē)的一種通信協(xié)議,隨后通過(guò)ISO-11898和ISO-11519對(duì)其進(jìn)行標(biāo)準(zhǔn)化:
1、ISO-11898:定義了通信速率為 125 kbps~1 Mbps 的高速 CAN 通信標(biāo)準(zhǔn),屬于閉環(huán)總線,傳輸速率可達(dá)1Mbps,總線長(zhǎng)度 ≤ 40米。
2、ISO-11519:定義了通信速率為 10~125 kbps 的低速 CAN 通信標(biāo)準(zhǔn),屬于開(kāi)環(huán)總線,傳輸速率為40kbps時(shí),總線長(zhǎng)度可達(dá)1000米。
CAN通信網(wǎng)絡(luò)是歐洲汽車(chē)網(wǎng)絡(luò)的標(biāo)準(zhǔn)協(xié)議,在發(fā)展過(guò)程中,其高性能和可靠性被廣泛認(rèn)可,所以也會(huì)被使用在工業(yè)自動(dòng)化、船舶、醫(yī)療設(shè)備、工業(yè)設(shè)備中。
CAN是異步通信,與I2C、SPI這類(lèi)具有時(shí)鐘信號(hào)線的同步通信協(xié)議不同,CAN通信只有兩根信號(hào)線CAN_HIGH和CAN_LOW來(lái)組成一對(duì)差分信號(hào)線,下圖是在汽車(chē)電子中常見(jiàn)的ECU在CAN網(wǎng)絡(luò)的連接圖:
圖1 ECU連接圖
差分信號(hào)
差分信號(hào)又稱差模信號(hào),與傳統(tǒng)使用單根信號(hào)線電壓表示邏輯的方式有區(qū)別,晶體管-晶體管邏輯電平(TTL)信號(hào)就是用的單根信號(hào)線的電壓值來(lái)表示邏輯值,其電平信號(hào)規(guī)定:+5V等價(jià)于邏輯1,0V等價(jià)于邏輯0。而使用差分信號(hào)傳輸時(shí),需要兩根信號(hào)線,這兩個(gè)信號(hào)線的振幅相等,相位相反,通過(guò)兩根信號(hào)線的電壓差值(Vdiff,Voltage Difference)來(lái)表示邏輯0和邏輯1,Vdiff=CAN_H-CAN_L。CAN差分信號(hào)如下圖所示。
圖2 差分信號(hào)
CAN總線為隱性電平時(shí)代表邏輯1,CAN_H和CAN_L的電平為2.5V(電位差Vdiff為0V);
CAN總線為顯性電平時(shí)代表邏輯0,CAN_H和CAN_L的電平分別是3.5V和1.5V(電位差Vdiff為2.0V左右)。
位時(shí)序
前面提到CAN是一種異步通信,沒(méi)有時(shí)鐘信號(hào)線,其通信過(guò)程類(lèi)似串口通信(Serial Communications),CAN控制器之間通過(guò)事先約定好的時(shí)序進(jìn)行通信,但CAN通信還會(huì)采用位同步(Bit Synchronization)的方式來(lái)抗干擾、吸收誤差,從而使得CAN控制器可以對(duì)總線信號(hào)進(jìn)行正確采樣,保證正常通信。
CAN 協(xié)議把每一個(gè)數(shù)據(jù)位的時(shí)序分解成如圖3所示的 Sync_Seg 段、Prop_Seg 段、Phase_Seg1 段、Phase_Seg2 段,這四段的長(zhǎng)度加起來(lái)為一個(gè) CAN 數(shù)據(jù)位的長(zhǎng)度。最小的時(shí)間單位是 Tq(Time Quantum),一個(gè)完整的位由 8-25 個(gè) Tq 組成。
圖3 位時(shí)間
Sync_Seg(同步段)
若通訊節(jié)點(diǎn)檢測(cè)到總線上信號(hào)的跳變沿被包含在 Sync_Seg段的范圍之內(nèi),則表示節(jié)點(diǎn)與總線的時(shí)序是同步的,當(dāng)節(jié)點(diǎn)與總線同步時(shí),采樣點(diǎn)(Sampling Point)采集到的總線電平可被認(rèn)為該位的電平。Sync_Seg的大小固定為 1Tq。
Prop_Seg(傳播時(shí)間段)
這個(gè)時(shí)間段是用于補(bǔ)償網(wǎng)絡(luò)的物理延時(shí)時(shí)間。是總線上輸入比較器延時(shí)和輸出驅(qū)動(dòng)器延時(shí)總和的兩倍。Prop_Seg段的大小可以為 1-8Tq。
Phase_Seg1(相位緩沖段1)
這個(gè)時(shí)間段主要用來(lái)補(bǔ)償邊沿階段的誤差,它的時(shí)間長(zhǎng)度在重新同步的時(shí)候可以加長(zhǎng)。Phase_Seg1段的初始大小可以為 1-8Tq。
Phase_Seg2(相位緩沖段2)
這個(gè)時(shí)間段也是用來(lái)補(bǔ)償邊沿階段誤差的,它的時(shí)間長(zhǎng)度在重新同步時(shí)可以縮短。Phase_Seg2段的初始大小可以為 2-8Tq。
CAN收發(fā)器
ECU需要從總線中獲取CAN幀中的信號(hào)電平,轉(zhuǎn)化為邏輯電平,也就是將圖2 差分信號(hào)中的顯性電平和隱性電平轉(zhuǎn)換為對(duì)應(yīng)的邏輯電平0和邏輯電平1,這樣在總線中的CAN幀就被轉(zhuǎn)換成程序中使用的CAN報(bào)文了。
這個(gè)步驟就是由CAN收發(fā)器(CAN Transceiver)來(lái)完成的,如圖1 ECU連接圖所示,其位于MCU和CAN Network之間,接收CAN總線上的CAN幀相關(guān)的信號(hào)電平并將其轉(zhuǎn)化為邏輯信息電平轉(zhuǎn)發(fā)給CAN控制器,并且也接收從CAN控制器傳輸過(guò)來(lái)的邏輯電平信息并將其轉(zhuǎn)化為信號(hào)電平傳從到CAN總線上。
03 CAN幀
CAN有五種幀的類(lèi)型:數(shù)據(jù)幀(Data Frame)、遠(yuǎn)程幀(Remote Frame)、錯(cuò)誤幀(Error Frame)、間隔幀(Can Interval Frame)和過(guò)載幀(Overload Frame) ,其中最復(fù)雜的幀類(lèi)型為數(shù)據(jù)幀,其作用是傳輸數(shù)據(jù),數(shù)據(jù)長(zhǎng)度是可變的,一個(gè)經(jīng)典CAN(Classical CAN)數(shù)據(jù)幀可傳輸0-8個(gè)字節(jié)的數(shù)據(jù)(數(shù)據(jù)內(nèi)容長(zhǎng)度,不含CAN幀的控制信息),而一個(gè)CAN FD(CAN with Flexible Data rate)的可傳輸?shù)臄?shù)據(jù)長(zhǎng)度可達(dá)64個(gè)字節(jié),后文提到的CAN為經(jīng)典CAN。CAN幀會(huì)因其ID位數(shù)的不同而不同,以ID位數(shù)分為兩類(lèi):標(biāo)準(zhǔn)幀(11位CAN Identifier)和擴(kuò)展幀(29位CAN Identifier)。
標(biāo)準(zhǔn)幀
如圖4所示,一個(gè)帶有11位CAN Identifier的幀以SOF(Start Of Frame)開(kāi)始,以EOF(End Of Frame)結(jié)束,其中包含五個(gè)區(qū)域,分別為仲裁區(qū)(Arbitration Field)、控制區(qū)(Control Field)、數(shù)據(jù)區(qū)(Data Field)、校驗(yàn)區(qū)(CRC Field)、應(yīng)答區(qū)(ACK Field)。
圖4 標(biāo)準(zhǔn)數(shù)據(jù)幀
仲裁區(qū)
這個(gè)區(qū)域包含CAN Identifier的[28:18],總共11位,其范圍為0x000-0x7FF,CAN Identifier的值越小會(huì)在CAN總線仲裁時(shí)擁有更高的優(yōu)先級(jí)(Priority)。RTR位用來(lái)指示該幀是否位遠(yuǎn)程幀(用來(lái)區(qū)分沒(méi)有數(shù)據(jù)的數(shù)據(jù)幀和遠(yuǎn)程幀)。
控制區(qū)
IDE位用來(lái)指示該幀是否為擴(kuò)展幀;r0為保留位;DLC指示該幀數(shù)據(jù)區(qū)的長(zhǎng)度。
數(shù)據(jù)區(qū)
這里放著0-8個(gè)字節(jié)需要傳輸?shù)臄?shù)據(jù)。
校驗(yàn)區(qū)
CRC(Cyclic Redundancy Check):循環(huán)冗余校驗(yàn);Delimiter:分隔符。
應(yīng)答區(qū)
ACK SLOT:應(yīng)答槽,發(fā)送方會(huì)將此位作為隱性電平發(fā)送,接收方成功接收后會(huì)將此位重寫(xiě),以此來(lái)讓發(fā)送方知道此幀是否被成功發(fā)送。
擴(kuò)展幀
設(shè)計(jì)擴(kuò)展幀的目的是為了完成對(duì)更長(zhǎng)的CAN Identifier的傳輸,所以擴(kuò)展幀中的CAN Identifier使用到了ID[28:0],一共是29位,如圖5所示,擴(kuò)展幀和標(biāo)準(zhǔn)幀大致相同,只有幾個(gè)地方有一些小的區(qū)別。
圖5 擴(kuò)展數(shù)據(jù)幀
SRR位(Substitute Remote Request):替代遠(yuǎn)程請(qǐng)求位
r0/r1位:保留位
04 CAN控制器
雖然有相應(yīng)的標(biāo)準(zhǔn)來(lái)規(guī)范CAN通信,但是不同的芯片廠商對(duì)其功能的具體實(shí)現(xiàn)卻各不相同,不同點(diǎn)主要在CAN外設(shè)在芯片中的寄存器設(shè)計(jì),各自驅(qū)動(dòng)程序自然也有區(qū)別,但在CAN總線上發(fā)出和接收的CAN幀都和標(biāo)準(zhǔn)規(guī)定的一致。下面是一些具體的例子來(lái)描述CAN控制器的大致工作機(jī)制。
Cypress Traveo II系列芯片是英飛凌專為汽車(chē)應(yīng)用設(shè)計(jì)的32位MCU,其CAN控制器支持經(jīng)典CAN和CAN FD(ISO 11898-1:2015)。收發(fā)CAN幀時(shí)支持多種模式,給應(yīng)用帶來(lái)更多可能,方便實(shí)現(xiàn)不同的場(chǎng)景需要。
消息區(qū)
Traveo II系列MCU的CAN控制器具有一塊消息區(qū)(MRAM,Message RAM),其地址范圍與程序運(yùn)行時(shí)使用的RAM地址范圍是隔離的,也就是說(shuō)CAN控制器用來(lái)存儲(chǔ)接收/發(fā)送的CAN幀以及自身的配置信息的MRAM和程序規(guī)定的堆、棧等RAM區(qū)域是不沖突的,這樣也可以有效避免程序的可能存在的錯(cuò)誤導(dǎo)致CAN幀的數(shù)據(jù)被篡改。圖6是Trave II MRAM中關(guān)于CAN的配置。
圖6 MRAM包含的區(qū)域
從圖中可以看出,Traveo II 的CAN控制器的MRAM的地址是以32位對(duì)齊的,從上向下看,首先是CAN ID的配置信息,根據(jù)配置CAN控制器中相關(guān)寄存器,可將CAN ID初始化為11位或29位,并將不同的CAN ID寫(xiě)入不同的區(qū)域。
接下來(lái)是存儲(chǔ)CAN幀的關(guān)鍵區(qū)域,這里存著CAN控制器從總線接收到符合上面已經(jīng)配置好的CAN ID的CAN幀、即將要發(fā)送的CAN幀,從圖中可以看出接收/發(fā)送時(shí)可以使用FIFO(實(shí)際也有Queue)模式和Buffer模式,后面會(huì)詳細(xì)介紹不同的模式的工作方式以及CAN幀的內(nèi)部構(gòu)造。
接收
前面提到接收有兩種工作模式,分別是FIFO(Queue)和Buffer,Buffer模式工作過(guò)程簡(jiǎn)單,一旦有CAN幀被CAN控制器存入Buffer內(nèi),相應(yīng)的中斷處理函數(shù)就會(huì)被觸發(fā)來(lái)處理對(duì)應(yīng)的CAN幀。而FIFO和Queue模式就復(fù)雜一些,如圖7所示,這是一個(gè)擁有8個(gè)Rx CAN幀塊(英飛凌Traveo II官方手冊(cè)中稱為Rx Element)的FIFO區(qū)域,不難看出,有兩個(gè)關(guān)鍵的標(biāo)志Get Pos和Put Pos,分別用來(lái)指示當(dāng)前CAN幀獲取位置和下一個(gè)CAN幀存放位置。此時(shí)FIFO區(qū)域中已經(jīng)存在了3個(gè)CAN幀等待讀取,當(dāng)驅(qū)動(dòng)程序?qū)AN幀從MRAM中讀取完畢時(shí),會(huì)設(shè)置對(duì)應(yīng)寄存器來(lái)通知CAN控制器,然后Get Pos和Put Pos會(huì)指向同一個(gè)CAN幀塊(為空狀態(tài))。
圖7RxFIFO
如圖8所示,這是一個(gè)由CAN控制器從CAN收發(fā)器上傳來(lái)的CAN幀的內(nèi)部構(gòu)造,這里還是把它稱作Rx CAN幀塊,其內(nèi)容包含了一些前面講到的CAN數(shù)據(jù)幀的一些控制位、數(shù)據(jù)位,還有一些是為了兼容CAN FD所預(yù)留的,這里只介紹和經(jīng)典CAN的相關(guān)內(nèi)容,CAN FD的大同小異。
圖8 Rx CAN幀塊
XTD位:指示該幀為標(biāo)準(zhǔn)幀還是擴(kuò)展幀,若此位為0則該幀是標(biāo)準(zhǔn)幀,ID中[28:18]是有效CAN ID,即該幀CAN ID為11位;若此位為1則該幀是擴(kuò)展幀,ID中[28:0]全部是有效CAN ID內(nèi)容,即該幀CAN ID為29位。
RTR位:用來(lái)區(qū)分該幀為遠(yuǎn)程請(qǐng)求幀還是數(shù)據(jù)幀,若此位為0則該幀是數(shù)據(jù)幀,若此位為1則該幀是遠(yuǎn)程請(qǐng)求幀。
DLC[3:0]:此4位數(shù)據(jù)用來(lái)指示該幀含有的數(shù)據(jù)的字節(jié)數(shù),本文只討論經(jīng)典CAN,所以DLC規(guī)定的范圍應(yīng)該在0-8字節(jié)。
R2-R3:這兩行數(shù)據(jù)就是數(shù)據(jù)幀中的數(shù)據(jù)域中的內(nèi)容,經(jīng)典CAN最多傳輸8個(gè)字節(jié)數(shù)據(jù),從圖中可以看出,這樣一個(gè)CAN幀塊最大支持8個(gè)字節(jié)的數(shù)據(jù),DB0-DB7。
發(fā)送
CAN控制發(fā)送過(guò)程就相對(duì)復(fù)雜一些,因?yàn)樯蠈討?yīng)用可能需要發(fā)多種CAN ID報(bào)文,其報(bào)文優(yōu)先級(jí)有高有低,高優(yōu)先級(jí)需要盡快發(fā)出,低優(yōu)先級(jí)則可以在緩沖區(qū)中等待優(yōu)先級(jí)更高的CAN幀發(fā)送完,再發(fā)出。
圖9 同時(shí)使用Tx Buffer和Tx FIFO
如圖9所示,當(dāng)同時(shí)使用Tx Buffer和Tx FIFO時(shí),CAN控制器每次都會(huì)掃描這些區(qū)域,當(dāng)前狀態(tài)下,Tx Buffer中一個(gè)CAN ID為2的CAN幀等待發(fā)送,因?yàn)樗荰x Buffer區(qū)域中CAN ID最小的,并且比Tx FIFO中處于Get Pos的這一幀(CAN ID為4)小,所以它擁有最高優(yōu)先級(jí),這一幀將會(huì)最先被發(fā)出去,第二次CAN控制器再次掃描這些區(qū)域,發(fā)現(xiàn)處于Tx FIFO中Get Pos的這一幀(CAN ID為4)是這些區(qū)域中最小的(包括Tx Buffer),所以第二次將會(huì)發(fā)送CAN ID為4的這一幀,如此往復(fù),直到這些區(qū)域內(nèi)的所有Tx CAN幀塊被全部通過(guò)CAN收發(fā)器轉(zhuǎn)換為信號(hào)電平發(fā)送到總線上。
圖10 Tx Element
如圖10所示,與Rx Element類(lèi)似,XTD、RTR、ID、DLC以及DB0-DB7的用法與Rx Element一致,只有部分內(nèi)容有不同。
MM[7:0]:Message Marker,這是一個(gè)與發(fā)送事件(Tx Event)相關(guān)的信息。
EFC(Event FIFO Control)位:該位表示該幀是否有將發(fā)送事件存在對(duì)應(yīng)的MRAM中。
FDF位:此位用來(lái)標(biāo)識(shí)該幀是否為一個(gè)CAN FD幀。
BRS(Bit Rate Switching)位:當(dāng)該幀位CAN FD幀(即FDF為1時(shí)),此位才有效,決定該幀在發(fā)送時(shí)是否啟用速率切換(Rate Switching),以更高的速度傳輸。
更多與Traveo II發(fā)送和接收CAN幀相關(guān)的細(xì)節(jié),大家可以去查閱英飛凌提供的技術(shù)手冊(cè)TRM。
05 總結(jié)
CAN通信已經(jīng)存在了相當(dāng)長(zhǎng)的時(shí)間了,其強(qiáng)大的性能和相對(duì)高的穩(wěn)定性讓其不僅在汽車(chē)領(lǐng)域大顯身手,還被廣泛用在各種有性能和穩(wěn)定性有要求的領(lǐng)域,但在人民日益增長(zhǎng)的需求下,其缺點(diǎn)被逐漸放大,例如其每一幀的數(shù)據(jù)負(fù)載量較?。恳粠夹枰獛в蠧ANID和一些控制信息)、速率有限,好在CANFD的出現(xiàn),將每一幀可傳輸?shù)淖止?jié)數(shù)增加至64字節(jié),并增加了波特率,極大的改進(jìn)了經(jīng)典CAN通信。
隨著時(shí)代的變化,大家對(duì)新能源車(chē)的要求越來(lái)越高,更復(fù)雜的娛樂(lè)功能、高級(jí)輔助駕駛、自動(dòng)駕駛功能等等,CAN通信在這些功能的就有點(diǎn)力不從心了,現(xiàn)在出現(xiàn)FlexRay、車(chē)載以太網(wǎng)等一些新的通信技術(shù),隨著這些有趣的技術(shù)快速發(fā)展,讓我們來(lái)看看會(huì)發(fā)生什么。
評(píng)論
查看更多