CAN總線波特率計算及設置方法(STM32,SJA1000,LPC2292)
1.1 位周期的組成
本文引用地址:http://www.104case.com/article/201611/319141.htm波特率(fbit)是指單位時間內所傳輸的數據位的數量,一般取單位時間為1s。波特率由通信線上傳輸的一個數據位周期的長度(Tbit)決定,如下式所示。
Fbit=1/Tbit (1)
根據Philips公司的獨立通信控制器,一個位周期由3個部分組成:同步段(tSYNC_SEG)、相位緩沖段1(tTSEG1)和相位緩沖段2(tTSEG2)。
Tbit=tSYNC_SEG+tTSEG1+tTSEG2 (2)
所有這些時間段,都有一個共同的時間單元——系統時鐘周期(TSCL)。具體到SJA1000,TSCL由總線時序寄存器的值來確定。 SJA1000有2個總線時序寄存器,即總線時序寄存器0(BTR0)和總線時序寄存器1(BTR1)。這2個寄存器有自己不同的功能定義,共同作用決定總線的通信波特率。
總線時序寄存器0 定義波特率預設值BRP(共6位,取值區間[1,64]和同步跳轉寬度SJW(共2位,取值區間[1,4])的值。位功能說明如表1所列。
表1
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
SJW.1 | SJW.0 | BRP.5 | BRP.4 | BRP.3 | BRP.2 | BRP.1 | BRP.0 |
CAN的系統時鐘周期TSCL,可以由BRP的數值為決定,計算公式如下:
TSCL=2TCLK×BRP=2TCLK×(32BRP.5+16BRP.4+
8BRP.3+4BRP.2+2BRP.1+1BRP.0+1) (3)
其中TCLK為參考時間的周期。
TCLK=1/fCLK (4)
為了補償不同總線控制器的時鐘振蕩器之間的相位偏移,任何總線控制器必須在當前傳送的相關信號邊沿重新同步。同步跳轉寬度定義了每一位周期可以被重新同步縮短或延長的時鐘周期的最大數目。
tSJW=TSCL×(2×SJW.1+1×SJW.0+1) (5)
總線時序寄存器1 定義每個位周期長度采樣點的位置和在每個采樣點的采樣數目。位功能說明如表2所列,其中SAM意義見表3。
表2
bit | bit | bit | bit | bit | bit | bit | bit |
SAM | TSEG2.2 | TSEG2.1 | TSEG2.0 | TSEG1.3 | TSEG1.2 | TSEG1.1 | TSEG1.0 |
表3
SAM | 三倍:總線采樣三次:建議在中/低速總線(A和B級)使用,有處于過濾總線上毛刺 | |
單倍:總線采樣一次;建議使用在高速總線上(SAEC級) |
TSEG1(共4位,取值區間[1,16])和TSEG2(共3位,取值區間[1,8])決定了每一位時鐘數目和采樣點的位置。這里
tSYNC_SEG=1×TSCL(此時間段固定) (6)
tTSEG1=TSCL×(8×TSEG1.3+4×TSEG1.2+2×TSEG1.1+1×TESG1.0+1) (7)
tTSEG2=TSCL×(4×TSEG2.2+2×TSEG2.1+1×TESG2.0+1) (8)
位周期的標量值(NBT)定義為,SYNC_SEG(同步段系統時鐘周期數)、TSEG1(相位緩沖段1系統時鐘周期數)、TSEG2(相位緩沖段2系統時鐘周期數)之和。這決定了它的取值區間為[3,25],在1個取樣點時,最小值一般取4;在3個取樣點時,最小值一般取5。
NBT=Tbit/TSCL=SYNC_SEG+TSEG1+TSEG2 (9)
位周期的一般結構如圖1所示。
其實CAN的波特率計算特簡單,只是我們無意識地把簡單的問題復雜化了。
假設我們先不考慮BTR0中的SJW位和BTR1中的SAM位。那么,BTR0和BTR1就是2個分頻系數寄存器;它們的乘積是一個擴展的分頻系數。即:
BTR0×BTR1=F_BASE/Fbps (1)
其中:
內部頻率基準源F_BASE = Fclk/2,即外部晶振頻率Fclk的2分頻。注意任何應用中,當利用外部晶振作為基準源的時候,都是先經過2分頻整形的。
(1)式中,當晶振為16M時,F_BASE=8000K
當晶振為12M時,F_BASE=6000K
Fbps就是我們所希望得到的CAN總線頻率。單位為K。
設(1)式中BTR0=m,BTR1=n,外部晶振16M,則有:
m • n =8000/ Fbps (2)
這樣,當Fbps取我們希望的值時,就會得到一個m * n的組合值。當n選定,m值也唯一。
n值CAN規范中規定8~25。(也就是BTR1的值)基本原則為:Fbps值越高時,選取n(通過設置BTR1)值越大。其原因不難理解。
我假定一般應用中選取n=10,也就是:
同步段+相位緩沖段1+相位緩沖段2 =1+5+4
則(2)式簡化為
m=800/Fbps
m的最大設置值為64,SJA1000最大分頻系數m*n=64x25=1600。因此標準算法中通常以16M晶振為例。其實有了公式(1),任何晶振值(6M~24M)都很容易計算。
SAM的確定:低頻時,選SAM=1,即采樣3次。高頻100K以上時,取SAM=0,即采樣1次。
SJA重同步跳寬選取: 與數字鎖相環技術有關。n值選得大時,SJA可以選得大,即一次可以修正多個脈沖份額Tscl。n值小或頻率低時,選SJA=1。即BTR0.7和BTR0.6都設為0。
問題: 1、SJA1000中,BTR1中相位緩沖段1為什么設計的比相位緩沖段2大8個Tscl ?按道理應該一樣才對。
2、下例BTR0和BTR1的設置有什么問題?
BTR0=0x40, BTR1=0x1C。
參數說明: CAN_ByteRate 波特率(Kbit/s) BTR0
:*
;*
;*
;*
;*
;*
;*
;*
;*
;*
;*
;*
;*
;*
;*
評論