STM CAN filter配置纪要

案例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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值