Skip to content

Commit

Permalink
Add possibility to specify ID format for filters.
Browse files Browse the repository at this point in the history
Fixes #30
  • Loading branch information
pazi88 committed Mar 27, 2024
1 parent aefb1b9 commit da25799
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 14 deletions.
16 changes: 8 additions & 8 deletions STM32_CAN.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ bool STM32_CAN::read(CAN_message_t &CAN_rx_msg)
return ret;
}

bool STM32_CAN::setFilter(uint8_t bank_num, uint32_t filter_id, uint32_t mask, uint32_t filter_mode, uint32_t filter_scale, uint32_t fifo)
bool STM32_CAN::setFilter(uint8_t bank_num, uint32_t filter_id, uint32_t mask, IDE std_ext, uint32_t filter_mode, uint32_t filter_scale, uint32_t fifo)
{
CAN_FilterTypeDef sFilterConfig;

Expand All @@ -350,7 +350,7 @@ bool STM32_CAN::setFilter(uint8_t bank_num, uint32_t filter_id, uint32_t mask, u
sFilterConfig.FilterFIFOAssignment = fifo;
sFilterConfig.FilterActivation = ENABLE;

if (filter_id <= 0x7FF)
if (std_ext == STD || (std_ext == AUTO && filter_id <= 0x7FF))
{
// Standard ID can be only 11 bits long
sFilterConfig.FilterIdHigh = (uint16_t) (filter_id << 5);
Expand Down Expand Up @@ -408,22 +408,22 @@ void STM32_CAN::setMBFilter(CAN_FLTEN input)
}
}

bool STM32_CAN::setMBFilterProcessing(CAN_BANK bank_num, uint32_t filter_id, uint32_t mask)
bool STM32_CAN::setMBFilterProcessing(CAN_BANK bank_num, uint32_t filter_id, uint32_t mask, IDE std_ext)
{
// just convert the MB number enum to bank number.
return setFilter(uint8_t(bank_num), filter_id, mask);
return setFilter(uint8_t(bank_num), filter_id, mask, std_ext);
}

bool STM32_CAN::setMBFilter(CAN_BANK bank_num, uint32_t id1)
bool STM32_CAN::setMBFilter(CAN_BANK bank_num, uint32_t id1, IDE std_ext)
{
// by setting the mask to 0x1FFFFFFF we only filter the ID set as Filter ID.
return setFilter(uint8_t(bank_num), id1, 0x1FFFFFFF);
return setFilter(uint8_t(bank_num), id1, 0x1FFFFFFF, std_ext);
}

bool STM32_CAN::setMBFilter(CAN_BANK bank_num, uint32_t id1, uint32_t id2)
bool STM32_CAN::setMBFilter(CAN_BANK bank_num, uint32_t id1, uint32_t id2, IDE std_ext)
{
// if we set the filter mode as IDLIST, the mask becomes filter ID too. So we can filter two totally independent IDs in same bank.
return setFilter(uint8_t(bank_num), id1, id2, CAN_FILTERMODE_IDLIST);
return setFilter(uint8_t(bank_num), id1, id2, AUTO, CAN_FILTERMODE_IDLIST, std_ext);
}

// TBD, do this using "setFilter" -function
Expand Down
14 changes: 10 additions & 4 deletions STM32_CAN.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,12 @@ typedef enum CAN_FLTEN {
REJECT_ALL = 1
} CAN_FLTEN;

typedef enum IDE {
STD = 0,
EXT = 1,
AUTO = 2
} IDE;

class STM32_CAN {

public:
Expand All @@ -142,13 +148,13 @@ class STM32_CAN {
bool write(CAN_message_t &CAN_tx_msg, bool sendMB = false);
bool read(CAN_message_t &CAN_rx_msg);
// Manually set STM32 filter bank parameters
bool setFilter(uint8_t bank_num, uint32_t filter_id, uint32_t mask, uint32_t filter_mode = CAN_FILTERMODE_IDMASK, uint32_t filter_scale = CAN_FILTERSCALE_32BIT, uint32_t fifo = CAN_FILTER_FIFO0);
bool setFilter(uint8_t bank_num, uint32_t filter_id, uint32_t mask, IDE = AUTO, uint32_t filter_mode = CAN_FILTERMODE_IDMASK, uint32_t filter_scale = CAN_FILTERSCALE_32BIT, uint32_t fifo = CAN_FILTER_FIFO0);
// Teensy FlexCAN style "set filter" -functions
bool setMBFilterProcessing(CAN_BANK bank_num, uint32_t filter_id, uint32_t mask);
bool setMBFilterProcessing(CAN_BANK bank_num, uint32_t filter_id, uint32_t mask, IDE = AUTO);
void setMBFilter(CAN_FLTEN input); /* enable/disable traffic for all MBs (for individual masking) */
void setMBFilter(CAN_BANK bank_num, CAN_FLTEN input); /* set specific MB to accept/deny traffic */
bool setMBFilter(CAN_BANK bank_num, uint32_t id1); /* input 1 ID to be filtered */
bool setMBFilter(CAN_BANK bank_num, uint32_t id1, uint32_t id2); /* input 2 ID's to be filtered */
bool setMBFilter(CAN_BANK bank_num, uint32_t id1, IDE = AUTO); /* input 1 ID to be filtered */
bool setMBFilter(CAN_BANK bank_num, uint32_t id1, uint32_t id2, IDE = AUTO); /* input 2 ID's to be filtered */

void enableLoopBack(bool yes = 1);
void enableSilentMode(bool yes = 1);
Expand Down
5 changes: 3 additions & 2 deletions examples/Read-Write_with_filters/Read-Write_with_filters.ino
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,9 @@ void setup(){
Can.setBaudRate(500000);
Can.setMBFilterProcessing( MB0, 0x153, 0x1FFFFFFF );
Can.setMBFilterProcessing( MB1, 0x613, 0x1FFFFFFF );
Can.setMBFilterProcessing( MB2, 0x615, 0x1FFFFFFF );
Can.setMBFilterProcessing( MB3, 0x1F0, 0x1FFFFFFF );
// You can also set that is the ID Standard or Extended
Can.setMBFilterProcessing( MB2, 0x615, 0x1FFFFFFF, STD );
Can.setMBFilterProcessing( MB3, 0x1F0, 0x1FFFFFFF, EXT );

// We set the data that is static for the three different message structs once here.
CAN_outMsg_1.id = (0x1A5);
Expand Down

0 comments on commit da25799

Please sign in to comment.