CAN位時間特性暫存器 (CAN_BTR)
地址偏移量: 0x1C
復位值: 0x0123 0000
注: 當CAN處於初始化模式時,該暫存器只能由軟體訪問。
圖2
位31 SILM: 靜默模式(用於除錯)
0: 正常狀態;
1: 靜默模式。
位30 LBKM: 環回模式(用於除錯)
0: 禁止環回模式;
1: 允許環回模式。
位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
3 如何在程式碼中配置波特率
配置波特率是在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=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
CAN位時間特性暫存器 (CAN_BTR)
地址偏移量: 0x1C
復位值: 0x0123 0000
注: 當CAN處於初始化模式時,該暫存器只能由軟體訪問。
圖2
位31 SILM: 靜默模式(用於除錯)
0: 正常狀態;
1: 靜默模式。
位30 LBKM: 環回模式(用於除錯)
0: 禁止環回模式;
1: 允許環回模式。
位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
3 如何在程式碼中配置波特率
配置波特率是在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=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