CAN总线 标准帧/扩展帧滤波器设置

        在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据标识符(CAN ID)的值决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。
         为满足这一需求,bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组(13~0),以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。

//标准帧
T_CAN_Filter gtCan1Filter[] =
{{0,(0x305 << 21), (0x07FF << 21)},}; //ID = 0x305
//扩展帧
T_CAN_Filter gtCan1Filter[] =        
{{0, (0x0000FF00 << 3), (0x0000FF00 << 3)},};// ID = 0xFF
#define CAN_FILTER_NUM    (sizeof(gtCan1Filter)   / sizeof(gtCan1Filter[0]))

for(; uIndex < CAN1_FILTER_NUM; uIndex++)
{
    CAN_FilterInitStructure.CAN_FilterNumber = gtCan1Filter[uIndex].uFilterNumber;
    CAN_FilterInitStructure.CAN_FilterMode   = CAN_FilterMode_IdMask;
    CAN_FilterInitStructure.CAN_FilterScale         = CAN_FilterScale_32bit;
    CAN_FilterInitStructure.CAN_FilterIdHigh       = gtCan1Filter[uIndex].uFilterId>> 16;
    CAN_FilterInitStructure.CAN_FilterIdLow           = gtCan1Filter[uIndex].uFilterId;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = gtCan1Filter[uIndex].uFilterMaskId>> 16;
    CAN_FilterInitStructure.CAN_FilterMaskIdLow       = gtCan1Filter[uIndex].uFilterMaskId;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment  = CAN_Filter_FIFO0;
    CAN_FilterInitStructure.CAN_FilterActivation      = ENABLE;
    CAN_FilterInit(&CAN_FilterInitStructure);
}