test-can.ino
El SAM3X integra dos controladores CAN: con un simple transceptor SN65HVD230/TJA1050 la Due pasa a ser nodo de bus CAN (automoción, industria). La librería due_can oculta los registros. Ojo al cableado de 3,3 V.
Hardware necesario
Un Arduino Due (AT91SAM3X8E, ARM Cortex-M3 a 84 MHz) conectado por USB a su puerto « Programming ». Ojo: lógica de 3,3 V, nunca 5 V en los pines. 1 transceptor CAN (SN65HVD230 de 3,3 V recomendado) + un 2º nodo o bus con resistencia de 120 Ω.
Cableado
CANH/CANL del transceptor al bus (120 Ω en los extremos), TXCAN/RXCAN a los pines CAN de la Due (GCC), VCC/GND.
Funcionamiento
CAN.init configura 500 kbit/s; writeTx encola una trama y readRx recoge las recibidas (loopback posible). En el Arduino IDE, elija « Arduino Due (Programming Port) » y Subir; el monitor serie va a la velocidad fijada en el código.
Para ir más lejos
Filtre IDs con las máscaras CAN, o registre un bus OBD-II vía conector de 16 pines.
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);
}