Skip to content

Commit 3a1b8a3

Browse files
authored
Merge pull request #170 from Woodwarth/main
CAN Filter and Mask
2 parents 9a838ba + 8249937 commit 3a1b8a3

File tree

4 files changed

+114
-0
lines changed

4 files changed

+114
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
CANRead
3+
4+
Receive and read CAN Bus messages
5+
Read ID 0x100 EXTENDED and ID 0x10 STANDARD
6+
7+
8+
Mailbox Groups 0-3 (Mailbox 0-15) -> TRANSMIT
9+
Mailbox Groups 4-5 (Mailbox 16-23) -> RECEIVE EXTENDED
10+
Mailbox Groups 6-7 (Mailbox 24-31) -> RECEIVE STANDARD
11+
12+
Mailbox Mask 5,7 are preset with 0x1FFFFFFF
13+
Mailbox Mask 4,6 are preset with 0x00
14+
15+
16+
See the full documentation here:
17+
https://docs.arduino.cc/tutorials/uno-r4-wifi/can
18+
*/
19+
20+
/**************************************************************************************
21+
* INCLUDE
22+
**************************************************************************************/
23+
24+
#include <Arduino_CAN.h>
25+
26+
/**************************************************************************************
27+
* CONST
28+
**************************************************************************************/
29+
30+
static uint32_t const CAN_FILTER_MASK_STANDARD = 0x1FFC0000;
31+
static uint32_t const CAN_FILTER_MASK_EXTENDED = 0x1FFFFFFF;
32+
33+
/**************************************************************************************
34+
* SETUP/LOOP
35+
**************************************************************************************/
36+
37+
void setup()
38+
{
39+
Serial.begin(115200);
40+
while (!Serial) { }
41+
42+
CAN.setFilterMask_Extended(CAN_FILTER_MASK_EXTENDED);
43+
CAN.setFilterMask_Standard(CAN_FILTER_MASK_STANDARD);
44+
45+
for (int mailbox = 0; mailbox < R7FA4M1_CAN::CAN_MAX_NO_EXTENDED_MAILBOXES; mailbox++)
46+
{
47+
CAN.setFilterId_Extended(mailbox, 0x0100);
48+
}
49+
50+
for (int mailbox = 0; mailbox < R7FA4M1_CAN::CAN_MAX_NO_STANDARD_MAILBOXES; mailbox++)
51+
{
52+
CAN.setFilterId_Standard(mailbox, 0x10);
53+
}
54+
55+
if (!CAN.begin(CanBitRate::BR_250k))
56+
{
57+
Serial.println("CAN.begin(...) failed.");
58+
for (;;) {}
59+
}
60+
}
61+
62+
void loop()
63+
{
64+
if (CAN.available())
65+
{
66+
CanMsg const msg = CAN.read();
67+
Serial.println(msg);
68+
}
69+
}

Diff for: libraries/Arduino_CAN/keywords.txt

+6
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ available KEYWORD2
2626
read KEYWORD2
2727
isError KEYWORD2
2828
clearError KEYWORD2
29+
setFilterMask_Standard
30+
setFilterMask_Extended
31+
setFilterId_Standard
32+
setFilterId_Extended
2933

3034
getStandardId KEYWORD2
3135
getExtendedId KEYWORD2
@@ -41,3 +45,5 @@ BR_125k LITERAL1
4145
BR_250k LITERAL1
4246
BR_500k LITERAL1
4347
BR_1000k LITERAL1
48+
CAN_MAX_NO_STANDARD_MAILBOXES LITERAL1
49+
CAN_MAX_NO_EXTENDED_MAILBOXES LITERAL1

Diff for: libraries/Arduino_CAN/src/R7FA4M1_CAN.cpp

+31
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,37 @@ void R7FA4M1_CAN::end()
187187
R_CAN_Close(&_can_ctrl);
188188
}
189189

190+
191+
void R7FA4M1_CAN::setFilterMask_Standard(uint32_t const mask)
192+
{
193+
_can_mailbox_mask[6] = mask;
194+
_can_mailbox_mask[7] = mask;
195+
}
196+
197+
void R7FA4M1_CAN::setFilterMask_Extended(uint32_t const mask)
198+
{
199+
_can_mailbox_mask[4] = mask;
200+
_can_mailbox_mask[5] = mask;
201+
}
202+
203+
void R7FA4M1_CAN::setFilterId_Standard(size_t const mailbox, uint32_t const id)
204+
{
205+
if (mailbox > CAN_MAX_NO_STANDARD_MAILBOXES)
206+
return;
207+
208+
size_t const mailbox_idx = CAN_MAX_STANDARD_MAILBOX_OFFSET + mailbox;
209+
_can_mailbox[mailbox_idx].mailbox_id = id;
210+
}
211+
212+
void R7FA4M1_CAN::setFilterId_Extended(size_t const mailbox, uint32_t const id)
213+
{
214+
if (mailbox > CAN_MAX_NO_EXTENDED_MAILBOXES)
215+
return;
216+
217+
size_t const mailbox_idx = CAN_MAX_EXTENDED_MAILBOX_OFFSET + mailbox;
218+
_can_mailbox[mailbox_idx].mailbox_id = id;
219+
}
220+
190221
int R7FA4M1_CAN::enableInternalLoopback()
191222
{
192223
if(fsp_err_t const rc = R_CAN_ModeTransition(&_can_ctrl, CAN_OPERATION_MODE_NORMAL, CAN_TEST_MODE_LOOPBACK_EXTERNAL); rc != FSP_SUCCESS)

Diff for: libraries/Arduino_CAN/src/R7FA4M1_CAN.h

+8
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ class R7FA4M1_CAN final : public HardwareCAN
5454
bool begin(CanBitRate const can_bitrate) override;
5555
void end() override;
5656

57+
void setFilterMask_Standard(uint32_t const mask);
58+
void setFilterMask_Extended(uint32_t const mask);
59+
void setFilterId_Standard(size_t const mailbox, uint32_t const id);
60+
void setFilterId_Extended(size_t const mailbox, uint32_t const id);
5761

5862
int enableInternalLoopback();
5963
int disableInternalLoopback();
@@ -70,9 +74,13 @@ class R7FA4M1_CAN final : public HardwareCAN
7074
/* This function is used by the library and should NOT be called by the user. */
7175
void onCanCallback(can_callback_args_t * p_args);
7276

77+
static size_t constexpr CAN_MAX_NO_STANDARD_MAILBOXES = 8U;
78+
static size_t constexpr CAN_MAX_NO_EXTENDED_MAILBOXES = 8U;
7379

7480
private:
7581
static size_t constexpr CAN_MAX_NO_MAILBOXES = 32U;
82+
static size_t constexpr CAN_MAX_STANDARD_MAILBOX_OFFSET = 24U;
83+
static size_t constexpr CAN_MAX_EXTENDED_MAILBOX_OFFSET = 16U;
7684

7785
int const _can_tx_pin;
7886
int const _can_rx_pin;

0 commit comments

Comments
 (0)