Skip to content

[Arduino_CAN] support both 11-Bit (standard) and 29-Bit (extended) IDs. #79

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Sep 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions extras/e2studioProjects/portenta_h33_lib/configuration.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1060,8 +1060,8 @@
<property id="config.driver.canfd.rxfifo.7.int_threshold" value="enum.driver.canfd.fifo.int_threshold.1_2"/>
<property id="config.driver.canfd.rxfifo.7.payload" value="enum.driver.canfd.fifo.payload.8"/>
<property id="config.driver.canfd.rxfifo.7.depth" value="enum.driver.canfd.fifo.depth.16"/>
<property id="config.driver.canfd.afl.ch0_num" value="1"/>
<property id="config.driver.canfd.afl.ch1_num" value="1"/>
<property id="config.driver.canfd.afl.ch0_num" value="2"/>
<property id="config.driver.canfd.afl.ch1_num" value="2"/>
</config>
<config id="config.driver.gpt">
<property id="config.driver.gpt.param_checking_enable" value="config.driver.gpt.param_checking_enable.bsp"/>
Expand Down
2 changes: 1 addition & 1 deletion libraries/Arduino_CAN/examples/CAN1Write/CAN1Write.ino
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ void loop()
*/
uint8_t const msg_data[] = {0xCA,0xFE,0,0,0,0,0,0};
memcpy((void *)(msg_data + 4), &msg_cnt, sizeof(msg_cnt));
CanMsg msg(CAN_ID, sizeof(msg_data), msg_data);
CanMsg const msg(CanStandardId(CAN_ID), sizeof(msg_data), msg_data);

/* Transmit the CAN message, capture and display an
* error core in case of failure.
Expand Down
2 changes: 1 addition & 1 deletion libraries/Arduino_CAN/examples/CANWrite/CANWrite.ino
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ void loop()
*/
uint8_t const msg_data[] = {0xCA,0xFE,0,0,0,0,0,0};
memcpy((void *)(msg_data + 4), &msg_cnt, sizeof(msg_cnt));
CanMsg msg(CAN_ID, sizeof(msg_data), msg_data);
CanMsg const msg(CanStandardId(CAN_ID), sizeof(msg_data), msg_data);

