I am working with the Arduino library: https://github.com/miwagner/ESP32-Arduino-CAN
The example program in "esp32can_basic.ino" compiles without errors and runs in the Arduino IDE.
I have brought this into IDF using "Arduino as a Component" and have added the required files/additions in arduino/CMakeLists.txt
When "idf.py build" is run, this is the result:
(cut down to reduce clutter and save space)
Code: Select all
...arduino/libarduino.a(ESP32CAN.cpp.obj):(.literal._ZN8ESP32CAN7CANInitEv+0x0): undefined reference to `CAN_init'
..arduino/libarduino.a(ESP32CAN.cpp.obj):(.literal._ZN8ESP32CAN13CANWriteFrameEPK11CAN_frame_t+0x0): undefined reference to `CAN_write_frame'
.../arduino/libarduino.a(ESP32CAN.cpp.obj): in function `ESP32CAN::CANInit()':
...arduino/libraries/ESP32-Arduino-CAN/src/ESP32CAN.cpp:9: undefined reference to `CAN_init'
.../libarduino.a(ESP32CAN.cpp.obj): in function `ESP32CAN::CANWriteFrame(CAN_frame_t const*)':
...arduino/libraries/ESP32-Arduino-CAN/src/ESP32CAN.cpp:13: undefined reference to `CAN_write_frame'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
ninja failed with exit code 1
Code: Select all
#ifndef ESP32CAN_H
#define ESP32CAN_H
#include "CAN_config.h"
#include "CAN.h"
class ESP32CAN
{
public:
int CANInit();
int CANConfigFilter(const CAN_filter_t* p_filter);
int CANWriteFrame(const CAN_frame_t* p_frame);
int CANStop();
};
extern ESP32CAN ESP32Can;
#endif
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(void) {
Serial.begin(115200);
Serial.println("Basic Demo - ESP32-Arduino-CAN");
CAN_cfg.speed = CAN_SPEED_125KBPS;
CAN_cfg.tx_pin_id = GPIO_NUM_5;
CAN_cfg.rx_pin_id = GPIO_NUM_4;
CAN_cfg.rx_queue = xQueueCreate(rx_queue_size, sizeof(CAN_frame_t));
// Init CAN Module
ESP32Can.CANInit();
}
void loop(void) {
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);
for (int i = 0; i < rx_frame.FIR.B.DLC; i++) {
printf("0x%02X ", rx_frame.data.u8[i]);
}
printf("\n");
}
}
// Send CAN Message
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
CAN_frame_t tx_frame;
tx_frame.FIR.B.FF = CAN_frame_std;
tx_frame.MsgID = 0x001;
tx_frame.FIR.B.DLC = 8;
tx_frame.data.u8[0] = 0x00;
tx_frame.data.u8[1] = 0x01;
tx_frame.data.u8[2] = 0x02;
tx_frame.data.u8[3] = 0x03;
tx_frame.data.u8[4] = 0x04;
tx_frame.data.u8[5] = 0x05;
tx_frame.data.u8[6] = 0x06;
tx_frame.data.u8[7] = 0x07;
ESP32Can.CANWriteFrame(&tx_frame);
}
}
Any suggestion or thoughts on what I can try to resolve this?
Thank you in advance!