CAN總線波特率計(jì)算及設(shè)置方法(STM32,SJA1000,LPC2292)
1.1 位周期的組成
本文引用地址:http://butianyuan.cn/article/201611/319141.htm波特率(fbit)是指單位時間內(nèi)所傳輸?shù)臄?shù)據(jù)位的數(shù)量,一般取單位時間為1s。波特率由通信線上傳輸?shù)囊粋€數(shù)據(jù)位周期的長度(Tbit)決定,如下式所示。
Fbit=1/Tbit ?。?)
根據(jù)Philips公司的獨(dú)立通信控制器,一個位周期由3個部分組成:同步段(tSYNC_SEG)、相位緩沖段1(tTSEG1)和相位緩沖段2(tTSEG2)。
Tbit=tSYNC_SEG+tTSEG1+tTSEG2 (2)
所有這些時間段,都有一個共同的時間單元——系統(tǒng)時鐘周期(TSCL)。具體到SJA1000,TSCL由總線時序寄存器的值來確定。 SJA1000有2個總線時序寄存器,即總線時序寄存器0(BTR0)和總線時序寄存器1(BTR1)。這2個寄存器有自己不同的功能定義,共同作用決定總線的通信波特率。
總線時序寄存器0 定義波特率預(yù)設(shè)值BRP(共6位,取值區(qū)間[1,64]和同步跳轉(zhuǎn)寬度SJW(共2位,取值區(qū)間[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的系統(tǒng)時鐘周期TSCL,可以由BRP的數(shù)值為決定,計(jì)算公式如下:
TSCL=2TCLK×BRP=2TCLK×(32BRP.5+16BRP.4+
8BRP.3+4BRP.2+2BRP.1+1BRP.0+1) ?。?)
其中TCLK為參考時間的周期。
TCLK=1/fCLK ?。?)
為了補(bǔ)償不同總線控制器的時鐘振蕩器之間的相位偏移,任何總線控制器必須在當(dāng)前傳送的相關(guān)信號邊沿重新同步。同步跳轉(zhuǎn)寬度定義了每一位周期可以被重新同步縮短或延長的時鐘周期的最大數(shù)目。
tSJW=TSCL×(2×SJW.1+1×SJW.0+1)?。?)
總線時序寄存器1 定義每個位周期長度采樣點(diǎn)的位置和在每個采樣點(diǎn)的采樣數(shù)目。位功能說明如表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位,取值區(qū)間[1,16])和TSEG2(共3位,取值區(qū)間[1,8])決定了每一位時鐘數(shù)目和采樣點(diǎn)的位置。這里
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)
位周期的標(biāo)量值(NBT)定義為,SYNC_SEG(同步段系統(tǒng)時鐘周期數(shù))、TSEG1(相位緩沖段1系統(tǒng)時鐘周期數(shù))、TSEG2(相位緩沖段2系統(tǒng)時鐘周期數(shù))之和。這決定了它的取值區(qū)間為[3,25],在1個取樣點(diǎn)時,最小值一般取4;在3個取樣點(diǎn)時,最小值一般取5。
NBT=Tbit/TSCL=SYNC_SEG+TSEG1+TSEG2 (9)
位周期的一般結(jié)構(gòu)如圖1所示。
其實(shí)CAN的波特率計(jì)算特簡單,只是我們無意識地把簡單的問題復(fù)雜化了。
假設(shè)我們先不考慮BTR0中的SJW位和BTR1中的SAM位。那么,BTR0和BTR1就是2個分頻系數(shù)寄存器;它們的乘積是一個擴(kuò)展的分頻系數(shù)。即:
BTR0×BTR1=F_BASE/Fbps (1)
其中:
內(nèi)部頻率基準(zhǔn)源F_BASE = Fclk/2,即外部晶振頻率Fclk的2分頻。注意任何應(yīng)用中,當(dāng)利用外部晶振作為基準(zhǔn)源的時候,都是先經(jīng)過2分頻整形的。
?。?)式中,當(dāng)晶振為16M時,F(xiàn)_BASE=8000K
當(dāng)晶振為12M時,F(xiàn)_BASE=6000K
Fbps就是我們所希望得到的CAN總線頻率。單位為K。
設(shè)(1)式中BTR0=m,BTR1=n,外部晶振16M,則有:
m • n =8000/ Fbps (2)
這樣,當(dāng)Fbps取我們希望的值時,就會得到一個m * n的組合值。當(dāng)n選定,m值也唯一。
n值CAN規(guī)范中規(guī)定8~25。(也就是BTR1的值)基本原則為:Fbps值越高時,選取n(通過設(shè)置BTR1)值越大。其原因不難理解。
我假定一般應(yīng)用中選取n=10,也就是:
同步段+相位緩沖段1+相位緩沖段2 =1+5+4
則(2)式簡化為
m=800/Fbps
m的最大設(shè)置值為64,SJA1000最大分頻系數(shù)m*n=64x25=1600。因此標(biāo)準(zhǔn)算法中通常以16M晶振為例。其實(shí)有了公式(1),任何晶振值(6M~24M)都很容易計(jì)算。
SAM的確定:低頻時,選SAM=1,即采樣3次。高頻100K以上時,取SAM=0,即采樣1次。
SJA重同步跳寬選取: 與數(shù)字鎖相環(huán)技術(shù)有關(guān)。n值選得大時,SJA可以選得大,即一次可以修正多個脈沖份額Tscl。n值小或頻率低時,選SJA=1。即BTR0.7和BTR0.6都設(shè)為0。
問題: 1、SJA1000中,BTR1中相位緩沖段1為什么設(shè)計(jì)的比相位緩沖段2大8個Tscl ?按道理應(yīng)該一樣才對。
2、下例BTR0和BTR1的設(shè)置有什么問題?
BTR0=0x40, BTR1=0x1C。
參數(shù)說明: CAN_ByteRate 波特率(Kbit/s) BTR0
:*
;*
;*
;*
;*
;*
;*
;*
;*
;*
;*
;*
;*
;*
;*
評論