案例1:某工程师使用STM32F407VG开发产品,在做CAN的调试过程中发现,CAN1接收、CAN2发送,工作正常。但反过来就有问题,即CAN2收,CAN1发就无法正常接收。
后来发现CAN 过滤器配置的地方有问题。他使用STM32Cube固件库,两句关键代码如下:
sFilterConfig.FilterNumber = m; //……【1】
sFilterConfig.BankNumber = n; //……【2】
第【1】句代码就是选择某过滤器组进行初始化并配置接收过滤器。对于双CAN产品,m的值为0到27。对于单CAN产品而言,m的值为0~13。
第【2】句代码针对双CAN的STM32产品,配置CAN2可使用的过滤器组的起始编号,n取值范围为0~28.从编号为n的过滤器组到编号为27的过滤器组分配给CAN2使用。通过配置寄存器CAN2SB[5:0]@CAN_FRM确定。如果第【2】句配置不在代码中明确写出来,默认值就是14. 即硬件默认将编号为14起往后的过滤器组分配给CAN2使用。
void CanBus_Config(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
/* CAN register init */
// CAN_DeInit();
/* CAN1 and CAN2 register init */
CAN_DeInit(CAN1);
CAN_DeInit(CAN2);
/* Struct init*/
CAN_StructInit(&CAN_InitStructure);
/*************************************************************
主机CAN配置
*************************************************************/
/* CAN cell init */
CAN_InitStructure.CAN_TTCM = DISABLE; //禁止时间触发通信模式
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = DISABLE;
//CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失)
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_10tq; //1--16
CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq; //1--8
CAN_InitStructure.CAN_Prescaler = 4;//8 波特率=Fpclk1/(sjw+bs1+bs2)/pre
(pclk1/((1+8+7)*16)) = 36Mhz/16/4 = 500Kbits
//CAN_Init(&CAN_InitStructure);
/*Initializes the CAN1 and CAN2 */
CAN_Init(CAN1, &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报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失)
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_10tq; //1--16
CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq; //1--8
CAN_InitStructure.CAN_Prescaler =4;//4:500k//8 :250K//16:125K 波特率=Fpclk1/(sjw+bs1+bs2)/pre
(pclk1/((1+8+7)*16)) = 36Mhz/16/4= 500Kbits
CAN_Init(CAN2, &CAN_InitStructure);
#if 1
CAN_FilterInitStructure.CAN_FilterNumber = 1; //选择过滤器0~13 for one can register
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;//IdList mode or IdMask mode
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;//16bits or 32bits
CAN_FilterInitStructure.CAN_FilterIdHigh = AUD_A4L_CAN_Light_Mode_STD_ID << 5;
CAN_FilterInitStructure.CAN_FilterIdLow =AUD_A4L_CAN_Lightness_And_CD_ONOFF_STD_ID << 5; //
//CAN_FilterInitStructure.CAN_FilterMaskIdHigh = CAN_ID_STD;
//CAN_FilterInitStructure.CAN_FilterMaskIdLow = CAN_ID_STD;
CAN_FilterInitStructure.CAN