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