楼下附上自己配置的过程
void CAN2_Init(u8 NvicPP,u8 NvicSP)
{
GPIO_InitTypeDef gpio;
CAN_InitTypeDef can;
CAN_FilterInitTypeDef filter;
NVIC_InitTypeDef nvic;
/*时钟使能*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //使能GPIOB时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE); //使能CAN2时钟
/*IO初始化*/
gpio.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13; //B12,B13
gpio.GPIO_Mode = GPIO_Mode_AF; //复用模式
gpio.GPIO_OType = GPIO_OType_PP; //推挽输出
gpio.GPIO_PuPd = GPIO_PuPd_UP; //上拉
gpio.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
GPIO_Init(GPIOB,&gpio);
/*CAN的RX和TX复用*/
GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_CAN2); //PB12 复用为 CAN2
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_CAN2); //PB13 复用为 CAN2
/*CAN模式设置*/
can.CAN_TTCM = DISABLE; //时间触发的通信模式关闭
can.CAN_ABOM = DISABLE; //自动的总线关闭管理失能
can.CAN_AWUM = DISABLE; //自动唤醒模式关闭
can.CAN_NART = DISABLE; //禁止自动发送
can.CAN_RFLM = DISABLE; //禁止接受FIFO锁定
can.CAN_TXFP = ENABLE; //发送的优先级完全由时间顺序来确定
can.CAN_Mode = CAN_Mode_Normal; //普通模式
/*波特率设置(bund = 42/(1+9+4)/3) = 1Mhz*/
can.CAN_SJW = CAN_SJW_1tq; //再同步补偿宽度为1
can.CAN_BS1 = CAN_BS1_9tq; //时间段1长度为9
can.CAN_BS2 = CAN_BS2_4tq; //时间段2长度为4
can.CAN_Prescaler = 3; //分频系数为3
CAN_Init(CAN2,&can);
filter.CAN_FilterNumber=1; //过滤器14
filter.CAN_FilterMode=CAN_FilterMode_IdMask;
filter.CAN_FilterScale=CAN_FilterScale_32bit; //32位
filter.CAN_FilterIdHigh=0x0000; //32位ID
filter.CAN_FilterIdLow=0x0000;
filter.CAN_FilterMaskIdHigh=0x0000;
filter.CAN_FilterMaskIdLow=0x0000; //32位全为不必匹配
filter.CAN_FilterFIFOAssignment=CAN_Filter_FIFO1; //过滤器连FIFO0
filter.CAN_FilterActivation=ENABLE; //激活过滤器14
CAN_FilterInit(&filter); //滤波器初始化
CAN_SlaveStartBank(1);
/*CAN中断使能*/
nvic.NVIC_IRQChannel = CAN2_RX1_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority = NvicPP;
nvic.NVIC_IRQChannelSubPriority = NvicSP;
nvic.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic);
/*can receive and transmit config*/
CAN_ITConfig(CAN2, CAN_IT_FMP1, ENABLE);
CAN_ClearITPendingBit(CAN2, CAN_IT_FMP1);
}
|