/* Transmit the CAN message, capture and display an
* error core in case of failure.
Expand Down
7 changes: 7 additions & 0 deletions libraries/Arduino_CAN/keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ CAN KEYWORD1
CAN1 KEYWORD1
CanMsg KEYWORD1
CanBitRate KEYWORD1
CanStandardId KEYWORD2
CanExtendedId KEYWORD2

#######################################
# Methods and Functions (KEYWORD2)
Expand All @@ -25,6 +27,11 @@ read KEYWORD2
isError KEYWORD2
clearError KEYWORD2

getStandardId KEYWORD2
getExtendedId KEYWORD2
isStandardId KEYWORD2
isExtendedId KEYWORD2

#######################################
# Constants (LITERAL1)
#######################################
Expand Down
50 changes: 27 additions & 23 deletions libraries/Arduino_CAN/src/R7FA4M1_CAN.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,9 @@ R7FA4M1_CAN::R7FA4M1_CAN(int const can_tx_pin, int const can_rx_pin)
CAN_DEFAULT_MASK,
CAN_DEFAULT_MASK,
CAN_DEFAULT_MASK,
0, /* Use no id filtering -> a CAN frame with any ID will be stored in receive mailbox #0. */
CAN_DEFAULT_MASK,
0, /* Use no id filtering -> a CAN frame with any ID will be stored in receive mailbox group #0. */
CAN_DEFAULT_MASK,
0, /* Use no id filtering -> a CAN frame with any ID will be stored in receive mailbox group #2. */
CAN_DEFAULT_MASK
}
, _can_mailbox
Expand All @@ -74,15 +74,15 @@ R7FA4M1_CAN::R7FA4M1_CAN(int const can_tx_pin, int const can_rx_pin)
{ .mailbox_id = 6, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
{ .mailbox_id = 7, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
/* Mailbox Group #2 */
{ .mailbox_id = 8, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
{ .mailbox_id = 9, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
{ .mailbox_id = 10, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
{ .mailbox_id = 11, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
{ .mailbox_id = 8, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
{ .mailbox_id = 9, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
{ .mailbox_id = 10, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
{ .mailbox_id = 11, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
/* Mailbox Group #3 */
{ .mailbox_id = 12, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
{ .mailbox_id = 13, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
{ .mailbox_id = 14, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
{ .mailbox_id = 15, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
{ .mailbox_id = 12, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
{ .mailbox_id = 13, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
{ .mailbox_id = 14, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
{ .mailbox_id = 15, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_TRANSMIT},
/* We only use the very first receive mailbox for receiving. */
/* Mailbox Group #4 */
{ .mailbox_id = 0, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
Expand All @@ -95,22 +95,22 @@ R7FA4M1_CAN::R7FA4M1_CAN(int const can_tx_pin, int const can_rx_pin)
{ .mailbox_id = 6, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
{ .mailbox_id = 7, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
/* Mailbox Group #6 */
{ .mailbox_id = 8, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
{ .mailbox_id = 9, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
{ .mailbox_id = 10, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
{ .mailbox_id = 11, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
{ .mailbox_id = 8, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
{ .mailbox_id = 9, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
{ .mailbox_id = 10, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
{ .mailbox_id = 11, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
/* Mailbox Group #7 */
{ .mailbox_id = 12, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
{ .mailbox_id = 13, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
{ .mailbox_id = 14, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
{ .mailbox_id = 15, .id_mode = CAN_ID_MODE_EXTENDED, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE }
{ .mailbox_id = 12, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
{ .mailbox_id = 13, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
{ .mailbox_id = 14, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE },
{ .mailbox_id = 15, .id_mode = CAN_ID_MODE_STANDARD, .frame_type = CAN_FRAME_TYPE_DATA, .mailbox_type = CAN_MAILBOX_RECEIVE }
}
, _can_extended_cfg
{
.clock_source = CAN_CLOCK_SOURCE_PCLKB,
.p_mailbox_mask = _can_mailbox_mask,
.p_mailbox = _can_mailbox,
.global_id_mode = CAN_GLOBAL_ID_MODE_EXTENDED,
.global_id_mode = CAN_GLOBAL_ID_MODE_MIXED,
.mailbox_count = CAN_MAX_NO_MAILBOXES,
.message_mode = CAN_MESSAGE_MODE_OVERWRITE,
.p_fifo_int_cfg = nullptr,
Expand Down Expand Up @@ -205,17 +205,21 @@ int R7FA4M1_CAN::disableInternalLoopback()

int R7FA4M1_CAN::write(CanMsg const & msg)
{
bool const is_standard_id = msg.isStandardId();

can_frame_t can_msg = {
/* id = */ msg.id,
/* id_mode = */ CAN_ID_MODE_EXTENDED,
/* id = */ is_standard_id ? msg.getStandardId() : msg.getExtendedId(),
/* id_mode = */ is_standard_id ? CAN_ID_MODE_STANDARD : CAN_ID_MODE_EXTENDED,
/* type = */ CAN_FRAME_TYPE_DATA,
/* data_length_code = */ min(msg.data_length, CAN_DATA_BUFFER_LENGTH),
/* options = */ 0
};

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

if(fsp_err_t const rc = R_CAN_Write(&_can_ctrl, CAN_MAILBOX_ID_0, &can_msg); rc != FSP_SUCCESS)
if(fsp_err_t const rc = R_CAN_Write(&_can_ctrl,
is_standard_id ? CAN_MAILBOX_ID_0 : CAN_MAILBOX_ID_16,
&can_msg); rc != FSP_SUCCESS)
return -rc;

return 1;
Expand All @@ -241,7 +245,7 @@ void R7FA4M1_CAN::onCanCallback(can_callback_args_t * p_args)
/* Extract the received CAN message. */
CanMsg const msg
(
p_args->frame.id,
(p_args->frame.id_mode == CAN_ID_MODE_STANDARD) ? CanStandardId(p_args->frame.id) : CanExtendedId(p_args->frame.id),
p_args->frame.data_length_code,
p_args->frame.data
);
Expand Down
10 changes: 6 additions & 4 deletions libraries/Arduino_CAN/src/R7FA6M5_CAN.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,9 +190,11 @@ int R7FA6M5_CAN::disableInternalLoopback()

int R7FA6M5_CAN::write(CanMsg const & msg)
{
bool const is_standard_id = msg.isStandardId();

can_frame_t can_msg = {
/* id = */ msg.id,
/* id_mode = */ CAN_ID_MODE_EXTENDED,
/* id = */ is_standard_id ? msg.getStandardId() : msg.getExtendedId(),
/* id_mode = */ is_standard_id ? CAN_ID_MODE_STANDARD : CAN_ID_MODE_EXTENDED,
/* type = */ CAN_FRAME_TYPE_DATA,
/* data_length_code = */ min(msg.data_length, CAN_DATA_BUFFER_LENGTH),
/* options = */ 0 /* This ensures that CAN Classic is used. */
Expand Down Expand Up @@ -221,7 +223,7 @@ size_t R7FA6M5_CAN::available()
/* Extract the received CAN message. */
CanMsg const msg
(
frame.id,
(frame.id_mode == CAN_ID_MODE_STANDARD) ? CanStandardId(frame.id) : CanExtendedId(frame.id),
frame.data_length_code,
frame.data
);
Expand All @@ -247,7 +249,7 @@ void R7FA6M5_CAN::onCanFDCallback(can_callback_args_t * p_args)
/* Extract the received CAN message. */
CanMsg const msg
(
p_args->frame.id,
(p_args->frame.id_mode == CAN_ID_MODE_STANDARD) ? CanStandardId(p_args->frame.id) : CanExtendedId(p_args->frame.id),
p_args->frame.data_length_code,
p_args->frame.data
);
Expand Down
40 changes: 40 additions & 0 deletions libraries/Arduino_CAN/src/R7FA6M5_CAN_AFL.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,26 @@ canfd_afl_entry_t const CANFD0_AFL[CANFD_CFG_AFL_CH0_RULE_NUM] = {
.rx_buffer = (canfd_rx_mb_t) CANFD_RX_MB_0,
.fifo_select_flags = CANFD_RX_FIFO_0,
}
},
{
.id =
{
.id = 0x1FFFFFFF,
.frame_type = CAN_FRAME_TYPE_DATA,
.id_mode = CAN_ID_MODE_STANDARD,
},
.mask =
{
.mask_id = 0,
.mask_frame_type = 1,
.mask_id_mode = 1,
},
.destination =
{
.minimum_dlc = CANFD_MINIMUM_DLC_0,
.rx_buffer = (canfd_rx_mb_t) CANFD_RX_MB_1,
.fifo_select_flags = CANFD_RX_FIFO_1,
}
}
};

Expand All @@ -46,6 +66,26 @@ canfd_afl_entry_t const CANFD1_AFL[CANFD_CFG_AFL_CH1_RULE_NUM] = {
.rx_buffer = (canfd_rx_mb_t) CANFD_RX_MB_1,
.fifo_select_flags = CANFD_RX_FIFO_1,
}
},
{
.id =
{
.id = 0x1FFFFFFF,
.frame_type = CAN_FRAME_TYPE_DATA,
.id_mode = CAN_ID_MODE_STANDARD,
},
.mask =
{
.mask_id = 0,
.mask_frame_type = 1,
.mask_id_mode = 1,
},
.destination =
{
.minimum_dlc = CANFD_MINIMUM_DLC_0,
.rx_buffer = (canfd_rx_mb_t) CANFD_RX_MB_1,
.fifo_select_flags = CANFD_RX_FIFO_1,
}
}
};

Expand Down
4 changes: 2 additions & 2 deletions variants/PORTENTA_C33/includes/ra_cfg/fsp_cfg/r_canfd_cfg.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@

#define CANFD_CFG_PARAM_CHECKING_ENABLE ((1))

#define CANFD_CFG_AFL_CH0_RULE_NUM (1)
#define CANFD_CFG_AFL_CH1_RULE_NUM (1)
#define CANFD_CFG_AFL_CH0_RULE_NUM (2)
#define CANFD_CFG_AFL_CH1_RULE_NUM (2)

#define CANFD_CFG_GLOBAL_ERROR_CH ((1U))

Expand Down
Binary file modified variants/PORTENTA_C33/libs/libfsp.a
Binary file not shown.