I am using the STM32F4Discovery kit to build a simple CAN interface. I managed to configure it so I can transmit CAN messages, however, I am stuck at receiving them. As far so I know, to receive a CAN message, it has to pass acceptance filters. I would like to set the filter to accept all (standard, 2.0A) messages from ID 0x700 to 0x7FF. How do I do this?
I've read the reference manual, but I have no idea how to actually configure the filtering.
void CAN_FilterConfiguration(void) {
CAN_FilterInitTypeDef CAN_FilterInitStructure;
/* CAN2 filter configuration */
CAN_FilterInitStructure.CAN_FilterNumber = 1; // filter number = 1 (0<=x<=13)
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0; // FIFO = 0
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
}
Filters are working in List or Mask mode. They can be 32 bit or 16 bit. You can have 32 filters, but 0-13 are assigned to CAN1 and 14+ are for CAN2.
In one filter there is one 32-bit filter or two 16-bit filters
This is the way to make a tested word. In mask mode the CAN accepts when TESTED & MASK == ID. In list mode CAN accepts when TESTED == ID or MASK == ID. There are two filters in 16 bit and one filter in 32 bit - when ID = IDHigh << 16 | IDLow (and same way to join mask).
More information on DM0090 link