1. 程式人生 > 其它 >CAN匯流排波特率計算方法(AHB:72MHz/APB1:36MHz)CAN外設掛載在APB1 上

CAN匯流排波特率計算方法(AHB:72MHz/APB1:36MHz)CAN外設掛載在APB1 上

CAN位時序(波特率計算方法)總結

Q 時間量子數
QT 時間量子
SS 同步段
TPS 傳播時間段
Tpbs1 相位緩衝段1
Tpbs2 相位緩衝段2
TBS1 Tpbs1 + TPS //因為程式設計時ST庫中的結構體把Tpbs1和TPS加在一起作為TBS1
BRP CAN的預分頻係數
FCLK CAN掛載匯流排時鐘
Baudrate 想要的CAN波特率

Q * BRP(未知)=FCLK / Baudrate(已知)
Q = TBS1 (Tpbs1+TPS) + Tpbs2+SS (1QT)
取樣點 = (TBS1 + SS) / Q

注:取樣點最好在80%左右(500K---80%),波特率增大比例降低,CIA推薦取樣點85%-90%。
期望在SS段切換電平,若電平切換提前則增長PBS1段,若電平切換延後則縮短上一幀的PBS2。

2022年3月9日20:50:54

幀格式

RTR 0是資料幀,1是遙控幀
IDE 0是標準幀,1是擴充套件幀
R0和R1 接收位(保留位),預設顯性電平
一位顯性電平0起始,7位隱性電平1結束

 

bxCAN :擴充套件的基本模式CAN

SOF :幀起始

標準識別符號:11

擴充套件識別符號:29

FIFO:先入先出儲存器,有六個腳分別是讀使能、寫使能、資料入、資料出、FIFO滿、FIFO空。

CAN2 的開始濾波器編號 n 是通過寫入CAN FMR 暫存器的 CAN2SB[5:0]配置的。

 

 

BxCAN模式

工作模式

初始化模式

INRQ:軟置一入

INAK:硬一,入成功

ACK:硬一,請求入的響應

正常模式

SYNC:硬檢測11連隱(匯流排空閒),可入正常

睡眠模式

SLEEP:軟置一入

SLAK:硬一,入成功

ACK:硬一,請求入的響應

AWUM=1則硬體檢測匯流排活動硬體將SLEEP0入正常(AWUM硬體喚醒允許位)

總結:!SLEEP+INRQ+SYNC(硬)則入正常,SLEEP+INRQ+ACK(硬)則入睡眠,!SLEEP+INRQ+ACK(硬)則入初始化。

測試模式

迴環模式

CAN_BTR_LBKM=1入迴環,可發不可收,有迴環,RX

靜默模式

CAN_BTR_SILM=1入靜默,可收不可發,有迴環,TX

迴環靜默模式

 

CAN_BTR_SILM=1&&

CAN_BTR_LBKM=1入,不可收不可發,有迴環,RXTX

 

 

傳送流程

 

有三個郵箱,兩個3級深度接收FIFO(一個郵箱存一報文,一級深度存一個報文)

 

  1. 選擇一個空的郵箱把報文ID、資料長度、資料放進去(software
  2. CAN_TIXR_TXRQ = 1,傳送請求(software
  3. 郵箱掛號,等待成為最高優先順序(hardware
  4. 成為最高優先順序,預定(hardware
  5. CANBus空閒(11連隱)傳送,郵箱空(hardware
  6. -------------------------------------------------------------------------------------------------------
  7. 傳送成功RQCP&&TXOK = 1RQCP只要流程執行完就為1(不管成功失敗),TXOK只有成功傳送才為1。(hardware
  8. 若匯流排仲裁引發失敗:CAN_TSR_ALST = 1(可設定自動重發)
  9. 若傳送錯誤引起失敗:CAN_TSR_TERP = 1(可設定自動重發)
  10. 傳送優先順序:CAN_MCR_TXFP = 0ID小的先發,ID相同低郵箱先發
  11. 傳送優先順序:CAN_MCR_TXFP = 1,位FIFO模式郵箱,先放入郵箱的先發出
  12. 郵箱空標誌位:TME = 1,郵箱空(hardware
  13. 終止傳送請求:ABRQ = 1,若郵箱處於掛號或預定狀態則直接清空郵箱TXOK = 0RQCP =1,若郵箱處於傳送狀態並且傳送成功則TXOK = 1RQCP =1,自動清空郵箱。不管怎樣只要將中止位置1,郵箱都會被清空。
  14. 自動重傳:NART = 1(禁止自動重傳)
  15. 接收郵箱空標誌:FOVR = 0為空,FOVR = 1為郵箱中存在有效報文。

    接收報文數量標誌位:CAN_RFR_FMP[1:0]中儲存接收郵箱中報文數量。

    郵箱釋放標誌:RFOM = 1釋放最深處的郵箱。

    禁用FIFO鎖定:CAN_MCR_RFLM = 0,引發溢位的那條訊息會覆蓋最後接受的訊息。

    啟用FIFO鎖定:CAN_MCR_RFLM = 0,引發溢位的那條訊息會被丟棄。