Skip to content

Commit f692916

Browse files
committed
[Arduino_CAN] support both 11-Bit (standard) and 29-Bit (extended) IDs.
1 parent 99bbaef commit f692916

File tree

3 files changed

+29
-25
lines changed

3 files changed

+29
-25
lines changed

Diff for: libraries/Arduino_CAN/examples/CAN1Write/CAN1Write.ino

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ void loop()
5454
*/
5555
uint8_t const msg_data[] = {0xCA,0xFE,0,0,0,0,0,0};
5656
memcpy((void *)(msg_data + 4), &msg_cnt, sizeof(msg_cnt));
57-
CanMsg msg(CAN_ID, sizeof(msg_data), msg_data);
57+
CanMsg const msg(CanStandardId(CAN_ID), sizeof(msg_data), msg_data);
5858

5959
/* Transmit the CAN message, capture and display an
6060
* error core in case of failure.

Diff for: libraries/Arduino_CAN/examples/CANWrite/CANWrite.ino

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ void loop()
3535
*/
3636
uint8_t const msg_data[] = {0xCA,0xFE,0,0,0,0,0,0};
3737
memcpy((void *)(msg_data + 4), &msg_cnt, sizeof(msg_cnt));
38-
CanMsg msg(CAN_ID, sizeof(msg_data), msg_data);
38+
CanMsg const msg(CanStandardId(CAN_ID), sizeof(msg_data), msg_data);
3939

4040
/* Transmit the CAN message, capture and display an
4141
* error core in case of failure.

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

+27-23
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ R7FA4M1_CAN::R7FA4M1_CAN(int const can_tx_pin, int const can_rx_pin)
5656
CAN_DEFAULT_MASK,
5757
CAN_DEFAULT_MASK,
5858
CAN_DEFAULT_MASK,
59-
0, /* Use no id filtering -> a CAN frame with any ID will be stored in receive mailbox #0. */
60-
CAN_DEFAULT_MASK,
59+
0, /* Use no id filtering -> a CAN frame with any ID will be stored in receive mailbox group #0. */
6160
CAN_DEFAULT_MASK,
61+
0, /* Use no id filtering -> a CAN frame with any ID will be stored in receive mailbox group #2. */
6262
CAN_DEFAULT_MASK
6363
}
6464
, _can_mailbox
@@ -74,15 +74,15 @@ R7FA4M1_CAN::R7FA4M1_CAN(int const can_tx_pin, int const can_rx_pin)
7474
{ .mailbox_id = 6, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
7575
{ .mailbox_id = 7, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
7676
/* Mailbox Group #2 */
77-
{ .mailbox_id = 8, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
78-
{ .mailbox_id = 9, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
79-
{ .mailbox_id = 10, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
80-
{ .mailbox_id = 11, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
77+
{ .mailbox_id = 8, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
78+
{ .mailbox_id = 9, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
79+
{ .mailbox_id = 10, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
80+
{ .mailbox_id = 11, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
8181
/* Mailbox Group #3 */
82-
{ .mailbox_id = 12, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
83-
{ .mailbox_id = 13, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
84-
{ .mailbox_id = 14, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
85-
{ .mailbox_id = 15, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
82+
{ .mailbox_id = 12, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
83+
{ .mailbox_id = 13, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
84+
{ .mailbox_id = 14, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
85+
{ .mailbox_id = 15, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
8686
/* We only use the very first receive mailbox for receiving. */
8787
/* Mailbox Group #4 */
8888
{ .mailbox_id = 0, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
@@ -95,22 +95,22 @@ R7FA4M1_CAN::R7FA4M1_CAN(int const can_tx_pin, int const can_rx_pin)
9595
{ .mailbox_id = 6, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
9696
{ .mailbox_id = 7, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
9797
/* Mailbox Group #6 */
98-
{ .mailbox_id = 8, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
99-
{ .mailbox_id = 9, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
100-
{ .mailbox_id = 10, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
101-
{ .mailbox_id = 11, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
98+
{ .mailbox_id = 8, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
99+
{ .mailbox_id = 9, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
100+
{ .mailbox_id = 10, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
101+
{ .mailbox_id = 11, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
102102
/* Mailbox Group #7 */
103-
{ .mailbox_id = 12, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
104-
{ .mailbox_id = 13, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
105-
{ .mailbox_id = 14, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
106-
{ .mailbox_id = 15, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE }
103+
{ .mailbox_id = 12, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
104+
{ .mailbox_id = 13, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
105+
{ .mailbox_id = 14, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
106+
{ .mailbox_id = 15, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE }
107107
}
108108
, _can_extended_cfg
109109
{
110110
.clock_source = CAN_CLOCK_SOURCE_PCLKB,
111111
.p_mailbox_mask = _can_mailbox_mask,
112112
.p_mailbox = _can_mailbox,
113-
.global_id_mode = CAN_GLOBAL_ID_MODE_EXTENDED,
113+
.global_id_mode = CAN_GLOBAL_ID_MODE_MIXED,
114114
.mailbox_count = CAN_MAX_NO_MAILBOXES,
115115
.message_mode = CAN_MESSAGE_MODE_OVERWRITE,
116116
.p_fifo_int_cfg = nullptr,
@@ -205,17 +205,21 @@ int R7FA4M1_CAN::disableInternalLoopback()
205205

206206
int R7FA4M1_CAN::write(CanMsg const & msg)
207207
{
208+
bool const is_standard_id = msg.isStandardId();
209+
208210
can_frame_t can_msg = {
209-
/* id = */ msg.id,
210-
/* id_mode = */ CAN_ID_MODE_EXTENDED,
211+
/* id = */ is_standard_id ? msg.getStandardId() : msg.getExtendedId(),
212+
/* id_mode = */ is_standard_id ? CAN_ID_MODE_STANDARD : CAN_ID_MODE_EXTENDED,
211213
/* type = */ CAN_FRAME_TYPE_DATA,
212214
/* data_length_code = */ min(msg.data_length, CAN_DATA_BUFFER_LENGTH),
213215
/* options = */ 0
214216
};
215217

216218
memcpy(can_msg.data, msg.data, can_msg.data_length_code);
217219

218-
if(fsp_err_t const rc = R_CAN_Write(&_can_ctrl, CAN_MAILBOX_ID_0, &can_msg); rc != FSP_SUCCESS)
220+
if(fsp_err_t const rc = R_CAN_Write(&_can_ctrl,
221+
is_standard_id ? CAN_MAILBOX_ID_0 : CAN_MAILBOX_ID_16,
222+
&can_msg); rc != FSP_SUCCESS)
219223
return -rc;
220224

221225
return 1;
@@ -241,7 +245,7 @@ void R7FA4M1_CAN::onCanCallback(can_callback_args_t * p_args)
241245
/* Extract the received CAN message. */
242246
CanMsg const msg
243247
(
244-
p_args->frame.id,
248+
(p_args->frame.id_mode == CAN_ID_MODE_STANDARD) ? CanStandardId(p_args->frame.id) : CanExtendedId(p_args->frame.id),
245249
p_args->frame.data_length_code,
246250
p_args->frame.data
247251
);

0 commit comments

Comments
 (0)