STM32之CAN---配置波特率
位時間特性
為了掌握如何設(shè)置STM32 CAN的波特率,首先我們得先了解一下位時間特性。
位時間特性邏輯通過采樣來監(jiān)視串行的CAN總線,并且通過跟幀起始位的邊沿進行同步,及通過跟后面的邊沿進行重新同步,來調(diào)整其采樣點。
它的操作可以簡單解釋為,如下所述把名義上的每位的時間分為3段:
- 同步段(SYNC_SEG):通常期望位的變化發(fā)生在該時間段內(nèi)。其值固定為1個時間單元(1 x tCAN)。
- 時間段1(BS1):定義采樣點的位置。它包含CAN標(biāo)準(zhǔn)里的PROP_SEG和PHASE_SEG1。其值可以編程為1到16個時間單元,但也可以被自動延長,以補償因為網(wǎng)絡(luò)中不同節(jié)點的頻率差異所造成的相位的正向漂移。
- 時間段2(BS2):定義發(fā)送點的位置。它代表CAN標(biāo)準(zhǔn)里的PHASE_SEG2。其值可以編程為1到8個時間單元,但也可以被自動縮短以補償相位的負向漂移。
- 重新同步跳躍寬度(SJW):定義了在每位中可以延長或縮短多少個時間單元的上限。其值可以編程為1到4個時間單元。
- 有效跳變:被定義為,當(dāng)bxCAN自己沒有發(fā)送隱性位時,從顯性位到隱性位的第1次轉(zhuǎn)變。
如果在時間段1(BS1)而不是在同步段(SYNC_SEG)檢測到有效跳變,那么BS1的時間就被延長最多SJW那么長,從而采樣點被延遲了。相反如果在時間段2(BS2)而不是在SYNC_SEG檢測到有效跳變,那么BS2的時間就被縮短最多SJW那么長,從而采樣點被提前了。為了避免軟件的編程錯誤,對位時間特性寄存器(CAN_BTR)的設(shè)置,只能在bxCAN處于初始化狀態(tài)下進行。
注: 關(guān)于CAN位時間特性和重同步機制的詳細信息,請參考ISO11898標(biāo)準(zhǔn)。

特別注意上圖下方的幾個公式.可以得出的結(jié)論是:
CAN波特率=APB總線頻率/BRP分頻器/(1+tBS1+tBS2)
與CAN波特率有關(guān)的寄存器
CAN位時間特性寄存器 (CAN_BTR)
地址偏移量: 0x1C
復(fù)位值: 0x0123 0000
注: 當(dāng)CAN處于初始化模式時,該寄存器只能由軟件訪問。

