Building a CAN API for Arduino DUE

Collin80:
It seems to me that the only thing you're really lacking is that you forgot to pull the trigger at the end. You have to tell it to send those mailboxes once you load them. You can do this one at a time, stagger them, or however you wish. If you want to try to tell it to send all of the mailboxes as fast as it can then do this:

  CAN.global_send_transfer_cmd(CAN_TCR_MB0 | CAN_TCR_MB1 | CAN_TCR_MB2 | CAN_TCR_MB3 | CAN_TCR_MB4);  //send frame in mailbox 0-4

I should probably abstract that a bit. It looks kind of ugly as-is.

I made the change - here is my code again. I still am only getting out on the first TEST1_CAN_TRANSFER_ID :frowning:

Thank you!

#include <Wire.h>
#include "variant.h"
#include <due_can.h>

#define TEST1_CAN_COMM_MB_IDX 0
#define TEST1_CAN_TRANSFER_ID 0x07
#define TEST2_CAN_TRANSFER_ID 0x08
#define TEST3_CAN_TRANSFER_ID 0x08
#define TEST4_CAN_TRANSFER_ID 0x09
#define TEST5_CAN_TRANSFER_ID 0x0A
#define TEST1_CAN0_TX_PRIO 15
#define CAN_MSG_DUMMY_DATA 0x55AAAA55

// CAN frame max data length
#define MAX_CAN_FRAME_DATA_LEN 8

// Message variable to be send
uint32_t CAN_MSG_1 = 0;
uint32_t CAN_MSG_2 = 0;
uint32_t CAN_MSG_3 = 0;
uint32_t CAN_MSG_4 = 0;
uint32_t CAN_MSG_5 = 0;
uint32_t CAN_MSG_6 = 0;
uint32_t CAN_MSG_7 = 0;
uint32_t CAN_MSG_8 = 0;
uint32_t CAN_MSG_9 = 0;
uint32_t CAN_MSG_10 = 0;
uint32_t CAN_MSG_11 = 0;
uint32_t CAN_MSG_12 = 0;

// Initialize CAN1 mailbox 0 as receiver, frame ID is 0x07
CAN.init(SystemCoreClock, CAN_BPS_250K);
CAN.reset_all_mailbox();
// Initialize CAN0 mailbox 0 as transmitter, transmit priority is 15
CAN.mailbox_init(0);
CAN.mailbox_init(1);
CAN.mailbox_init(2);
CAN.mailbox_init(3);
CAN.mailbox_init(4);
CAN.mailbox_set_mode(0, CAN_MB_TX_MODE);
CAN.mailbox_set_mode(1, CAN_MB_TX_MODE);
CAN.mailbox_set_mode(2, CAN_MB_TX_MODE);
CAN.mailbox_set_mode(3, CAN_MB_TX_MODE);
CAN.mailbox_set_mode(4, CAN_MB_TX_MODE);
CAN.mailbox_set_priority(0, TEST1_CAN0_TX_PRIO);
CAN.mailbox_set_priority(1, TEST1_CAN0_TX_PRIO);
CAN.mailbox_set_priority(2, TEST1_CAN0_TX_PRIO);
CAN.mailbox_set_priority(3, TEST1_CAN0_TX_PRIO);
CAN.mailbox_set_priority(4, TEST1_CAN0_TX_PRIO);

CAN.mailbox_set_accept_mask(0, 0, false);
// Prepare transmit ID, data and data length in CAN0 mailbox 0
CAN.mailbox_set_id(0, TEST1_CAN_TRANSFER_ID, false);
CAN.mailbox_set_datal(0, CAN_MSG_1);
CAN.mailbox_set_datah(0, CAN_MSG_2);
CAN.mailbox_set_datalen(0, MAX_CAN_FRAME_DATA_LEN);

CAN.mailbox_set_id(1, TEST2_CAN_TRANSFER_ID, false);
CAN.mailbox_set_datal(1, CAN_MSG_3);
CAN.mailbox_set_datah(1, CAN_MSG_DUMMY_DATA);
CAN.mailbox_set_datalen(1, MAX_CAN_FRAME_DATA_LEN);

CAN.mailbox_set_id(2, TEST3_CAN_TRANSFER_ID, false);
CAN.mailbox_set_datal(2, CAN_MSG_5);
CAN.mailbox_set_datah(2, CAN_MSG_6);
CAN.mailbox_set_datalen(2, MAX_CAN_FRAME_DATA_LEN);

CAN.mailbox_set_id(3, TEST4_CAN_TRANSFER_ID, false);
CAN.mailbox_set_datal(3, CAN_MSG_7);
CAN.mailbox_set_datah(3, CAN_MSG_8);
CAN.mailbox_set_datalen(3, MAX_CAN_FRAME_DATA_LEN);

CAN.mailbox_set_id(4, TEST5_CAN_TRANSFER_ID, false);
CAN.mailbox_set_datal(4, CAN_MSG_9);
CAN.mailbox_set_datah(4, CAN_MSG_DUMMY_DATA);
CAN.mailbox_set_datalen(4, MAX_CAN_FRAME_DATA_LEN);

// Send out the information in the mailbox
CAN.global_send_transfer_cmd(CAN_TCR_MB0);
CAN.global_send_transfer_cmd(CAN_TCR_MB1);
CAN.global_send_transfer_cmd(CAN_TCR_MB2);
CAN.global_send_transfer_cmd(CAN_TCR_MB3);
CAN.global_send_transfer_cmd(CAN_TCR_MB4);

CAN.disable();