Just wanted to confirm that the MAX3051 transceivers work okay with Flexcan.
Can't say yet what could be wrong with nut's setup.


Code:
#include <FlexCAN_T4.h>
FlexCAN_T4<CAN2, RX_SIZE_256, TX_SIZE_16> canbus;
CAN_message_t msg;
void setup(void) {
pinMode(2, OUTPUT);
digitalWrite(2, LOW); // enable tranceiver
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
delay(500);
canbus.begin();
canbus.setBaudRate(500000);
canbus.setMaxMB(16); // up to 64 max for T4, not important in FIFO mode, unless you want to use additional mailboxes with FIFO
canbus.enableFIFO();
canbus.enableFIFOInterrupt();
canbus.onReceive(canSniff);
canbus.mailboxStatus();
Serial.println("CAN Test");
}
void canSniff(const CAN_message_t &msg) {
static uint32_t timeout = millis();
Serial.print("MB "); Serial.print(msg.mb);
Serial.print(" OVERRUN: "); Serial.print(msg.flags.overrun);
Serial.print(" LEN: "); Serial.print(msg.len);
Serial.print(" EXT: "); Serial.print(msg.flags.extended);
Serial.print(" TS: "); Serial.print(timeout);
Serial.print(" ID: "); Serial.print(msg.id, HEX);
Serial.print(" Buffer: ");
for ( uint8_t i = 0; i < msg.len; i++ ) {
Serial.print(msg.buf[i], HEX); Serial.print(" ");
} Serial.println();
timeout = millis();
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
}
void loop() {
canbus.events();
static uint32_t timeout = millis();
if ( millis() - timeout > 49 ) { // send random frame every 20ms
CAN_message_t msg;
msg.id = random(0,0);
for ( uint8_t i = 0; i < 8; i++ ) msg.buf[i] = i + 1;
canbus.write(msg);
timeout = millis();
}
}