1. CAN協(xié)議
1.1 CAN協(xié)議簡(jiǎn)介
CAN是是國際上應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一。
最終成為國際標(biāo)準(zhǔn)(ISO11519以及ISO11898),差異點(diǎn)如下:
1.2 CAN物理層
CAN通訊不是以時(shí)鐘信號(hào)來進(jìn)行同步的,它是一種異步通訊,只具有CAN_High和 CAN_Low兩條信號(hào)線,共同構(gòu)成一組差分信號(hào)線,以差分信號(hào)的形式進(jìn)行通訊。CAN 物理層的形式主要有兩種:
遵循ISO11898標(biāo)準(zhǔn)的高速、短距離閉環(huán)網(wǎng)絡(luò),總線最大長(zhǎng)度為40m,通信速度最高為 1Mbps,總線的兩端各要求有一個(gè)120歐的電阻
是遵循ISO11519-2標(biāo)準(zhǔn)的低速、遠(yuǎn)距離開環(huán)網(wǎng)絡(luò),最大傳輸距離為1km,最高通訊速率為125kbps,兩根總線是獨(dú)立的、不形成閉環(huán),要求每根總線上各串聯(lián)有一個(gè)2.2千歐的電阻
以TJA1050芯片作為CAN收發(fā)器的電路原理圖如下圖示。
差分信號(hào)又稱差模信號(hào),差分信號(hào)傳輸時(shí),需要兩根信號(hào)線,這兩個(gè)信號(hào)線的振幅相等,相位相反,通過兩根信號(hào)線的電壓差值來表示邏輯0和邏輯1,CAN中顯性電平(差值為正)對(duì)應(yīng)邏輯0,隱性電平(差值小于或等于0)對(duì)應(yīng)邏輯1,顯性電平比隱性電平更強(qiáng)。
1.3 CAN協(xié)議層
CAN屬于異步通訊,沒有時(shí)鐘信號(hào)線,連接在同一個(gè)總線網(wǎng)絡(luò)中的各個(gè)節(jié)點(diǎn)會(huì)像串口異步通訊那樣,節(jié)點(diǎn)間使用約定好的波特率進(jìn)行通訊,CAN使用位同步的方式來抗干擾、吸收誤差,實(shí)現(xiàn)對(duì)總線電平信號(hào)進(jìn)行正確的采樣,確保通訊正常。
位時(shí)序分解:
為了實(shí)現(xiàn)位同步,CAN協(xié)議把每一個(gè)數(shù)據(jù)位的時(shí)序分解成SS段、PTS段、PBS1段、PBS2段,這四段的長(zhǎng)度加起來即為一個(gè)CAN數(shù)據(jù)位的長(zhǎng)度。分解后最小的時(shí)間單位是Tq,一個(gè)完整的位由8~25個(gè)Tq組成。
波特率:
總線上的各個(gè)通訊節(jié)點(diǎn)只要約定好1個(gè)Tq的時(shí)間長(zhǎng)度以及每一個(gè)數(shù)據(jù)位占據(jù)多少個(gè)Tq,就可以確定CAN通訊的波特率。
例如,假設(shè)上圖中的 1Tq=1us,而每個(gè)數(shù)據(jù)位由 19 個(gè) Tq 組成,則傳輸一位數(shù)據(jù)需要時(shí)間 T1bit=19us,從而每秒可以傳輸?shù)臄?shù)據(jù)位個(gè)數(shù)為:1x10次方/19 = 52631.6 (bps)。這個(gè)每秒可傳輸?shù)臄?shù)據(jù)位的個(gè)數(shù)即為通訊中的波特率。
同步過程:
波特率只是約定了每個(gè)數(shù)據(jù)位的長(zhǎng)度,數(shù)據(jù)同步還涉及到相位的細(xì)節(jié),此時(shí)就要用到數(shù)據(jù)位內(nèi)的SS、PTS、PBS1及PBS2段了。根據(jù)對(duì)段的應(yīng)用方式差異, CAN的數(shù)據(jù)同步分為硬同步和重新同步。其中硬同步只是當(dāng)存在幀起始信號(hào)時(shí)起作用,無法確保后續(xù)一連串的位時(shí)序都是同步的,而重新同步方式可解決該問題。
硬同步:
CAN節(jié)點(diǎn)通過總線發(fā)送數(shù)據(jù)時(shí),會(huì)發(fā)送一個(gè)幀起始信號(hào)。而掛載到CAN總線上的節(jié)點(diǎn)在不發(fā)送數(shù)據(jù)時(shí),會(huì)時(shí)刻檢測(cè)總線上的信號(hào)。如下圖,當(dāng)總線出現(xiàn)幀起始信號(hào)時(shí),節(jié)點(diǎn)檢測(cè)到總線的幀起始信號(hào)不在節(jié)點(diǎn)內(nèi)部時(shí)序的 SS 段范圍,所以判斷它自己的內(nèi)部時(shí)序與總線不同步,因而這個(gè)狀態(tài)的采樣點(diǎn)采集得的數(shù)據(jù)是不正確的。所以節(jié)點(diǎn)以硬同步的方式調(diào)整,把自己的位時(shí)序中的 SS 段平移至總線出現(xiàn)下降沿的部分,獲得同步,同步后采樣點(diǎn)就可以采集得正確數(shù)據(jù)了。
?重新同步:
前面的硬同步只是當(dāng)存在幀起始信號(hào)時(shí)才起作用,如果在一幀很長(zhǎng)的數(shù)據(jù)內(nèi),節(jié)點(diǎn)信號(hào)與總線信號(hào)相位有偏移時(shí),這種同步方式就無能為力了。因而引入重新同步方式,它利用普通數(shù)據(jù)位的高至低電平的跳變沿來同步。與硬同步方式相似的是它們都使用 SS 段來進(jìn)行檢測(cè),同步的目的都是使節(jié)點(diǎn)內(nèi)的 SS 段把跳變沿包含起來。重新同步分為超前和滯后兩種情況,以總線跳變沿與 SS 段的相對(duì)位置進(jìn)行區(qū)分。
-- 相位超前:
節(jié)點(diǎn)從總線的邊沿跳變中,檢測(cè)到它內(nèi)部的時(shí)序比總線的時(shí)序相對(duì)超前 2Tq,這時(shí)控制器在下一個(gè)位時(shí)序中的 PBS1 段增加 2Tq 的時(shí)間長(zhǎng)度,使得節(jié)點(diǎn)與總線時(shí)序重新同步
-- 相位滯后:
節(jié)點(diǎn)從總線的邊沿跳變中,檢測(cè)到它的時(shí)序比總線的時(shí)序相對(duì)滯后 2Tq,這時(shí)控制器在前一個(gè)位時(shí)序中的 PBS2 段減少 2Tq 的時(shí)間長(zhǎng)度,獲得同步
報(bào)文種類及結(jié)構(gòu):
對(duì)數(shù)據(jù)、操作命令 (如讀/寫) 以及同步信號(hào)進(jìn)行打包,打包后的這些內(nèi)容稱為報(bào)文。CAN一共規(guī)定了5種類型的幀。
數(shù)據(jù)幀的結(jié)構(gòu):數(shù)據(jù)幀是在CAN通訊中最主要、最復(fù)雜的報(bào)文,它的結(jié)構(gòu)如下圖。
其他報(bào)文結(jié)構(gòu):
2. CAN控制器
STM32 的芯片中具有bxCAN控制器,支持CAN協(xié)議2.0A和2.0B標(biāo)準(zhǔn)。該CAN控制器支持最高的通訊速率為1Mb/s;可以自動(dòng)地接收和發(fā)送CAN報(bào)文,支持使用標(biāo)準(zhǔn)ID和擴(kuò)展ID的報(bào)文;外設(shè)中有3個(gè)發(fā)送郵箱,發(fā)送報(bào)文的優(yōu)先級(jí)可以使用軟件控制,還可記錄發(fā)送的時(shí)間;有2個(gè)3級(jí)深度的接收FIFO,可使用過濾功能只接收或不接收某些ID號(hào)的報(bào)文;可配置成自動(dòng)重發(fā);不支持使用DMA進(jìn)行數(shù)據(jù)收發(fā)??蚣苁疽鈭D如下:
STM32有兩組CAN控制器,其中CAN1是主設(shè)備,框圖中的存儲(chǔ)訪問控制器是由CAN1控制的,CAN2無法直接訪問存儲(chǔ)區(qū)域,所以使用CAN2的時(shí)候必須使能CAN1外設(shè)的時(shí)鐘??驁D中主要包含CAN控制內(nèi)核、發(fā)送郵箱、接收FIFO以及驗(yàn)收篩選器,下面對(duì)框圖中的各個(gè)部分進(jìn)行介紹。
2.1 CAN控制內(nèi)核
主控寄存器CAN_MCR:
負(fù)責(zé)管理CAN的工作模式。
?INRQ位:用來控制初始化請(qǐng)求,在CAN初始化時(shí),先設(shè)置該位為1,進(jìn)行初始化,之后再設(shè)置該位為0,讓CAN進(jìn)入正常工作模式。
位時(shí)序寄存器CAN_BTR:
用于配置測(cè)試模式、波特率以及各種位內(nèi)的段參數(shù)。
= CAN波特率的計(jì)算公式= :
只需要知道BS1和BS2的設(shè)置,以及APB1的時(shí)鐘頻率,就可以方便的計(jì)算出波特率。比如設(shè)置TS1=9、TS2=5和BRP=6,在APB1頻率為45Mhz的條件下,即可得到CAN通信的波特率=45000/6/(5+9+1)=500Kbps。?
2.2 CAN發(fā)送郵箱
CAN 共有3個(gè)發(fā)送郵箱,即最多可以緩存3個(gè)待發(fā)送的報(bào)文。每個(gè)發(fā)送郵箱中包含有標(biāo)識(shí)符寄存器CAN_TIxR、數(shù)據(jù)長(zhǎng)度控制寄存器CAN_TDTxR及2個(gè)數(shù)據(jù)寄存器CAN_TDLxR、CAN_TDHxR,如下圖。
當(dāng)使用CAN外設(shè)發(fā)送報(bào)文時(shí),需要把報(bào)文的各個(gè)段分解,按位置寫入到這些寄存器中,并對(duì)標(biāo)識(shí)符寄存器CAN_TIxR中的發(fā)送請(qǐng)求寄存器位TMIDxR_TXRQ置1,即可把數(shù)據(jù)發(fā)送出去。其中標(biāo)識(shí)符寄存器CAN_TIxR中的STDID寄存器位比較特別。我們知道CAN的標(biāo)準(zhǔn)標(biāo)識(shí)符的總位數(shù)為11位,而擴(kuò)展標(biāo)識(shí)符的總位數(shù)為29位的。當(dāng)報(bào)文使用擴(kuò)展標(biāo)識(shí)符的時(shí)候,標(biāo)識(shí)符寄存器CAN_TIxR中的STDID[10:0]等效于EXTID[18:28]位,它與EXTID[17:0]共同組成完整的29位擴(kuò)展標(biāo)識(shí)符。
發(fā)送郵箱標(biāo)識(shí)符寄存器CAN_TIxR:
發(fā)送郵箱數(shù)據(jù)長(zhǎng)度和時(shí)間戳寄存器CAN_TDTxR:
發(fā)送郵箱低字節(jié)數(shù)據(jù)寄存器CAN_TDLxR:
發(fā)送郵箱高字節(jié)數(shù)據(jù)寄存器CAN_TDHxR:
2.3 CAN接收FIFO
CAN 共有2個(gè)接收FIFO,每個(gè)FIFO中有3個(gè)郵箱,即最多可以緩存6個(gè)接收到的報(bào)文。當(dāng)接收到報(bào)文時(shí),F(xiàn)IFO的報(bào)文計(jì)數(shù)器會(huì)自增,而STM32內(nèi)部讀取FIFO數(shù)據(jù)之后,報(bào)文計(jì)數(shù)器會(huì)自減,通過狀態(tài)寄存器可獲知報(bào)文計(jì)數(shù)器的值,而通過前面主控制寄存器的RFLM位,可設(shè)置鎖定模式,鎖定模式下FIFO溢出時(shí)會(huì)丟棄新報(bào)文,非鎖定模式下FIFO溢出時(shí)新報(bào)文會(huì)覆蓋舊報(bào)文。跟發(fā)送郵箱類似,每個(gè)接收FIFO中包含有標(biāo)識(shí)符寄存器CAN_RIxR、數(shù)據(jù)長(zhǎng)度控制寄存器CAN_RDTxR及2個(gè)數(shù)據(jù)寄存器CAN_RDLxR、CAN_RDHxR,它們的功能見下表。
通過中斷或狀態(tài)寄存器知道接收FIFO有數(shù)據(jù)后,我們?cè)僮x取這些寄存器的值即可把接收到的報(bào)文加載到STM32的內(nèi)存中
接收FIFO郵箱標(biāo)識(shí)符寄存器CAN_RIxR:
接收FIFO郵箱數(shù)據(jù)長(zhǎng)度和時(shí)間戳寄存器CAN_RDTxR:
接收FIFO郵箱低字節(jié)數(shù)據(jù)寄存器CAN_RDLxR:
接收FIFO郵箱高字節(jié)數(shù)據(jù)寄存器CAN_RDHxR:
2.4 CAN驗(yàn)收篩選器
AN 驗(yàn)收篩選器,共有28個(gè)篩選器組,每個(gè)篩選器組有2個(gè)寄存器,CAN1和CAN2 共用篩選器。CAN協(xié)議中,消息的標(biāo)識(shí)符與節(jié)點(diǎn)地址無關(guān),但與消息內(nèi)容有關(guān)。因此,發(fā)送節(jié)點(diǎn)將報(bào)文廣播給所有接收器時(shí),接收節(jié)點(diǎn)會(huì)根據(jù)報(bào)文標(biāo)識(shí)符的值來確定軟件是否需要該消息,為了簡(jiǎn)化軟件的工作,STM32的CAN外設(shè)接收?qǐng)?bào)文前會(huì)先使用驗(yàn)收篩選器檢查,只接收需要的報(bào)文到FIFO中。篩選器工作的時(shí)候,可以調(diào)整篩選ID的長(zhǎng)度及過濾模式。
根據(jù)篩選ID長(zhǎng)度來分類有有以下兩種:
檢查 STDID[10:0]、EXTID[17:0]、IDE 和 RTR 位,共 31 位
檢查 STDID[10:0]、RTR、IDE 和 EXTID[17:15],共 16 位
根據(jù)過濾的方法分為以下兩種模式:
標(biāo)識(shí)符列表模式,它把要接收?qǐng)?bào)文的 ID 列成一個(gè)表,要求報(bào)文 ID 與列表中的某一個(gè)標(biāo)識(shí)符完全相同才可以接收,可以理解為白名單管理。
掩碼模式,它把可接收?qǐng)?bào)文 ID 的某幾位作為列表,這幾位被稱為掩碼,可以把它理解成關(guān)鍵字搜索,只要掩碼 (關(guān)鍵字) 相同,就符合要求,報(bào)文就會(huì)被保存到接收 FIFO
通過配置篩選模式寄存器CAN_FM1R的FBMx位可以設(shè)置篩選器工作在哪個(gè)模式。通過配置篩選尺度寄存器CAN_FS1R的FSCx位可以設(shè)置篩選器工作在哪個(gè)尺度。不同的尺度和不同的過濾方法可使篩選器工作在圖的 4 種狀態(tài)。
每組篩選器包含2個(gè)32位的寄存器,分別為CAN_FxR1和CAN_FxR2,它們用來存儲(chǔ)要篩選的ID或掩碼,各個(gè)寄存器位代表的意義與圖中兩個(gè)寄存器下面“映射”的一欄一致,各個(gè)模式的說明見表。
例如下面的表格所示,在掩碼模式時(shí),第一個(gè)寄存器存儲(chǔ)要篩選的ID,第二個(gè)寄存器存儲(chǔ)掩碼,掩碼為1的部分表示該位必須與ID中的內(nèi)容一致,篩選的結(jié)果為表中第三行的ID值,它是一組包含多個(gè)的ID值,其中x表示該位可以為1可以為0。
而工作在標(biāo)識(shí)符模式時(shí),2個(gè)寄存器存儲(chǔ)的都是要篩選的ID,它只包含2個(gè)要篩選的ID值 (32位模式時(shí))。如果使能了篩選器,且報(bào)文的ID與所有篩選器的配置都不匹配,CAN外設(shè)會(huì)丟棄該報(bào)文,不存入接收FIFO。
過濾器模式寄存器CAN_FM1R:
過濾器尺度寄存器CAN_FS1R:
過濾器FIFO分配寄存器CAN_FFA1R:
過濾器激活寄存器CAN_FA1R:
過濾器組i的寄存器x CAN_FiRx:
?
評(píng)論
查看更多