Tried out the Waveshare board: it works! Does exactly what I'd hoped.
Will try the previous transceiver board one more time just for fun (I think I may have plugged in CanH/L to a couple of analog inputs instead of the Can ports in my haste this morning).
#include <FlexCAN_T4.h>
// CAN bus defines
#define VCAN_SILENT_PIN 2
#define VCAN_TERMINATOR_PIN 8
#define LCAN_SILENT_PIN 20
FlexCAN_T4<CAN1, RX_SIZE_256, TX_SIZE_16> LCAN;
FlexCAN_T4<CAN2, RX_SIZE_256, TX_SIZE_16> VCAN;
void setup() {
pinMode(LCAN_SILENT_PIN, OUTPUT);
pinMode(VCAN_SILENT_PIN, OUTPUT);
pinMode(VCAN_TERMINATOR_PIN, OUTPUT);
digitalWrite(LCAN_SILENT_PIN, LOW); /* optional transceiver silent pin: HIGH = Silent */
digitalWrite(VCAN_SILENT_PIN, LOW); /* optional transceiver silent pin: HIGH = Silent */
digitalWrite(VCAN_TERMINATOR_PIN, HIGH); /* optional bus terminator enable pin*/
Serial.begin(500000);
// Setup VCAN
VCAN.begin();
VCAN.setBaudRate(500000);
VCAN.enableFIFO();
VCAN.enableFIFOInterrupt();
VCAN.onReceive(canWrite);
// Setup LCAN
LCAN.begin();
LCAN.setBaudRate(500000);
LCAN.mailboxStatus();
delay(100);
}
void loop() {
VCAN.events();
LCAN.events();
}
void canWrite(const CAN_message_t &msg) {
CAN_message_t myMsg;
myMsg = msg;
myMsg.seq = 1;
LCAN.write(myMsg);
}
void ext_output1(const CAN_message_t &msg) {
CAN_message_t myMsg;
myMsg = msg;
myMsg.seq = 1;
LCAN.write(myMsg);
}
Have you tried setting setClock to 60MHz? Thats what I am using in my vehicle at 500kbps
The background handler works because it is direct, no filter, to all receptions, without using the queue. Perhaps the bus is filling the queue too fast? You can check the RX queue size during runtime by printing next 12 bits of events(). 0xFFF000 masked >> 12 will return the value of frames in the queue. If you prefer not using the queue, the external callback will work, but there will be no software filter for canids in that function
For bridging it is good to have direct callback response system like your using via external callback, queues in bridge mode is kinda useless as it will follow the delays of the loop for each events() cycle. If your filtering specific frames or doing normal CAN, using it normally is fine
Sequential frames require events() to be triggered as well. So keep that spinning or try without sequential bit if ordering is not important, you could fill all the TX mailboxes that way
#include <FlexCAN_T4.h>. // [COLOR="#FF0000"]last available version[/COLOR]
FlexCAN_T4<CAN1, RX_SIZE_256, TX_SIZE_16> Can0;
void setup(void) {
Serial.begin(115200);
while (!Serial) ;
Can0.begin();
Can0.setBaudRate(500000);
Can0.setMaxMB(16);
Can0.setClock(CLK_60MHz); // [COLOR="#FF0000"]with or without is the same[/COLOR]
Can0.distribute(); // [COLOR="#FF0000"]change a bit but nothing[/COLOR]
/* MB filters * // [COLOR="#FF0000"]MB filters version[/COLOR]
Can0.enableMBInterrupts();
Can0.onReceive(canSniff);
Can0.setMBFilter(REJECT_ALL);
Can0.setMBFilter(0, 0x100); // transmitted every 10ms (Speed)
Can0.setMBFilter(1, 0x101); // transmitted every 20ms (RPM)
Can0.setMBFilter(2, 0x102); // transmitted every 20ms (Throttle pos)
Can0.setMBFilter(3, 0x103); // transmitted every 100ms (ECT)
Can0.setMBFilter(4, 0x104); // transmitted every 20ms (Gear)
*/
/* FIFO filters */ // [COLOR="#FF0000"]FIFO filters version[/COLOR]
Can0.enableFIFO();
Can0.enableFIFOInterrupt();
Can0.onReceive(FIFO, canSniff);
Can0.setFIFOFilter(REJECT_ALL);
Can0.setFIFOFilter(0, 0x100, STD);
Can0.setFIFOFilter(1, 0x101, STD);
Can0.setFIFOFilter(2, 0x102, STD);
Can0.setFIFOFilter(3, 0x103, STD);
Can0.setFIFOFilter(4, 0x104, STD);
Can0.mailboxStatus();
}
void canSniff(const CAN_message_t &msg)
{
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(millis());
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();
}
void loop() {
Can0.events();
delay(20); // [COLOR="#FF0000"]this simulates the time to show data on screen (BT816 GPU)[/COLOR]
}
Can you copy your callback but rename the new one to
"ext_output1"
And disable events() in loop
Let me know results
#include <FlexCAN_T4.h>
FlexCAN_T4<CAN3, RX_SIZE_256, TX_SIZE_16> Can0;
void setup(void) {
Serial.begin(115200); delay(400);
pinMode(6, OUTPUT); digitalWrite(6, LOW); /* optional tranceiver enable pin */
Can0.begin();
Can0.setBaudRate(1000000);
Can0.setMaxMB(16);
Can0.enableFIFO();
Can0.enableFIFOInterrupt();
Can0.onReceive(canSniff);
Can0.mailboxStatus();
}
void canSniff(const CAN_message_t &msg) {
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(msg.timestamp);
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();
static uint32_t _time = millis();
Serial.print("Time between frames: ");
Serial.println(millis() - _time);
_time = millis();
}
void loop() {
Can0.events();
static uint32_t timeout = millis();
if ( millis() - timeout > 200 ) { [COLOR="#FF0000"][B]// change the sender time here[/B][/COLOR]
CAN_message_t msg;
msg.id = random(0x1,0x7FE);
for ( uint8_t i = 0; i < 8; i++ ) msg.buf[i] = i + 1;
Can0.write(msg);
timeout = millis();
}
}
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 63101 ID: 49A Buffer: 1 2 3 4 5 6 7 8
Time between frames: 201
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 2210 ID: 412 Buffer: 1 2 3 4 5 6 7 8
Time between frames: 201
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 6050 ID: 25D Buffer: 1 2 3 4 5 6 7 8
Time between frames: 201
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 10315 ID: 245 Buffer: 1 2 3 4 5 6 7 8
Time between frames: 201
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 14691 ID: 2E8 Buffer: 1 2 3 4 5 6 7 8
Time between frames: 201
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 19245 ID: 73A Buffer: 1 2 3 4 5 6 7 8
Time between frames: 201
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 23626 ID: 745 Buffer: 1 2 3 4 5 6 7 8
Time between frames: 201
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 27618 ID: 5E7 Buffer: 1 2 3 4 5 6 7 8
Time between frames: 201
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 31936 ID: 733 Buffer: 1 2 3 4 5 6 7 8
Time between frames: 201
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 36123 ID: 3D7 Buffer: 1 2 3 4 5 6 7 8
Time between frames: 201
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 40516 ID: 332 Buffer: 1 2 3 4 5 6 7 8
Time between frames: 201
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 44752 ID: 17 Buffer: 1 2 3 4 5 6 7 8
Time between frames: 201
#include <FlexCAN_T4.h>
FlexCAN_T4<CAN3, RX_SIZE_256, TX_SIZE_16> Can0;
void setup(void) {
Serial.begin(115200); delay(400);
pinMode(6, OUTPUT); digitalWrite(6, LOW); /* optional tranceiver enable pin */
Can0.begin();
Can0.setBaudRate(1000000);
Can0.setMaxMB(16);
Can0.enableFIFO();
Can0.enableFIFOInterrupt();
Can0.onReceive(canSniff);
Can0.mailboxStatus();
}
void canSniff(const CAN_message_t &msg) {
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(msg.timestamp);
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();
static uint32_t _time = millis();
Serial.print("Time between frames: ");
Serial.println(millis() - _time);
_time = millis();
}
void loop() {
Can0.events();
static uint32_t timeout = millis();
if ( millis() - timeout > 2 ) {
static CAN_message_t msg;
msg.id++;
if ( msg.id > 0x7FE ) msg.id = 0x1;
static int16_t val = -1;
val++;
if ( val > 7 ) val = 0;
for ( uint8_t i = 0; i < 8; i++ ) msg.buf[i] = val;
Can0.write(msg);
timeout = millis();
}
}
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 31483 ID: 708 Buffer: 5 5 5 5 5 5 5 5
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 34483 ID: 709 Buffer: 6 6 6 6 6 6 6 6
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 37483 ID: 70A Buffer: 7 7 7 7 7 7 7 7
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 40483 ID: 70B Buffer: 0 0 0 0 0 0 0 0
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 43482 ID: 70C Buffer: 1 1 1 1 1 1 1 1
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 46482 ID: 70D Buffer: 2 2 2 2 2 2 2 2
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 49482 ID: 70E Buffer: 3 3 3 3 3 3 3 3
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 52482 ID: 70F Buffer: 4 4 4 4 4 4 4 4
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 55482 ID: 710 Buffer: 5 5 5 5 5 5 5 5
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 58482 ID: 711 Buffer: 6 6 6 6 6 6 6 6
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 61482 ID: 712 Buffer: 7 7 7 7 7 7 7 7
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 64481 ID: 713 Buffer: 0 0 0 0 0 0 0 0
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 1945 ID: 714 Buffer: 1 1 1 1 1 1 1 1
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 4945 ID: 715 Buffer: 2 2 2 2 2 2 2 2
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 7945 ID: 716 Buffer: 3 3 3 3 3 3 3 3
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 10944 ID: 717 Buffer: 4 4 4 4 4 4 4 4
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 13944 ID: 718 Buffer: 5 5 5 5 5 5 5 5
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 16944 ID: 719 Buffer: 6 6 6 6 6 6 6 6
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 19944 ID: 71A Buffer: 7 7 7 7 7 7 7 7
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 22944 ID: 71B Buffer: 0 0 0 0 0 0 0 0
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 25944 ID: 71C Buffer: 1 1 1 1 1 1 1 1
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 28944 ID: 71D Buffer: 2 2 2 2 2 2 2 2
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 31943 ID: 71E Buffer: 3 3 3 3 3 3 3 3
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 34943 ID: 71F Buffer: 4 4 4 4 4 4 4 4
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 37943 ID: 720 Buffer: 5 5 5 5 5 5 5 5
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 40943 ID: 721 Buffer: 6 6 6 6 6 6 6 6
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 43943 ID: 722 Buffer: 7 7 7 7 7 7 7 7
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 46943 ID: 723 Buffer: 0 0 0 0 0 0 0 0
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 49943 ID: 724 Buffer: 1 1 1 1 1 1 1 1
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 52942 ID: 725 Buffer: 2 2 2 2 2 2 2 2
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 55942 ID: 726 Buffer: 3 3 3 3 3 3 3 3
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 58942 ID: 727 Buffer: 4 4 4 4 4 4 4 4
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 61942 ID: 728 Buffer: 5 5 5 5 5 5 5 5
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 64942 ID: 729 Buffer: 6 6 6 6 6 6 6 6
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 2406 ID: 72A Buffer: 7 7 7 7 7 7 7 7
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 5406 ID: 72B Buffer: 0 0 0 0 0 0 0 0
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 8405 ID: 72C Buffer: 1 1 1 1 1 1 1 1
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 11405 ID: 72D Buffer: 2 2 2 2 2 2 2 2
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 14405 ID: 72E Buffer: 3 3 3 3 3 3 3 3
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 17405 ID: 72F Buffer: 4 4 4 4 4 4 4 4
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 20405 ID: 730 Buffer: 5 5 5 5 5 5 5 5
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 23405 ID: 731 Buffer: 6 6 6 6 6 6 6 6
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 26405 ID: 732 Buffer: 7 7 7 7 7 7 7 7
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 29404 ID: 733 Buffer: 0 0 0 0 0 0 0 0
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 32404 ID: 734 Buffer: 1 1 1 1 1 1 1 1
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 35404 ID: 735 Buffer: 2 2 2 2 2 2 2 2
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 38404 ID: 736 Buffer: 3 3 3 3 3 3 3 3
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 41404 ID: 737 Buffer: 4 4 4 4 4 4 4 4
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 44404 ID: 738 Buffer: 5 5 5 5 5 5 5 5
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 47404 ID: 739 Buffer: 6 6 6 6 6 6 6 6
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 50403 ID: 73A Buffer: 7 7 7 7 7 7 7 7
Time between frames: 3
MB 99 OVERRUN: 0 LEN: 8 EXT: 0 TS: 53403 ID: 73B Buffer: 0 0 0 0 0 0 0 0