一
概述
CAN 協議即控制器局域網絡 (Controller Area Network)簡稱,由研發和生產汽車電子產品著稱的德國 BOSCH 公司開發,成為國際標準ISO11519以及ISO11898。
CAN 總線協議已經成為汽車計算機控制系統和嵌入式工業控制局域網的標準總線。
二
CAN協議構成
can協議分為物理層和協議層
CAN協議物理層
1.通訊方式
CAN使用異步通信,利用CAN_High和CAN_Low兩條信號線組成的差分信號線進行通訊(和傳統的時鐘通信不同)。
傳輸速率
500kbps和125kbps的總線分別針對不同類型的ECU。
◆500kbps CAN總線連接了ABS(防抱死制動系統),SAS(轉向角傳感器),ETM(發動機電子控制模塊)和ECM(電子控制模塊),通常用于傳輸速率要求較高的控制信號。
◆125kbps CAN接口連接了DDM(所有權門模塊)和PDM(電梯門模塊),通常用于傳輸速率要求較低的控制信號。
差分信號
差分信號通信是一種通過兩條導線(或信號線)傳輸數據的方式,主要用于提高抗干擾能力和信號完整性。
概念
在差分信號通信中,同一信號的兩個版本會同時在兩條導線上傳輸:
◆正信號(+):原始信號
◆負信號(-):原始信號的反相版本
例如:
如果正信號是高電平(+5V),負信號就是低電平(0V)
如果正信號是低電平(0V),負信號就是高電平(+5V)
信號的產生
發送端通過一個差分驅動器(或發送器)生成差分信號:
◆正信號線(D+):直接傳輸原始信號
◆負信號線(D-):傳輸原始信號的反相信號
例如:
當發送邏輯“1”時,D+線上為高電平,D-線上為低電平
當發送邏輯“0”時,D+線上為低電平,D-線上為高電平
信號的傳輸
差分信號通過兩條導線同時傳輸,導線之間的電壓差(即差分電壓)決定了信號的邏輯狀態:
差分電壓 = D+ 電壓 - D- 電壓
◆邏輯“1”通常表現為正的差分電壓(例如 +2V)
◆邏輯“0”通常表現為負的差分電壓(例如 -2V)
信號的接收
接收端使用差分接收器來解讀信號
差分接收器不直接讀取D+或D-的電壓值,而是讀取它們之間的電壓差
:
◆如果D+的電壓高于D-的電壓,接收器將其解讀為邏輯“1”
◆如果D+的電壓低于D-的電壓,接收器將其解讀為邏輯“0”
抗噪聲原理
當外部噪聲(如電磁干擾)影響到傳輸線時,通常會同時影響到D+和D-兩條線,使它們的電壓同時上升或下降。
但由于接收器只關注兩條線之間的電壓差,這種共模噪聲不會改變信號的邏輯狀態,因此可以被有效抑制。
CAN 協議中的差分信號規范
CAN 總線協議的物理層,只有 1 對差分線,在一個時刻只能表示一個信號,所以對通訊節點來說,CAN 通訊是半雙工的,收發數據需要分時進行。
CAN 的通訊網絡中,因為共用總線,在整個網絡中同一時刻只能有一個通訊節點發送信號,其余的節點在該時刻都只能接收。
2.總線網絡
can的物理層的形式有兩種
◆ISO11898 標準的高速、短距離“閉環網絡”
◆ISO11519-2 標準的低速、遠距離“開環網絡”
閉環網絡
◆總線最大長度為 40m
◆通信速度最高為 1Mbps
◆閉環總線兩端各有一個120Ω的電阻
開環網絡
總線最大長度為 1km
最高通訊速率為 125kbps
每根總線串聯一個2.2kΩ的電阻
3. 通訊節點
通訊節點構成
◆一個 CAN 控制器及 CAN 收發器構成
◆通過 CAN_Tx 及CAN_Rx 信號線連接控制器與收發器
◆通過 CAN_High 及 CAN_Low 信號線連接收發器和 CAN 總線
◆CAN_Tx 及 CAN_Rx 使用普通的類似 TTL 邏輯信號
◆CAN_High 及 CAN_Low 是一對差分信號線
多通訊節點掛載
一個總線可以掛載多個節點,CAN 通訊協議不對節點進行地址編碼,對數據內容進行編碼的。節點個數理論上不受限制(總線的負載足夠即可,通過中繼器增強負載)
通訊節點通訊流程
接收和發送流程相反
發送數據
◆控制器把要發送的二進制編碼通過 CAN_Tx 線發送到收發器。
◆收發器把這個普通的邏輯電平信號轉化成差分信號。
◆通過差分線 CAN_High 和 CAN_Low 線輸出到 CAN 總線網絡。
接收數據
CAN 總線網絡將數據通過差分線CAN_High 和 CAN_Low 發送。收發器把總線上收到的 CAN_High 及 CAN_Low 信號轉化成普通的邏輯電平信號,最后通過 CAN_Rx 線輸出到控制器中。
CAN電平轉換芯片(部分)
CAN協議協議層
1.波特率及位同步
通訊的波特率
==總線上的各個通訊節點只要約定好 1 個 Tq 的時間長度以及每一個數據位占據多少個 Tq,就可以確定 CAN 通訊的波特率==
SJW[1:0]再同步補償寬度
TS1[3:0]時間段1
TS2[2:0]時間段2
BRP[9:0]波特率分頻器
SS同步段恒等于1
設置APB1的時鐘頻率,STM32F1通常為36MHz(外部8M晶振)
詳細計算方式參考:CAN總線波特率的設定——以STM32F103為例 - 知乎 (zhihu.com)
示例:
假設1Tq=1us,而每個數據位由 19 個 Tq 組成,則傳輸一位數據需要時間;
T1bit=19us,從而每秒可以傳輸的數據位個數為:1x10次方/19 = 52631.6 (bps)
每秒可傳輸的數據位的個數即為通訊中的波特率,CAN 屬于異步通訊,沒有時鐘信號線。連接在同一個總線網絡中的各個節點會像串口異步通訊那樣,節點間使用好的波特率進行通訊。(同時使用“位同步”的方式來抗干擾、吸收誤差,實現對總線電平信號進行正確的采樣,確保通訊正常)
位時序分解
CAN 協議把每一個數據位的時序分解成SS 段,PTS 段,PBS1 段,PBS2 段
,四段的長度加起來即為一個 CAN 數據位的長度。
分解后的最小時間單元為Tq(一個完整的位由 8~25 個 Tq組成)
(此處高低電平直接代表信號邏輯 0 或邏輯 1)
示例的的數據:位長度為19Tq
◆SS 段占 1Tq
◆PTS 段占 6Tq
◆PBS1段占 5Tq
◆PBS2 段占 7Tq
SS段
同步段(大小固定為 1Tq)
==檢測到總線上信號的跳變沿被包含在 SS 段的范圍之內,則表示節點與總線的時序是同步的==
PTS段
傳播時間段(大小為 1~8Tq)
==補償網絡的物理延時時間==,總線上輸入比較器延時和輸出驅動器延時總和的兩倍
PBS1 段 (PHASE SEG1)
相位緩沖段(大小為 1~8Tq)
==補償邊沿階段的誤差==,它的時間長度在重新同步的時候可以加長
PBS2 段 (PHASE SEG2)
另一個相位緩沖段(大小為 2~8Tq)
==也是用來補償邊沿階段誤差的==,時間長度在重新同步時可以縮短
同步過程分析
簡述同步:使數據接收方能夠正確地解釋和處理從發送方接收到的數據,確保接收方能夠準確地識別出每個數據位的開始和結束。
CAN的同步分為兩種:硬同步和軟同步
硬同步(針對短幀傳輸)
硬同步是當CAN節點在總線上檢測到一個顯性邊沿(即從隱性位跳變到顯性位)時進行的同步操作
隱性位跳變到顯性位:
◆顯性位(Dominant Bit):表示邏輯“0”
◆**隱性位(Recessive Bit):**表示邏輯“1”
◆邊沿(Edge):邊沿是指信號從一個狀態轉換到另一個狀態。例如,從隱性位(邏輯1)跳變到顯性位(邏輯0)時,這種轉換稱為“顯性邊沿”
工作原理:
◆幀起始位(SOF):
◆觸發硬同步:
示例:
假設有兩個CAN節點,節點A(發送方)和節點B(接收方)(同一個CAN總線上通信)。
節點A準備發送一幀數據,節點B則負責接收該幀數據。
1.總線處于空閑狀態
在開始通信之前,CAN總線處于空閑狀態,此時總線的電壓處于隱性位(邏輯1),節點A和節點B都在等待總線的變化。
1.節點A發送數據幀起始位(SOF)
節點A開始發送一個數據幀。CAN通信的規則規定,幀的開始由一個顯性位表示,稱為幀起始位(SOF)。因此,節點A從隱性位(邏輯1)切換到顯性位(邏輯0),即電壓變化使CAN H和CAN L線之間的差異增加。
1.節點B檢測到顯性邊沿并進行硬同步
當節點B在總線上檢測到這一從隱性位跳變到顯性位的電壓變化(顯性邊沿)時,它會執行“硬同步”操作:
◆節點B內部的位時鐘會被立即重置,并開始一個新的計時周期
◆這個計時周期與節點A發送數據時的周期對齊,確保節點B能與節點A同步讀取接下來的數據位
重新同步(針對長幀傳輸)
在長幀傳輸時,(時鐘漂移導致節點的時鐘和總線的時鐘出現偏差)確保節點的時鐘與總線保持同步
基本原理:
CAN節點的內部時鐘(位時鐘)與總線上的信號發生了偏移,
重新同步通過檢測==普通數據位的跳變沿(從高電平到低電平,或從低電平到高電平)==來對齊時鐘
相位超前(時鐘快):
節點的時鐘比總線時鐘快,這意味著節點會比總線更早檢測到數據位的跳變沿
==通過延長相位緩沖段1(PBS1)的時間來使節點的時鐘與總線對齊==
相位滯后(時鐘慢):
節點的時鐘比總線時鐘慢,節點在總線跳變沿之后才檢測到信號
==通過減少相位緩沖段1(PBS1)的時間來趕上總線時鐘==
重新同步補償寬度(SJW)
調整時鐘的一種機制,用來修正節點時鐘與總線信號之間的偏差
最大SJW的限制
CAN控制器通常會為SJW設置一個最大值(單次同步操作中,時鐘的調整范圍不能超過設置的最大值)
偏差超過最大值(不能再一次完成),只能通過多次小幅度的調整完成
PBS1 和 PBS2 的調整
◆PBS1(相位緩沖段1):
◆PBS2(相位緩沖段2):
2.報文種類及結構
SPI 通訊,片選、時鐘信號、數據輸入及數據輸出這 4 個信號均有單獨的信號線。
I2C 協議,包含有時鐘信號及數據信號 2 條信號線,異步串口包含接收與發送 2 條信號線。
但是CAN只有兩條差分信號線(只能表達一個信號),所以CAN協議==對數據、操作命令 (如讀/寫) 以及同步信號進行打包,打包后的這些內容稱為報文。
報文種類
傳輸起始標簽+片選(識別)標簽+控制標簽+原始數據段+CRC校驗標簽+應答標簽+傳輸結束標簽
把上述的內容按照特定格式打包,可以用一個通道表達各種信號,對應設備按照格式去解讀就能還原數據——CAN的數據幀。
數據幀結構
開始:(幀起始)
一個顯性位 (邏輯 0)
中間:
仲裁段,控制段,數據段,CRC 段,ACK 段
最后:(幀結束)
7 個連續的隱性位 (邏輯 1)
仲裁段
==多個報文發送時,根據仲裁段決定具體的傳輸報文==
仲裁原理:
◆物理協議基礎:總線上同時出現顯性電平和隱性電平,總線的狀態會被置為顯性電平
◆==若兩個節點同時競爭 CAN 總線的占有權,當它們發送報文時,若首先出現隱性電平,則會失去對總線的占有權,進入接收狀態==
◆示例:
開始階段,兩個設備發送的電平一樣,所以它們一直繼續發送數據。
箭頭時序處,節點單元 1 發送的為隱性電平,節點單元 2 發送的為顯性電平,總線的物理協議基礎使它表達出顯示電平單元 2 競爭總線成功,該報文得以被繼續發送出去。
仲裁段 ID 數據位 (標識符):
◆包括標準格式(11位)和擴展格式(29位)
◆決定數據幀發送的優先級(can協議的優先級不由節點地址分配,由發送數據的表示ID進行決定
)
◆決定節點是否接收此數據幀
仲裁段RTR,IDE,SRR 數據位
◆IDE 位
(標識符擴展位):區分標準格式與擴展格式,==顯性電平時表示標準格式,隱性電平時表示擴展格式==
◆RTR 位
(標準格式下的遠程傳輸請求位):區分數據幀和遙控幀的,==顯性電平時表示數據幀,隱性電平時表示遙控幀==
◆SRR 位
(擴展格式下的遠程傳輸請求位):擴展幀中的 SRR 位在數據幀為隱性位,RTR 在數據幀為顯性位,所以在兩個 ID 相同的標準格式報文與擴展格式報文中,標準格式的優先級較高
控制段
指定報文的長度和擴展標識符的使用情況
◆IDE
位(標識符擴展位):區分標準幀和擴展幀,顯性電平時表示標準格式,隱性電平時表示擴展格式
◆RTR
位(遠程請求位):區分數據幀和遠程幀,顯性電平時,表示發送的數據幀,隱形電平時表示發送的遠程幀(不包含數據,通常用于請求其他節點發送數據)
◆保留位
(r0,r1):用于協議的擴展,一般被設置為顯性電平
◆DLC 位
(數據代碼長度):表示報文中實際傳輸的數據字節數(4位的字段),范圍是0-8,對應數據的字節大小(預留4位的空間是為了保證協議的拓展性)
數據段
◆包含原始的數據信息(0-8個字節)
◆執行MSB原則:最高位優先傳輸原則(MSB 一般以太網協議,CAN協議;反之LSB原則,一般文件,圖片編碼格式)
CRC段
確保數據完整性,包含CRC序列和CRC界定符
CRC 序列
◆大小為15個二進制位
◆由發送節點基于其發送的報文內容(仲裁段、控制段、數據段等)計算出來的校驗碼
◆用一個預定義的CRC多項式對報文的比特流進行計算
◆接收方收到報文后會進行相同的CRC計算,將自己計算出的CRC值與接收到的CRC序列進行比較
CRC界定符
長度固定位1位的隱性位,用來將CRC序列與后續的ACK段
ACK 段
確保數據幀被正確接收,包含ACK槽位和ACK界定符
ACK槽位
用于接收節點確認報文是否正確接收,如果正確接收報文且無報錯,接收節點通過ACK槽位向發送節點發送確認信號(將隱性位覆蓋為顯性位)
工作原理:
◆發送節點只負責在ACK槽位發送隱性位(1):
◆接收節點負責覆蓋ACK槽位中的隱性位:
ACK界定符
長度固定為1位的隱性位,將ACK槽位與結束幀分隔
3.其他報文格式(格式類似)
二
STM32F407 CAN Controller解析
基本構造
官方文檔:
https://www.ti.com/lit/an/sloa101b/sloa101b.pdf
基本支持:
支持bxCAN控制器(CAN 協議 2.0A 和 2.0B 標準‘最高速率1Mb/s
支持自動地接收和發送 CAN 報文
支持使用標準ID 和擴展 ID 的報文
支持使用軟件控制發送報文的優先級
支持記錄發送的時間,2 個 3 級深度的接收 FIFO(兩個 FIFO 隊列,每個隊列都可以存儲最多 3 個數據項),不支持DMA(直接內存訪問,用于高效數據傳輸的技術,不需要 CPU 的干預)
框架示意圖:
CAN 控制器1和2
CAN1 是主設備(控制存儲訪問控制器)
CAN2 無法直接訪問存儲區域(必須支持CAN1 外設時鐘)
組件解析
CAN 控制內核
包括CAN 控制內核(主要分析主控制寄存器 CAN_MCR,時序寄存器 CAN_BTR)
CAN_MCR( 主控制寄存器 )
主要控制CAN 的工作模式
寄存器控制圖
DBF 調試凍結功能
用于設置CAN 控制器在進入調試模式時的通信功能,工作狀態和禁止收發狀態
==設定禁止收發狀態后在進入調試狀態后將關閉通信功能==(不阻礙FIFI訪問,同時可以讀取已經接受的消息)
TTCM 時間觸發模式
用于支持預定的時間點發送和接收消息(需要嚴格的時間同步和實時性要求的場景下使用
功能實現:(內部定時器產生計時器)
◆啟動TCM模式,CAN的內部計時器會隨著每個CAN 位時間進行累加
◆接收或者發送幀起始位被采樣,控制器會生成定時器
◆生成的定時器保存在CAN_RDT_xR(接收定時器),CAN_TDTxR(發送定時器),用來表示消息發送和接受的時間
ABOM 自動離線管理
用于處理 CAN 節點由于錯誤累積過多而進入離線狀態的情況
協議基礎:
CAN 節點在離線上檢測到發送或接收錯誤累計超過一定的閾值時,會自動進入Bus-Off(離線)狀態,在此狀態下,節點將無法接收或發送任何CAN報文
實現功能:
◆錯誤監測與離線狀態
◆自動恢復機制:
◆手動恢復機制
當未啟動ABOM功能時,進入離線狀態后,需要手動恢復(例如:外部程序發送重置命令,重啟CAN 節點)。
AWUM 自動喚醒模式
在CAN控制器進入低功耗的睡眠模式后,自動偵聽睡眠活動,并在有通信時發生自動喚醒設備。
實現功能:
◆睡眠模式:沒有通信需求時可以進入睡眠模式,以降低功耗
◆自動喚醒:當 CAN 喚醒上出現數據傳輸時,AWUM會喚醒自動控制器,使其從睡眠狀態中恢復到正常工作狀態,并開始處理通信
NART自動重傳功能
◆當NART位被設置為0時,CAN 控制器會==在發送失敗時自動重傳該報文,直至發送成功狀態
◆當NART位被設置為 1時,自動重傳功能被禁用,無論發送結果如何,每個消息都只會被發送一次
RFLM 接收 FIFO 鎖定模式
用于鎖定接收 FIFO
◆當FIFO 鎖定時,接收到的FIFO溢出時,會直接丟棄下一個報文,將當前的的報文保留在FIFO中
◆當FIFO沒有鎖定時,下一個接受的報文會覆蓋原報文
TXFP 報文發送優先級的判定法
TXFP控制了當CAN發送郵箱中有多個待發送報文時,優先發送哪一條消息
◆當TXFP設置時,發送報文的數據順序是根據進入順序(即先進先出原則,“FIFO原則”)
◆當TXFP未被設置時,根據報文ID的優先級來發送消息,ID數值越低,優先級加權
CAN_BTR(位時序寄存器)及波特率
配置測試模式、波特率以及各種位內的段參數
CAN_BTR模式
靜默和環回模式用于調試和測試CAN通信(通過CAN_MCR注冊中的位30和位31(看上圖)進行啟動)
SILM 靜默模式(調試)
CAN 可以接收數據,但是不會主動發送數據,進行干擾(檢測到錯誤,也不會發送錯誤幀)
主要用于睡眠監聽,不影響睡眠上的正常通信
位31
0:正常工作
1:靜默模式
LBKM 回環模式(調試)
CAN 將自己發送的報文直接傳入到自己的寄存器上,用于自我檢測(節點自我檢測報文能否正常回傳,而不接入CAN 網絡)。
位30
0:禁止回環模式
1:支持回環模式
組合模式
如果同時啟用靜默模式(SILM = 1)和環回模式(LBKM = 1),CAN控制器將進入靜默環回模式。
CAN控制器不會與實際行走通信,但可以通過內部自我實現環回實現自動化自收。
STM32 外設位時序:
同步段 SYNC_SEG + 位段 BS1 + 位段 BS2
(采樣點位于BS1 及 BS2 段交界)
◆SYNC_SEG 段固定長度為 1Tq
◆BS1,BS2的長度在CAN_BTR中設置(支持在重新同步期間增長或縮短)
BS1段類似CAN 標準協議中PTS段+PBS段
BS2段類似CAN 標準協議中的PBS2 段
波特率配置
配置位時序寄存器 CAN_BTR的TS1[3:0] ,TS2[2:0],設定 BS1 及 BS2 段的長度,確定每個CAN 數據位的時間:
BS1 段時間:TS1=Tq x (TS1[3:0] + 1)
BS2 段時間:TS2= Tq x (TS2[2:0] + 1)
一個數據位的時間:T1bit =1Tq+TS1+TS2=1+ (TS1[3:0] + 1)+ (TS2[2:0] + 1)= N Tq
計算公式
Fpclk一般為42MHz:
CAN 發送郵箱
CAN 有三個發送郵箱(可以支持最多3和待發送的報文)
郵箱構成
CAN_TIxR(標識符寄存器) + CAN_TDTxR(數據長度控制寄存器) + CAN_TDLxR,CAN_TDHxR(2個數據寄存器)
詳解標識符
標準標識符(11 位)和擴展標識符(29 位)
發送報文的時候需要根據標識符類型將數據寫入標識符寄存器CAN_TIxR,進行發送。
標準標識符(11位)
STDID[10:0]寄存器位存儲標準標識符的 11 位值
報文中的 ID 就是STDID中的內容,所有位都可以直接用來做報文優先級判斷和匹配
擴展標識符(29 位)
STDID[10:0]和EXTID[17:0]共同存儲擴展標識符
◆高 11 位存儲在STDID[10:0](對應擴展標識符的[18:28]位)
◆低 18 位存儲在EXTID[17:0](對應擴展標識符的[0:17]位)
29 位的標識符共同決定了報文的優先級和目標地址
發送請求
CAN_TIxR 寄存器中的TMIDxR_TXRQ(為1時,開始傳輸數據)用于發送請求:
1.判斷標識符(擴展還是標準)
2.將標識符寫入標準STDID[10:0]&擴展標識符EXTID[17:0]
3.配置其他報文段如數據字段
4.TMIDxR_TXRQ設置為1,請求發送報文
CAN 接收 FIFO
接收 FIFO 是專門用于存儲接收到的 CAN 報文的
每個 CAN 外設有 2 個接收 FIFO(FIFO0 和 FIFO1),每個 FIFO 包含 3 個郵箱→一個CAN 接口最多可以緩存6個接收到的報文
工作機制
◆報文存儲:接收到報文后存儲在FIFO中,計數器自增
◆讀取報文:當cpu對報文進行讀取時,計數器自減
◆狀態監控:通過狀態寄存器可以獲取 FIFO 的當前狀態(報文數量,溢出報錯)
◆鎖定模式(RFLM)
鎖定模式:FIFO 溢出,新的報文將被丟棄
非鎖定模式:FIFO 溢出,新的報文會覆蓋 FIFO 中最舊的報文
驗收篩選器
==用于篩選接收到的 CAN 報文==
CAN 總線是廣播式的,所有節點都會接收到所有報文,但通過配置篩選器可以選擇性接收特定報文
結構與配置
CAN1 和 CAN2 共用 28 個篩選器組
每個篩選器組有 2 個寄存器
(通過配置不同的工作模式和掩碼來過濾不同的報文)
篩選器 ID 長度
過濾的報文 ID 長度來確定工作在兩種不同的長度模式:
31位模式:
◆檢查標準標識符(STDID)的 11 位(STDID[10:0])
◆擴展標識符(EXTID)**的 18 位(EXTID[17:0])
◆IDE(標識符擴展位)
◆RTR(遠程傳輸請求位)
16位模式:
◆檢查標準標識符(STDID)的 11 位(STDID[10:0])
◆RTR位
◆IDE位
◆擴展標識符的 3 位(EXTID[17:15])
配置CAN_FS1R(篩選尺度寄存器)中的FSCx位,選擇篩選器使用 31 位模式和 16 位模式。
工作模式
兩種過濾模式:
1.標識符列表模式:(類似白名單)
2.掩碼模式:(類似關鍵字匹配)
配置CAN_FM1R(篩選模式寄存器)中的FBMx位來選擇篩選器的工作模式(列表模式或掩碼模式)
四種狀態組合
1.31 位掩碼模式
2.31 位標識符列表模式
3.16 位掩碼模式
4.16 位標識符列表模式
看雪ID:gir@ffe
https://bbs.kanxue.com/user-home-989049.htm
*本文為看雪論壇優秀文章,由 gir@ffe 原創,轉載請注明來自看雪社區
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.