We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi All,
Really need help on this one, any suggestions welcome!....
I'm using the CAN bus example program for MCBSTM32C eval board. It has an STM32F107 chip and I am have issues with the CAN Filter....
Does anyone know how to configure the CAN Filter to accept ALL incoming messages?
Thanks
Shane
Haha, yes that would be great because as a default its supposed to accept all messages, Thats what I am trying to do, however i'm having trouble doing that here. Can't seem to turn it off without blocking everything. which is quite the opposite of what i'm looking for...
There supposed to be some functions in ST's OOXX_StdPeriph_Driver Library like:
void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct);
Maybe see this:
my.st.com/.../Flat.aspx
Agree, the documentation is a little confusing. The short answer is that the FilterIDLow and FilterIDHigh as well as MaskIDLow and MaskIDHigh don't correspond exactly to the SID/EID. The bits need to be shifted depending on the type of ID you are trying to filter. It took me several weeks to find the answer on a German website that I used google to translate. Please look at my example code below, hopefully it will be clear then. In this example four filters are created to receive only SID 123, 124, 125 and 126. They don't have to be in order, just happened to be the numbers I picked. For a SID the numbers for the Filter/Mask IDs need to be shifted to the left by 5 bits. CAN_FilterInitStructure.CAN_FilterNumber = 1; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit; // All filters are shifted left 5 bits CAN_FilterInitStructure.CAN_FilterIdHigh = 0x2460; // 0x123 CAN_FilterInitStructure.CAN_FilterIdLow = 0x2480; // 0x124 CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x24A0; // 0x125 CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x24C0; // 0x126 CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure);
typedef struct { uint16_t CAN_FilterIdHigh; /*!< Specifies the filter identification number (MSBs for a 32-bit configuration, first one for a 16-bit configuration). This parameter can be a value between 0x0000 and 0xFFFF */ uint16_t CAN_FilterIdLow; /*!< Specifies the filter identification number (LSBs for a 32-bit configuration, second one for a 16-bit configuration). This parameter can be a value between 0x0000 and 0xFFFF */ uint16_t CAN_FilterMaskIdHigh; /*!< Specifies the filter mask number or identification number, according to the mode (MSBs for a 32-bit configuration, first one for a 16-bit configuration). This parameter can be a value between 0x0000 and 0xFFFF */ uint16_t CAN_FilterMaskIdLow; /*!< Specifies the filter mask number or identification number, according to the mode (LSBs for a 32-bit configuration, second one for a 16-bit configuration). This parameter can be a value between 0x0000 and 0xFFFF */ uint16_t CAN_FilterFIFOAssignment; /*!< Specifies the FIFO (0 or 1) which will be assigned to the filter. This parameter can be a value of @ref CAN_filter_FIFO */ uint8_t CAN_FilterNumber; /*!< Specifies the filter which will be initialized. It ranges from 0 to 13. */ uint8_t CAN_FilterMode; /*!< Specifies the filter mode to be initialized. This parameter can be a value of @ref CAN_filter_mode */ uint8_t CAN_FilterScale; /*!< Specifies the filter scale. This parameter can be a value of @ref CAN_filter_scale */ FunctionalState CAN_FilterActivation; /*!< Enable or disable the filter. This parameter can be set either to ENABLE or DISABLE. */ } CAN_FilterInitTypeDef;
Thank you for your reply John, I'm just getting back to this now so I'll review this and let you know how it goes! Much Appreciated.