不想看书的小伙伴可以直接用。
系统时钟 | 240000000 | 外部晶振8M,120倍频,再4分频 |
CAN时钟 | 40000000 | 6分频 |
u32Prescaler | 20 | CAN位时钟=CAN时钟/u32Prescaler 2000000 = 40000000 / 20 |
u32TimeSeg1 | 15 | 波特率100Khz =CAN位时钟/(u32TimeSeg1+u32TimeSeg2) |
u32TimeSeg2 | 5 | |
u32SJW | 5 | 采样点位置75%=5/(5+15) |
参考代码如下:
static void CanInitConfig(uint8_t chn)
{
stc_can_init_t stcCanInit;
stc_can_filter_config_t astcFilter[CAN_FILTER_NUM] = {
{CAN_FILTER1_ID, CAN_FILTER1_ID_MASK, CAN_FILTER1_ID_TYPE},
{CAN_FILTER2_ID, CAN_FILTER2_ID_MASK, CAN_FILTER2_ID_TYPE},
{CAN_FILTER3_ID, CAN_FILTER3_ID_MASK, CAN_FILTER3_ID_TYPE},
};
/* Initializes CAN. */
(void)CAN_StructInit(&stcCanInit);
stcCanInit.stcBitCfg.u32Prescaler = 20U;//2= 1000K, 4=500K, 8=250, 20 =100K
stcCanInit.stcBitCfg.u32TimeSeg1 = 15U;
stcCanInit.stcBitCfg.u32TimeSeg2 = 5U;
stcCanInit.stcBitCfg.u32SJW = 5U;
stcCanInit.pstcFilter = astcFilter;
stcCanInit.u16FilterSelect = CAN_FILTER_SEL;
stcCanInit.u8WorkMode = CAN_WORK_MD_NORMAL;//正常模式
if (!chn)
{
/* Enable peripheral clock of CAN. */
FCG_Fcg1PeriphClockCmd(CAN1_PERIPH_CLK, ENABLE);
(void)CAN_Init(CAN1_UNIT, &stcCanInit);
/* Enable the interrupts, the status flags can be read. */
CAN_IntCmd(CAN1_UNIT, CAN_INT_ALL, DISABLE);
/* Enalbe the interrupts that needed. */
CAN_IntCmd(CAN1_UNIT, CAN_INT_SEL, ENABLE);
}
else
{
/* Enable peripheral clock of CAN. */
FCG_Fcg1PeriphClockCmd(CAN2_PERIPH_CLK, ENABLE);
(void)CAN_Init(CAN2_UNIT, &stcCanInit);
/* Enable the interrupts, the status flags can be read. */
CAN_IntCmd(CAN2_UNIT, CAN_INT_ALL, DISABLE);
/* Enalbe the interrupts that needed. */
CAN_IntCmd(CAN2_UNIT, CAN_INT_SEL, ENABLE);
}
}