Background
I am using a Lolin32 board to read CAN BUS data from a Megasquirt ECU. I am using the ESP32CAN.h library (https://github.com/miwagner/ESP32-Arduino-CAN) with a SN65HVD230 transceiver and have gotten it to successfully read in the CAN data and output to a display or serial monitor. I have used the basic example code in the library.
Issue
The problem is I can only receive frame from 1 message ID. The CAN data supplied by the Megasquirt is outputting with decimal message IDs from 1512 to 1516, however in the serial monitor the ESP32 is only receiving data for ID 1512. I do not have any active filters. I know the data supplied from the Megasquirt can have varying IDs, because I can turn them on and off. If I turn one off another will show, but never more than 1 simultaneously.
Help welcome to investigate why this is happening.
ESP32 Code:
Code: Select all
#include <Arduino.h>
#include <ESP32CAN.h>
#include <CAN_config.h>
CAN_device_t CAN_cfg; // CAN Config
unsigned long previousMillis = 0; // will store last time a CAN Message was send
const int interval = 1000; // interval at which send CAN Messages (milliseconds)
const int rx_queue_size = 10; // Receive Queue size
void setup() {
Serial.begin(2000000);
Serial.println("Basic Demo - ESP32-Arduino-CAN");
CAN_cfg.speed = CAN_SPEED_500KBPS;
CAN_cfg.tx_pin_id = GPIO_NUM_22;
CAN_cfg.rx_pin_id = GPIO_NUM_21;
CAN_cfg.rx_queue = xQueueCreate(rx_queue_size, sizeof(CAN_frame_t));
// Init CAN Module
ESP32Can.CANInit();
}
void loop() {
CAN_frame_t rx_frame;
unsigned long currentMillis = millis();
// Receive next CAN frame from queue
if (xQueueReceive(CAN_cfg.rx_queue, &rx_frame, 3 * portTICK_PERIOD_MS) == pdTRUE) {
if (rx_frame.FIR.B.FF == CAN_frame_std) {
printf("New standard frame");
}
else {
printf("New extended frame");
}
if (rx_frame.FIR.B.RTR == CAN_RTR) {
printf(" RTR from 0x%08X, DLC %d\r\n", rx_frame.MsgID, rx_frame.FIR.B.DLC);
}
else {
printf(" from 0x%08X, DLC %d, Data ", rx_frame.MsgID, rx_frame.FIR.B.DLC);
//ID Bit
Serial.println(rx_frame.MsgID);
//Number of Bytes
Serial.println(rx_frame.FIR.B.DLC);
//Print byte 0
Serial.println(rx_frame.data.u8[7], HEX);
//Print byte 1
Serial.println(rx_frame.data.u8[1], HEX);
//Combine bytes 0 and 1
float combine = ((int)rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
combine = combine/10;
Serial.println(combine);
for (int i = 0; i < rx_frame.FIR.B.DLC; i++) {
printf("0x%02X ", rx_frame.data.u8[i]);
}
printf("\n");
}
}
}
Code: Select all
New standard frame from 0x000005E8, DLC 8, Data 0x03 0x61 0x00 0x00 0x07 0x08 0x0A 0x38
1512
8
38
61
86.50
New standard frame from 0x000005E8, DLC 8, Data 0x03 0x61 0x00 0x00 0x07 0x08 0x0A 0x38
1512
8
38
61
86.50
New standard frame from 0x000005E8, DLC 8, Data 0x03 0x61 0x00 0x00 0x07 0x08 0x0A 0x38
1512
8
38
61
86.50
New standard frame from 0x000005E8, DLC 8, Data 0x03 0x61 0x00 0x00 0x07 0x08 0x0A 0x38
1512
8
38
61
86.50
New standard frame from 0x000005E8, DLC 8, Data 0x03 0x61 0x00 0x00 0x07 0x08 0x0A 0x38
1512
8
38
61
86.50
New standard frame from 0x000005E8, DLC 8, Data 0x03 0x61 0x00 0x00 0x07 0x08 0x0A 0x38
1512
8
38
61
86.50
New standard frame from 0x000005E8, DLC 8, Data 0x03 0x61 0x00 0x00 0x07 0x08 0x0A 0x38