2026年8月8日土曜日

Teensy4.1でCAN FD


背景

CANにはいくつか種類があり、以前CAN2.0をTeensy4.1で試しました。
CAN2.0より通信内容が増えたCAN FDという規格があり、Teensy4.1でそれも使えると分かったので試してみました。
配線やプログラムの内容を備忘録として記事に残します。

使ったもの

  • Teensy4.1
    今回利用するMCUです。
  • MCP2562FD
    今回利用するCANトランシーバーです。
  • ブレッドボード
    装置の信号線を引き出します。
  • ジャンパワイヤ
    装置の配線用です。
  • 120Ω抵抗
    CANの終端抵抗です。
  • PlatformIO
    プログラム開発環境です。

配線: CAN3でCAN FDを利用

TeensyにはCAN1~3の回路がありますが、CAN FDを利用可能なのはCAN3のみなので、CAN3のピンにCANトランシーバー MCP2562FDを繋ぎます。


Teensyに繋ぐとこうなりました。


2組作って繋いで動作確認します。


Teensy4.1のCAN FDプログラム

FlexCAN_T4のサンプルプログラムにはCAN FDの処理はありませんが、ライブラリにそれ用のクラスは用意されているので、issueやforumの情報を元に下記のプログラムを組み立てました。

処理内容はこうです。
  • 1MbpsでCAN FD通信を実施
  • 2秒毎に情報を送信
    • 8byteと64byteを交互に送信
    • 1byte目はマイコンの内部時計の経過秒数
  • 受信した情報のidとbyteを表示
  • 受信ごとにLEDの点滅を切り替え 

#include <Arduino.h>
#include <FlexCAN_T4.h>
FlexCAN_T4FD<CAN3, RX_SIZE_256, TX_SIZE_16> can;

bool flagLED = false;

void setup(void) {
Serial.begin(115200);
delay(400);
can.begin();
can.setRegions(64);

CANFD_timings_t cfg;
cfg.clock = CLK_24MHz;
cfg.baudrate = 1000000; // Nominal rate
cfg.baudrateFD = 1000000; // Data‑phase rate
cfg.sample = 75;
cfg.propdelay = 190;
cfg.bus_length = 1;
can.setBaudRate(cfg);
pinMode(LED_BUILTIN, OUTPUT);
}

bool flagSend64bytes = false;
uint32_t timeout = 0;

void loop() {
if (millis() - timeout > 2000L) {
timeout = millis();
CANFD_message_t msg;
msg.len = flagSend64bytes ? 64 : 8;
flagSend64bytes = !flagSend64bytes;
msg.id = random(0x1, 0x7FE);
for (uint8_t i = 0; i < msg.len; i++) {
msg.buf[i] = i + 1;
}
msg.buf[0] = timeout / 1000;
can.write(msg);
Serial.println("sent " + String(msg.len) + "bytes at " + String(millis()));
}

CANFD_message_t rx;
while (can.read(rx)) {
flagLED = !flagLED;
digitalWrite(LED_BUILTIN, flagLED);
Serial.println("received " + String(rx.len) + "bytes at " +
String(millis()));
Serial.print("rx.id: ");
Serial.println(rx.id);
Serial.print("rx.buf");
for (uint8_t i = 0; i < rx.len; i++) {
Serial.print(" ");
Serial.print(rx.buf[i]);
}
Serial.println();
}
}

参考
Assistance with CAN FD Communication Setup in Senior Design Project Using Teensy 4.1
teensy4.1 CAN-FD 2Mbps not working #82

動作確認

2台共に先程のプログラムを書き込みシリアルモニタで処理内容を確認します。
sent 8bytes at 78039
received 8bytes at 79324
rx.id: 790
rx.buf 38 2 3 4 5 6 7 8
sent 64bytes at 80040
received 64bytes at 81326
rx.id: 1935
rx.buf 40 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

期待通り8bytesと64bytesの情報を交互に送受信していました。

CAN2.0とCAN FDは通信形式が異なるので同一通信線では通信できない

CAN FDはCAN2.0の内容を拡張したものですが、通信内容に含まれる情報がことなるため共存はできないようです。
以前把握したCAN2.0のTeensyと今回のCAN FDのTeensyのCANの通信線を繋いでも通信不能でした。

おわり

Teensy4.1でのCAN FDの通信方法を把握しました。

参考

Teensy4.1とMCP2562でCAN通信
Assistance with CAN FD Communication Setup in Senior Design Project Using Teensy 4.1
teensy4.1 CAN-FD 2Mbps not working #82

0 件のコメント :