| 比特 | 含義 |
|---|---|
| 31 | SILM: 靜默模式(用于調(diào)試) 0: 正常狀態(tài); 1: 靜默模式。 |
| 30 | LBKM: 環(huán)回模式(用于調(diào)試) 0: 禁止環(huán)回模式; 1: 允許環(huán)回模式。 |
| 29:26 | 保留位,硬件強制為0。 |
| 25:24 | SJW[1:0]: 重新同步跳躍寬度 為了重新同步,該位域定義了CAN硬件在每位中可以延長或縮短多少個時間單元的上限。 tRJW = tCAN x (SJW[1:0] + 1)。 |
| 23 | 保留位,硬件強制為0。 |
| 22:20 | TS2[2:0]: 時間段2 該位域定義了時間段2占用了多少個時間單元 tBS2 = tCAN x (TS2[2:0] + 1)。 |
| 19:16 | TS1[3:0]: 時間段1 該位域定義了時間段1占用了多少個時間單元 tBS1 = tCAN x (TS1[3:0] + 1) |
| 15:10 | 保留位,硬件強制其值為0。 |
| 9:0 | BRP[9:0]: 波特率分頻器 該位域定義了時間單元(tq)的時間長度 tq = (BRP[9:0]+1) x tPCLK |
如何在代碼中配置波特率
配置波特率是在CAN模塊初始化時配置,代碼示例如下:
//CAN1 register init
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
//CAN cell init
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = DISABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = ENABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; //tBS1=6個tCAN時鐘周期
CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; //tBS2=8個tCAN時鐘周期
CAN_InitStructure.CAN_Prescaler = 4; //ABP總線時鐘時鐘4分頻
//CANbps= Fpclk/((BRP+1)*((Tseg1+1)+(Tseg2+1)+1)
//所以這里CANbps=APB1總線頻率30000000/4/(8+6+1))=500k bps
//總體配置方向: Tseg1>=Tseg2 Tseg2>=tq; Tseg2>=2TSJW
if (CAN_Init(CAN1,&CAN_InitStructure) == CANINITFAILED)
{
return _ERROR;
}
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);//打開FMP0中斷
總體配置保持tBS1>=tBS2 tBS2>=1個CAN時鐘周期 tBS2>=2tSJW
STM32的CAN波特率計算
波特率=APB1Clock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler
(PS:CAN_SJW表示重新同步跳躍寬度,不參與波特率的計算,其值可以編程為1到4個時間單元,表示該總線對波特率范圍的容差度。公式中1表示同步段固定為一個單位時間。)
例如:
APB1Clock=36Mhz,CAN_BS1=3,CAN_BS2=5,CAN_Prescaler=32
36000k/9/32=125k/s
另外,盡可能地把采樣點設(shè)置為CiA推薦的值:
| CiA | 波特率 |
|---|---|
| 75% | >800K |
| 80% | >500K |
| 87.5% | <=500K |
CiA計算方式:(1+CAN_BS1)/(1+CAN_BS1+CAN_BS2)
采樣點設(shè)置的影響:采樣點設(shè)置的符合表格中的范圍,CAN通信 會更穩(wěn)定。
The CAN bit comprises – depending on the configured “atomic” time unit called time quantum (tq) – multiple of these time quanta. The time quanta length derives from the bit-rate prescaler and the used oscillator frequency.
The CAN bit is logically divided into four segments. The synchronization segment has always a length of 1 tq. The following propagation segment and phase-segment 1 are not distinguishable for the user. It is configured as one value. The forth part is the phase-segment 2. Between the two phase-segments, the sample-point is located. If the bit-timing settings move the sample-point to the end of the bit, the propagation segment is enlarged, so that you can realize longer networks. If the sample-point is configured in the other direction, the re-synchronization capability is increased.
The sample point should be the same in all connected CAN nodes. However, in practice it is sufficient if the sample points don't vary too much. The automotive industry has specified some recommendations for the bit timing settings in the SAE J2284 series. For CANopen networks, the recommendations given in CiA 301 should be used. The sample points should be at 87,5 percent of the bit time. For most of the specified bit-rates a range of 85 percent to 90 percent is allowed. Of course, the larger the tolerance range, the shorter the maximum possible length of the network。
CAN位時間組成 取決于配置的“原子”時間單位稱為時間量子(tq) - 這些時間量子的倍數(shù)。時間量程長度來自比特率預(yù)分頻器和使用的振蕩器頻率。
CAN位時間邏輯上分為四個段。同步段總是長度為1 tq。后面的傳播段和相位段1對于用戶是不可區(qū)分的。它被配置為一個值。第四部分是相位段2.在兩個相位段之間,定位采樣點。如果位定時設(shè)置將采樣點移動到位的結(jié)尾,則傳播段被放大,以便可以實現(xiàn)更長的網(wǎng)絡(luò)。如果采樣點在另一個方向配置,則重新同步功能會增加。
所有連接的CAN節(jié)點的采樣點應(yīng)該相同。然而,在實踐中,如果采樣點區(qū)別不大就足夠了。汽車行業(yè)為SAE J2284系列中的位定時設(shè)置指定了一些建議。對于CANopen網(wǎng)絡(luò),應(yīng)使用CiA 301中給出的建議,采樣點應(yīng)為位時間的87.5%。對于大多數(shù)指定的比特率,允許85%至90%的范圍。當(dāng)然,公差范圍越大,網(wǎng)絡(luò)的最大可能長度越短。