STM32CAN相关
一.两路CAN配置注意事项
双CAN如图所示,因此配置CAN2时,一定要先开启CAN1的时钟[否则CAN2可以发送不能接收]
1.时钟配置
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); //先开CAN1时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE); //再开启CAN2时钟
2.过滤器配置
//stm32f10x_can.h 中描述
uint8_t CAN_FilterNumber; /*!< Specifies the filter which will be initialized. It ranges from 0 to 13. */
此处应为单CAN的过滤器,双路CAN为0-27
因此配置CAN2的过滤器为14-27[测试设置0-13无法收发]
2.CAN过滤器配置
首先吐槽一下这个过滤器只能设置自己需要的ID,不能设置自己不想要的ID
目前用的是32标识符屏蔽,所以目前只提标识符屏蔽的使用
假设我要接收ID中第二个字节F0-F7的扩展数据帧如图所示进行配置
CAN_FilterIdHigh的ID左移3位是为了与图片中ID位对应[扩展帧ID共29位]
CAN_FilterIdLow用于接收扩展帧和数据帧的值分别为0x04 0x01 对应库函数中CAN_ID_EXT 和CAN_RTR_DATA的值
CAN_FilterMaskIdHigh的值表示对应位为1时CAN_FxR1必须对应才能收到数据,为0的位表示不关心该位情况
CAN_FilterInitStructure.CAN_FilterNumber = 14; /* 过滤器14 双CAN0-27 */
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; /* 屏敝模式 */
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; /* 32位 */
CAN_FilterInitStructure.CAN_FilterIdHigh= ((0x0000F000<<3)&0xFFFF0000)>>16; //0X0000f0000
CAN_FilterInitStructure.CAN_FilterIdLow=((0x0000F000<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; //F000
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=((0x0000F800<<3)&0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=((0x0000F800<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; //F800
3.关于接收中断及FIFO
假设CAN1使用FIFO0
相关配置如下
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
void CAN1_RX0_IRQHandler(void)
假设CAN1使用FIFO1
相关配置和使用函数如下
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO1;
CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE);
void CAN1_RX1_IRQHandler(void)