Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

"GD32E103搭載 CAN BUSモジュール"で5MbpsのCANFDパケットをM5stackBasicで扱う

CAN FDをマイコンで扱った事例がネット上に少なく苦労しましたが……要約疎通したのでメモ

実際のところ

回路接続

  • M5stack Basic
    • Grove PortA (赤)にコネクタをつなげる

私の環境では不要でしたが、終端の120Ωが必要なときは裏面にある端子をジャンパはんださせます。

スクリプト

#include "Serial_CAN_FD.h"
#include <Arduino.h>
#include <M5Unified.h>

#define can_tx  22  // Grove connector pin 1 (SCL)
#define can_rx  21  // Grove connector pin 2 (SDA)

#define uart_can Serial2

void uart_init(unsigned long baudrate)
{
    uart_can.begin(baudrate, SERIAL_8N1, can_tx, can_rx);
}

void uart_write(unsigned char c)
{
    uart_can.write(c);
}

unsigned char uart_read()
{
    return uart_can.read();
}

int uart_available()
{
    return uart_can.available();
}

void setup()
{
    M5.begin();
    M5.Power.begin();
    
    M5.Lcd.setTextSize(2);
    M5.Lcd.setCursor(0, 0);
    M5.Lcd.println("CAN FD Test");

    uart_init(9600);
    can_speed_20(1000000);              // set can bus baudrate to 1M
    can_speed_fd(1000000, 5000000);      // set can bus baudrate to 5M.

    M5.Lcd.println("CAN FD Initialized");
}

void loop()
{
    M5.update();  // M5Stack のボタンの状態を更新

    if (M5.BtnA.wasPressed()) {  // ボタン A が押されたかチェック
        unsigned long __id = 0x01;          // can id
        unsigned char __ext = 0;            // 拡張フレームなし
        unsigned char __rtr = 0;            // データフレーム’(1にするとリモートフレーム)
        unsigned char __fdf = 0;            // CAN FDのパケットとして設定
        unsigned char __len = 3;            // data length

        // 1つ目のパケット
        unsigned char __dta1[3] = {0x01, 0x02, 0x03};
        can_send(__id, __ext, __rtr, __fdf, __len, __dta1);

        M5.Lcd.setCursor(0, 60);
        M5.Lcd.println("Sent 2 CAN FD frames");
    }

    delay(10);  // 短い遅延を追加してCPU負荷を軽減
}