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);
}