test-can.ino
Le SAM3X intègre deux contrôleurs CAN : la Due devient nœud bus CAN (automobile, industrie) avec un simple transceiver SN65HVD230/TJA1050. La bibliothèque due_can masque les registres. Attention au brochage 3,3 V.
Matériel requis
Une Arduino Due (AT91SAM3X8E, ARM Cortex-M3 84 MHz) reliée par USB à son port « Programming ». Attention : logique 3,3 V, jamais 5 V sur les broches. 1 transceiver CAN (SN65HVD230 3,3 V recommandé) + 2e nœud ou bus avec résistance 120 Ω.
Branchement
CANH/CANL du transceiver sur le bus (avec 120 Ω en bout), TXCAN/RXCAN sur les broches CAN de la Due (GCC), VCC/GND.
Fonctionnement
CAN.init configure le contrôleur à 500 kbit/s ; writeTx place une trame en file, readRx récupère les trames reçues (boucle-back possible sur soi-même). Dans l'Arduino IDE, choisissez « Arduino Due (Programming Port) » puis Téléverser ; le moniteur série tourne à la vitesse choisie dans le code.
Pour aller plus loin
Filtrez les ID avec les masques CAN, ou loggez un bus OBD-II via un connecteur 16 broches.
test-can.ino
// CAN0 de la Due (requiert un transceiver 5V/3.3V externe sur le bus).
#include <due_can.h>
void setup() {
Serial.begin(115200);
CAN.init(CAN_USE_GCC, 500000); // GCC = pinout standard, 500 kbit/s
Serial.println(F("CAN0 emetteur/recepteur a 500 kbit/s"));
}
void loop() {
static uint32_t compteur = 0;
CAN_MESSAGE msg;
msg.can_id = 0x123;
msg.can_dlc = 4;
msg.can_data_byte[0] = compteur & 0xFF;
msg.can_data_byte[1] = (compteur >> 8) & 0xFF;
msg.can_data_byte[2] = 0xAA;
msg.can_data_byte[3] = 0x55;
CAN.writeTx(msg);
if (CAN.readRx(msg)) { // trame recue ?
Serial.print(F("Rx id=0x")); Serial.println(msg.can_id, HEX);
}
compteur++;
delay(200);
}