M5StampS3 / M5Dial and CAN



  • Has anyone got the CAN unit to work with the ESP32 S3 devices?

    I end up with a load of compiled messages when I try using the ported Atom examples using Platformio

    It looks like the problem is in CAN.c and the TWAI driver
    see
    https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/twai.html

    Error Messages
    "In file included from C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_reg.h:21,
    from src/CAN.c:38:
    src/CAN.c: In function 'CAN_init':
    src/CAN.c:169:29: error: 'DPORT_PERIP_CLK_EN_REG' undeclared (first use in this function); did
    you mean 'SYSTEM_PERIP_CLK_EN1_REG'?
    DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN);
    ^~~~~~~~~~~~~~~~~~~~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:75:67: note: in definition of macro '_DPORT_WRITE_PERI_REG'
    #define _DPORT_WRITE_PERI_REG(addr, val) (*((volatile uint32_t )(addr))) = (uint32_t)(val)
    ^~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:88:46: note: in expansion of macro 'DPORT_WRITE_PERI_REG'
    #define DPORT_SET_PERI_REG_MASK(reg, mask) DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)|(mask)))
    ^~~~~~~~~~~~~~~~~~~~
    src/CAN.c:169:5: note: in expansion of macro 'DPORT_SET_PERI_REG_MASK'
    DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN);
    ^~~~~~~~~~~~~~~~~~~~~~~
    src/CAN.c:169:29: note: each undeclared identifier is reported only once for each function it appears in
    DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN);
    ^~~~~~~~~~~~~~~~~~~~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:75:67: note: in definition of macro '_DPORT_WRITE_PERI_REG'
    #define _DPORT_WRITE_PERI_REG(addr, val) (
    ((volatile uint32_t )(addr))) = (uint32_t)(val)
    ^~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:88:46: note: in expansion of macro 'DPORT_WRITE_PERI_REG'
    #define DPORT_SET_PERI_REG_MASK(reg, mask) DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)|(mask)))
    ^~~~~~~~~~~~~~~~~~~~
    src/CAN.c:169:5: note: in expansion of macro 'DPORT_SET_PERI_REG_MASK'
    DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN);
    ^~~~~~~~~~~~~~~~~~~~~~~
    src/CAN.c:169:53: error: 'DPORT_CAN_CLK_EN' undeclared (first use in this function); did you mean 'DPORT_REG_CLR_BIT'?
    DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN);
    ^~~~~~~~~~~~~~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:75:88: note: in definition of macro '_DPORT_WRITE_PERI_REG'
    #define _DPORT_WRITE_PERI_REG(addr, val) (
    ((volatile uint32_t )(addr))) = (uint32_t)(val)
    ^~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:88:46: note: in expansion of macro 'DPORT_WRITE_PERI_REG'
    #define DPORT_SET_PERI_REG_MASK(reg, mask) DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)|(mask)))
    ^~~~~~~~~~~~~~~~~~~~
    src/CAN.c:169:5: note: in expansion of macro 'DPORT_SET_PERI_REG_MASK'
    DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN);
    ^~~~~~~~~~~~~~~~~~~~~~~
    src/CAN.c:170:31: error: 'DPORT_PERIP_RST_EN_REG' undeclared (first use in this function); did
    you mean 'SYSTEM_PERIP_RST_EN0_REG'?
    DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_CAN_RST);
    ^~~~~~~~~~~~~~~~~~~~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:75:67: note: in definition of macro '_DPORT_WRITE_PERI_REG'
    #define _DPORT_WRITE_PERI_REG(addr, val) (
    ((volatile uint32_t )(addr))) = (uint32_t)(val)
    ^~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:85:46: note: in expansion of macro 'DPORT_WRITE_PERI_REG'
    #define DPORT_CLEAR_PERI_REG_MASK(reg, mask) DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)&(~(mask))))
    ^~~~~~~~~~~~~~~~~~~~
    src/CAN.c:170:5: note: in expansion of macro 'DPORT_CLEAR_PERI_REG_MASK'
    DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_CAN_RST);
    ^~~~~~~~~~~~~~~~~~~~~~~~~
    src/CAN.c:170:55: error: 'DPORT_CAN_RST' undeclared (first use in this function); did you mean
    'DPORT_DATE_REG'?
    DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_CAN_RST);
    ^~~~~~~~~~~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:75:88: note: in definition of macro '_DPORT_WRITE_PERI_REG'
    #define _DPORT_WRITE_PERI_REG(addr, val) (
    ((volatile uint32_t )(addr))) = (uint32_t)(val)
    ^~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:85:46: note: in expansion of macro 'DPORT_WRITE_PERI_REG'
    #define DPORT_CLEAR_PERI_REG_MASK(reg, mask) DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)&(~(mask))))
    ^~~~~~~~~~~~~~~~~~~~
    src/CAN.c:170:5: note: in expansion of macro 'DPORT_CLEAR_PERI_REG_MASK'
    DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_CAN_RST);
    ^~~~~~~~~~~~~~~~~~~~~~~~~
    src/CAN.c:175:40: error: 'CAN_TX_IDX' undeclared (first use in this function); did you mean 'TWAI_TX_IDX'?
    gpio_matrix_out(CAN_cfg.tx_pin_id, CAN_TX_IDX, 0, 0);
    ^~~~~~~~~~
    TWAI_TX_IDX
    src/CAN.c:180:39: error: 'CAN_RX_IDX' undeclared (first use in this function); did you mean 'TWAI_RX_IDX'?
    gpio_matrix_in(CAN_cfg.rx_pin_id, CAN_RX_IDX, 0);
    ^~~~~~~~~~
    TWAI_RX_IDX
    src/CAN.c:252:20: error: 'ETS_CAN_INTR_SOURCE' undeclared (first use in this function)
    esp_intr_alloc(ETS_CAN_INTR_SOURCE, 0, CAN_isr, NULL, NULL);
    ^~~~~~~~~~~~~~~~~~~
    Compiling .pio\build\m5stack-stamps3\src\main.cpp.o
    Compiling .pio\build\m5stack-stamps3\lib421\ESP32CAN\CAN.c.o
    In file included from .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c:37:
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/esp_hw_support/include/esp_intr.h:8:2: warning: #warning esp_intr.h is deprecated, please include esp_intr_alloc.h instead [-Wcpp]
    #warning esp_intr.h is deprecated, please include esp_intr_alloc.h instead
    ^~~~~~~
    In file included from C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_reg.h:21,
    from .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c:38:
    .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c: In function 'CAN_init':
    .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c:173:26: error: 'DPORT_PERIP_CLK_EN_REG' undeclared (first use in this function); did you mean 'SYSTEM_PERIP_CLK_EN1_REG'?
    DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN);
    ^~~~~~~~~~~~~~~~~~~~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:75:67: note: in definition of macro '_DPORT_WRITE_PERI_REG'
    #define _DPORT_WRITE_PERI_REG(addr, val) (
    ((volatile uint32_t )(addr))) = (uint32_t)(val)
    ^~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:88:46: note: in expansion of macro 'DPORT_WRITE_PERI_REG'
    #define DPORT_SET_PERI_REG_MASK(reg, mask) DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)|(mask)))
    ^~~~~~~~~~~~~~~~~~~~
    .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c:173:2: note: in expansion of macro 'DPORT_SET_PERI_REG_MASK'
    DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN);
    ^~~~~~~~~~~~~~~~~~~~~~~
    .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c:173:26: note: each undeclared identifier is reported only once for each function it appears in
    DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN);
    ^~~~~~~~~~~~~~~~~~~~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:75:67: note: in definition of macro '_DPORT_WRITE_PERI_REG'
    #define _DPORT_WRITE_PERI_REG(addr, val) (
    ((volatile uint32_t )(addr))) = (uint32_t)(val)
    ^~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:88:46: note: in expansion of macro 'DPORT_WRITE_PERI_REG'
    #define DPORT_SET_PERI_REG_MASK(reg, mask) DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)|(mask)))
    ^~~~~~~~~~~~~~~~~~~~
    .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c:173:2: note: in expansion of macro 'DPORT_SET_PERI_REG_MASK'
    DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN);
    ^~~~~~~~~~~~~~~~~~~~~~~
    .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c:173:50: error: 'DPORT_CAN_CLK_EN' undeclared (first use in this function); did you mean 'DPORT_REG_CLR_BIT'?
    DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN);
    ^~~~~~~~~~~~~~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:75:88: note: in definition of macro '_DPORT_WRITE_PERI_REG'
    #define _DPORT_WRITE_PERI_REG(addr, val) (
    ((volatile uint32_t )(addr))) = (uint32_t)(val)
    ^~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:88:46: note: in expansion of macro 'DPORT_WRITE_PERI_REG'
    #define DPORT_SET_PERI_REG_MASK(reg, mask) DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)|(mask)))
    ^~~~~~~~~~~~~~~~~~~~
    .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c:173:2: note: in expansion of macro 'DPORT_SET_PERI_REG_MASK'
    DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN);
    ^~~~~~~~~~~~~~~~~~~~~~~
    .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c:174:28: error: 'DPORT_PERIP_RST_EN_REG' undeclared (first use in this function); did you mean 'SYSTEM_PERIP_RST_EN0_REG'?
    DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_CAN_RST);
    ^~~~~~~~~~~~~~~~~~~~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:75:67: note: in definition of macro '_DPORT_WRITE_PERI_REG'
    #define _DPORT_WRITE_PERI_REG(addr, val) (
    ((volatile uint32_t )(addr))) = (uint32_t)(val)
    ^~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:85:46: note: in expansion of macro 'DPORT_WRITE_PERI_REG'
    #define DPORT_CLEAR_PERI_REG_MASK(reg, mask) DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)&(~(mask))))
    ^~~~~~~~~~~~~~~~~~~~
    .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c:174:2: note: in expansion of macro 'DPORT_CLEAR_PERI_REG_MASK'
    DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_CAN_RST);
    ^~~~~~~~~~~~~~~~~~~~~~~~~
    .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c:174:52: error: 'DPORT_CAN_RST' undeclared (first use in this function); did you mean 'DPORT_DATE_REG'?
    DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_CAN_RST);
    ^~~~~~~~~~~~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:75:88: note: in definition of macro '_DPORT_WRITE_PERI_REG'
    #define _DPORT_WRITE_PERI_REG(addr, val) (
    ((volatile uint32_t *)(addr))) = (uint32_t)(val)
    ^~~
    C:/Users/simon/.platformio/packages/framework-arduinoespressif32@src-e2e946657dbcd16e4aabb8a644a06175/tools/sdk/esp32s3/include/soc/esp32s3/include/soc/dport_access.h:85:46: note: in expansion of macro 'DPORT_WRITE_PERI_REG'
    #define DPORT_CLEAR_PERI_REG_MASK(reg, mask) DPORT_WRITE_PERI_REG((reg), (DPORT_READ_PERI_REG(reg)&(~(mask))))
    ^~~~~~~~~~~~~~~~~~~~
    .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c:174:2: note: in expansion of macro 'DPORT_CLEAR_PERI_REG_MASK'
    DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_CAN_RST);
    ^~~~~~~~~~~~~~~~~~~~~~~~~
    .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c:179:37: error: 'CAN_TX_IDX' undeclared (first use in this function); did you mean 'TWAI_TX_IDX'?
    gpio_matrix_out(CAN_cfg.tx_pin_id, CAN_TX_IDX, 0, 0);
    ^~~~~~~~~~
    TWAI_TX_IDX
    .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c:184:36: error: 'CAN_RX_IDX' undeclared (first use in this function); did you mean 'TWAI_RX_IDX'?
    gpio_matrix_in(CAN_cfg.rx_pin_id, CAN_RX_IDX, 0);
    ^~~~~~~~~~
    TWAI_RX_IDX
    .pio/libdeps/m5stack-stamps3/ESP32CAN/src/CAN.c:254:17: error: 'ETS_CAN_INTR_SOURCE' undeclared (first use in this function)
    esp_intr_alloc(ETS_CAN_INTR_SOURCE, 0, CAN_isr, NULL, NULL);
    ^~~~~~~~~~~~~~~~~~~
    *** [.pio\build\m5stack-stamps3\src\CAN.c.o] Error 1
    *** [.pio\build\m5stack-stamps3\lib421\ESP32CAN\CAN.c.o] Error 1
    ================================= [FAILED] Took 16.27 seconds ================================="

    Source code
    "
    /**

    */

    #include "M5Dial.h"
    #include <M5Unified.h>
    #include <M5GFX.h>
    #include <ESP32CAN.h>
    #include <CAN_config.h>
    #include "driver/twai.h"

    /****** comment out to make sender ********/
    #define CAN_RECIEVER // Remove to make sender

    #define Use_PortB // Remove to use Port A (Red)

    #define CAN_MSG_ID 0x001

    CAN_device_t CAN_cfg; // CAN Config.
    unsigned long previousMillis = 0; // will store last time a CAN Message was sent // send. 将存储上次发送CAN消息的时间。
    const int interval = 80; // interval at which send CAN Messages (milliseconds).

    const int rx_queue_size = 10; // Receive Queue size.
    int LedNumberCount = 0;
    int waitCANData = 0;

    uint8_t msgcnt = 0;

    void setup()
    {

    auto cfg = M5.config();
    M5Dial.begin(cfg, true, false);
    
    M5Dial.Display.setTextColor(GREEN);
    M5Dial.Display.setTextDatum(middle_center);
    M5Dial.Display.setFont(&fonts::Orbitron_Light_32);
    M5Dial.Display.setTextSize(1);
            M5Dial.Display.drawString(String("Dial CAN"), M5Dial.Display.width() / 2, M5Dial.Display.height() / 2);
    
    M5.Lcd.println("M5Stack Core2 and CAN Bus adaptor");  // Print a string on the screen.
     
    M5.Lcd.setTextColor(ORANGE);
    

    // M5.Lcd.println("* sending a string to be converted to upper case, ");
    // M5.Lcd.println("
    receiving response and display it on Terminal. *");

    Serial.println("Basic Demo - ESP32-Arduino-CAN");
    Serial.println("M5Stack CoreS3 and CAN Bus adaptor");
    Serial.println("*  sending a string to be converted to upper case,  *");
    Serial.println("*  receiving response and display it on a Terminal. *");
    
    /* set CAN pins */
    // GROVE connector GPIO pins    
    

    #ifdef Use_PortB
    // Port B
    CAN_cfg.tx_pin_id = GPIO_NUM_1; //
    CAN_cfg.rx_pin_id = GPIO_NUM_2;
    #else
    // Port A Red Port (Shared with I2C)
    CAN_cfg.tx_pin_id = GPIO_NUM_15; // SCL
    CAN_cfg.rx_pin_id = GPIO_NUM_13; // SDA
    #endif

    CAN_cfg.speed = CAN_SPEED_500KBPS;
    
    CAN_cfg.rx_queue  = xQueueCreate(rx_queue_size, sizeof(CAN_frame_t));
    
    ESP32Can.CANInit();
    Serial.println("CAN Installed");
    

    #ifdef CAN_RECIEVER
    Serial.println("Set as RECIEVER");
    //M5.Lcd.println("* Set as RECIEVER ");
    #else
    Serial.println("Set as SENDER");
    M5.Lcd.println("
    Set as SENDER *");
    #endif

    }

    void loop()
    {
    unsigned long currentMillis = millis();

    #ifdef CAN_RECIEVER

    // recieve CAN Message
    CAN_frame_t rx_frame;
    
    if (xQueueReceive(CAN_cfg.rx_queue, &rx_frame, 3 * portTICK_PERIOD_MS) ==  pdTRUE) 
    {
        if (rx_frame.FIR.B.FF == CAN_frame_std) 
        {
            Serial.printf("New standard frame");
        } 
        else
        {
            Serial.printf("New extended frame");
        }
    
        if (rx_frame.FIR.B.RTR == CAN_RTR) 
        {
            Serial.printf(" RTR from 0x%08X, DLC %d\r\n", rx_frame.MsgID, rx_frame.FIR.B.DLC);
        }
        else
        {
            Serial.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++) 
            {
                Serial.printf("0x%02X ", rx_frame.data.u8[i]);
            }
            Serial.printf("\n");
            if (rx_frame.data.u8[0] == 0x01) 
            {
                CAN_frame_t tx_frame;
                tx_frame.FIR.B.FF   = CAN_frame_std;
                tx_frame.MsgID      = CAN_MSG_ID;
                tx_frame.FIR.B.DLC  = 8;
                tx_frame.data.u8[0] = 0x02;
                tx_frame.data.u8[1] = rx_frame.data.u8[1];
                tx_frame.data.u8[2] = 0x00;
                tx_frame.data.u8[3] = 0x00;
                tx_frame.data.u8[4] = 0x00;
                tx_frame.data.u8[5] = 0x00;
                tx_frame.data.u8[6] = 0x00;
                tx_frame.data.u8[7] = 0x00;
                ESP32Can.CANWriteFrame(&tx_frame);
            }
        }
    }
    

    #else
    // Send CAN Message
    if (currentMillis - previousMillis >= interval)
    {
    ESP32Can.CANInit();
    previousMillis = currentMillis;
    CAN_frame_t tx_frame;
    tx_frame.FIR.B.FF = CAN_frame_std;
    tx_frame.MsgID = CAN_MSG_ID;
    tx_frame.FIR.B.DLC = 8;
    tx_frame.data.u8[0] = 0x01;
    tx_frame.data.u8[1] = msgcnt;
    tx_frame.data.u8[2] = 0x00;
    tx_frame.data.u8[3] = 0x00;
    tx_frame.data.u8[4] = 0x00;
    tx_frame.data.u8[5] = 0x00;
    tx_frame.data.u8[6] = 0x00;
    tx_frame.data.u8[7] = 0x00;

        ESP32Can.CANWriteFrame(&tx_frame);
         ESP32Can.CANStop();
        msgcnt++;
        if (msgcnt > 29) 
        {
            msgcnt = 0;
        }
    }
    
    CAN_frame_t rx_frame;
    
    if (xQueueReceive(CAN_cfg.rx_queue, &rx_frame, 3 * portTICK_PERIOD_MS) == pdTRUE) 
    {
        if (rx_frame.FIR.B.FF == CAN_frame_std) 
        {
            Serial.printf("New standard frame");
        } 
        else 
        {
            Serial.printf("New extended frame");
        }
    
        if (rx_frame.FIR.B.RTR == CAN_RTR) 
        {
            Serial.printf(" RTR from 0x%08X, DLC %d\r\n", rx_frame.MsgID, rx_frame.FIR.B.DLC);
        } 
        else 
        {
            Serial.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++) 
            {
                Serial.printf("0x%02X ", rx_frame.data.u8[i]);
            }
            Serial.printf("\n");
    
            if (rx_frame.data.u8[0] == 0x02) 
            {
                    if (rx_frame.data.u8[1] < 25)
                {
                    Serial.println("x");
                    //M5.dis.drawpix(rx_frame.data.u8[1], CRGB(100, 0, 0));
                } 
                else if (rx_frame.data.u8[1] > 27) 
                {
                    Serial.println("y");
                    //M5.dis.fillpix(CRGB(0, 0, 20));
                }
                waitCANData = 0;
            }
        }
    }
    

    #endif
    // waitCANData
    M5.update();
    if (M5.BtnA.isPressed())
    {
    M5.Lcd.fillScreen(YELLOW);
    esp_restart();
    }
    delay(10);
    }
    "

    Platformio.ini

    "
    ; PlatformIO Project Configuration File
    ;
    ; Build options: build flags, source filter
    ; Upload options: custom upload port, speed and extra flags
    ; Library options: dependencies, extra library storages
    ; Advanced options: extra scripting
    ;
    ; Please visit documentation for the other options and examples
    ; https://docs.platformio.org/page/projectconf.html

    [env:m5stack-stamps3]
    platform = espressif32
    board = m5stack-stamps3
    framework = arduino
    lib_deps =
    m5stack/M5Dial@^1.0.2
    m5stack/M5Unified@^0.1.11
    m5stack/M5GFX@^0.1.11
    miwagner/ESP32CAN@^0.0.1
    platform_packages = framework-arduinoespressif32@https://github.com/espressif/arduino-esp32/archive/refs/tags/2.0.14.zip
    lib_ldf_mode = deep+
    upload_speed = 1500000
    upload_port = COM7
    monitor_speed = 115200
    monitor_port = COM7
    "



  • Hello @samarkh

    it looks like the CAN library is not compatible with the S3 variant used in M5Dial. See here.

    Thanks
    Felix



  • Hi Felix
    Do you know if there is any plan to develop/recommend one as the M5Dial is perfect for Automotive applications?

    Yours Simon M.



  • Hello @samarkh

    sorry, no idea when and if such a library will be developed.

    That said, maybe this example helps?

    Thanks
    Felix