Teensy4xは今のところArduino系ではESP32を大きく上回るパフォーマンスとコスパで個人的には最強一押しの自作の人向けのマイコンです。扱いやすい8bit系のPICマイコンも相変わらずお世話になってますが、32bitでなおかつお手軽に超絶パワーが手に入るTeensy4.0やTeensy4.1は一度パフォーマンスを体感すると強力な相棒となります。
Teensy4xに搭載されているマイコンはARM Cortex-M7 at 600 MHz (NXPのMIMXRT1062DVJ6B)が搭載されており、普段使っているPIC18F系マイコンが20MHzクロックだったりするので、単純にクロックだけでも30倍違いますが、ベンチマーク結果とか見ると日本の電子工作系雑誌でよく記事になっているESP32と比較しても6倍以上速いですし、Arduino Megaと比べると330倍速いということになります。Arduino Megaは5Vで扱えてポートも多いのでちょっと割高ですが便利ではありますが、パフォーマンスが違い過ぎて同じようなコードを動かすと愕然とします。
CAN通信は通常CANID1つあたり8byteのデータの送受信が可能なデータフレームを持っていますが、CAN通信のプロトコルの仕様上、バス負荷なるものに注意をする必要があります。スカスカのCANバスであれば、割と好きなように送信して、好きな時に受信しても特に調停とかも発生することなく快適な通信が出来てラクチンこの上ないのですが、データのやり取りが多くなってくるとCANIDは足りないし、BUS負荷がキチキチの過密状態になり成立しない状況に陥ります。
自動車の世界ではそういった状況が実際に発生し、CANのデータベース管理は鍋奉行のような担当者が存在したりもするのを聞いたことがありますが、それでも大変なので1chだったCANが2chになり、挙句の果てにCAN Gatewayも登場しました。タイミング的にCANのデータを解読してシステム介入して乗っ取るような行為が海外メディアで流布された時期とも重なっており、診断機通信用のOBDCANのコネクタのところで制御用のCANもそのまま見れていたのが、CAN Gatewayで遮断されてOBDとか特定の通信以外流されなくなってしまい、最近はサイバーセキュリティのために暗号化までされる始末です。
CANFDはBUS負荷を軽減して扱えるデータを大幅に拡大することを可能にします。従来型のCANでは8byteだったデータが、64byteにまで拡大されました。CANのツールでモニターする時に8byteのHEXデータが流れるところを見るだけでも、充分に心が折れるような気分になりますが、これが64byteになるともはや人間が見るようなデータとは感じられないと思ってました。
しかし、実際に扱うデータを増やしたい心境が高まってくるとそうでもなくなってきました。
Teensy4.xにおいてはCANFDは扱えるのはスペック的には頭に入っていましたが、実際にCANFDを使おうと思うと3つあるCANのどれでも良い訳ではなくて、CAN3だけCANFDの設定で使用することが出来るようです。Teensy4.1であれば容易に配線出来ますが、Teensy4.0の場合はちょっとはんだ付けが面倒です。
タイトルからずれますが、Raspberry Pi4BとかでCANFDを扱いたい場合は、MCP2515+ MCP2562の組み合わせではダメで、MCP2515をMCP2517FD/MCP2518FDとかにする必要があるみたいです。Raspberry Pi単独ではCAN通信は出来ませんので、SPIのインターフェースにCAN通信のICを接続した上で、CANトランシーバーを使って通信させるのですが、MCP2515だとCANFDは無理ということです。
https://wiki.seeedstudio.com/2-Channel-CAN-BUS-FD-Shield-for-Raspberry-Pi/
もう少し調べてみたところ、Microchipi社のサイトを見ると新しい製品設計向けではMCP2517は推奨しないということのようでした。という訳でMCP2518FD基準で回路を検討するのが良さそうです。Microchipi社のサイト掲載の比較表を見る限りそんなに違いはなさそうなので素直に従うのが賢明かと今のところ思ってます。MCP2517FDで何か不具合あったんでしょうか?
https://www.microchip.com/en-us/product-comparison.mcp2517fd.mcp2518fd
ちなみに秋月電子で今のところMCP2518FDは扱っておられません。要望出して扱って貰うのが良いと思いますが、まだ日本の自作派の人達があんまりMCP2518FDを使っていないのでしょうか?個人的にはちょっと通信出来れば良くて、しかも普通のCANならMCP2515でも大丈夫ですが、少し負荷の高い通信をさせるときついかなという印象なので、通常のCANも扱えてCANFD対応できるMCP2518FDに移行してMCP2515は使うのをやめていく方が良いような気がします。
https://www.microchip.com/en-us/product/mcp2518fd
ともかくCANFDで送受信させるテストは下記のテストソースを仕立てて確認出来ました。とにかく動いているかどうかだけのチェックなので特に何用とかいうレベルからは程遠いです。CANIDが一つ64バイトのデータ長もあるといちいちチェックが大変なのは思っていた通りでした。
/*
* Teensy 4.1 CAN-FD TEST
*
* can3 is used for CAN FD
*
* based on Teensy 4.0 Triple CAN Demo
* https://github.com/skpang/Teensy40_triple_CAN_demo/blob/master/Teensy40_triple_CAN_demo.ino
* Reference board:
* http://skpang.co.uk/catalog/teensy-40-triple-can-board-include-teensy-40-p-1575.html
*
*
*/
#include <FlexCAN_T4.h>
FlexCAN_T4FD<CAN3, RX_SIZE_256, TX_SIZE_16> FD; // can3 port
int led = 13;
IntervalTimer timer;
uint8_t d=0;
void setup(void) {
pinMode(led, OUTPUT);
digitalWrite(led,HIGH);
Serial.begin(115200); delay(1000);
Serial.println("Teensy 4.1 CAN-FD test");
digitalWrite(led,LOW);
FD.begin();
CANFD_timings_t config;
config.clock = CLK_24MHz;
config.baudrate = 500000; // 500kbps arbitration rate
config.baudrateFD = 2000000; // 2000kbps data rate
config.propdelay = 190;
config.bus_length = 1;
config.sample = 75;
FD.setRegions(64);
FD.setBaudRateAdvanced(config, 1, 1);
FD.onReceive(canSniff);
FD.setMBFilter(ACCEPT_ALL);
FD.setMBFilter(MB13, 0x1);
FD.setMBFilter(MB12, 0x1, 0x3);
FD.setMBFilterRange(MB8, 0x1, 0x04);
FD.enableMBInterrupt(MB8);
FD.enableMBInterrupt(MB12);
FD.enableMBInterrupt(MB13);
FD.enhanceFilter(MB8);
FD.enhanceFilter(MB10);
FD.distribute();
FD.mailboxStatus();
timer.begin(sendframe, 500000); // Send frame every 500ms
}
void sendframe()
{
CANFD_message_t msg;
msg.len = 64;
msg.id = 0x4fd;
msg.seq = 1;
for ( uint8_t i = 0; i < 64; i++ ) {
msg.buf[i] = i + 1;
}
msg.buf[0] = d;
FD.write( msg); // write to can3
}
void canSniff(const CANFD_message_t &msg) {
Serial.print("ISR - MB "); Serial.print(msg.mb);
Serial.print(" OVERRUN: "); Serial.print(msg.flags.overrun);
Serial.print(" LEN: "); Serial.print(msg.len);
Serial.print(" EXT: "); Serial.print(msg.flags.extended);
Serial.print(" TS: "); Serial.print(msg.timestamp);
Serial.print(" ID: "); Serial.print(msg.id, HEX);
Serial.print(" Buffer: ");
for ( uint8_t i = 0; i < msg.len; i++ ) {
Serial.print(msg.buf[i], HEX); Serial.print(" ");
} Serial.println();
}
void loop() {
CANFD_message_t msg;
FD.events(); /* needed for sequential frame transmit and callback queues */
if ( FD.readMB(msg) ) {
Serial.print("MB: "); Serial.print(msg.mb);
Serial.print(" OVERRUN: "); Serial.print(msg.flags.overrun);
Serial.print(" ID: 0x"); Serial.print(msg.id, HEX );
Serial.print(" EXT: "); Serial.print(msg.flags.extended );
Serial.print(" LEN: "); Serial.print(msg.len);
Serial.print(" BRS: "); Serial.print(msg.brs);
Serial.print(" EDL: "); Serial.print(msg.edl);
Serial.print(" DATA: ");
for ( uint8_t i = 0; i <msg.len ; i++ ) {
Serial.print(msg.buf[i], HEX); Serial.print(" ");
}
Serial.print(" TS: "); Serial.println(msg.timestamp);
}
delay(20);
sendframe();
}
ここからArduino IDEのシリアルモニターの画面のキャプチャのコピペです。実際の雰囲気は上のスクリーンショットですが、モニター開始時は下記のようなのが表示されます。大体は気が付かないうちに画面が流れてしまって殆ど気にしてませんが、通信をちゃんと確認する場合は気にしておかないと思い通りに動かない時に原因が全く分からなくなってしまいますので。
Teensy 4.0 Triple CAN test
#########################################################################################################################################
# *** CAN NOMINAL CONFIGURATION *** #
#########################################################################################################################################
Prescaler Sclk(MHz) Tq(ns) NBT(#Tq) Propseg(#Tq) Pseg1(#Tq) Pseg2(#Tq) RJW(#Tq) ?f(%) Sample Point(%) CBT Register
1) 1 24.00 41.67 48 10 25 12 12 0.98 75.00 0x800B270B
*** Arbitration phase bit time = 2.00us (48Tq, Tq=41.67)
a) Sync: 41.67ns b) Propseg: 416.67ns c) Pseg1: 1041.67ns d) Pseg2: 500.00ns
[aaaaa|bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc|dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd]
|________________________|________________________|________________________|________________________|________________________|________________________|
0 200 400 600 800 1000 1200(ns)
Prescaler Sclk(MHz) Tq(ns) NBT(#Tq) Propseg(#Tq) Pseg1(#Tq) Pseg2(#Tq) RJW(#Tq) ?f(%) Sample Point(%) CBT Register
2) 2 12.00 83.33 24 5 12 6 6 0.98 75.00 0x80251165
*** Arbitration phase bit time = 2.00us (24Tq, Tq=83.33)
a) Sync: 83.33ns b) Propseg: 416.67ns c) Pseg1: 1000.00ns d) Pseg2: 500.00ns
[aaaaaaaaaa|bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc|dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd]
|________________________|________________________|________________________|________________________|________________________|________________________|
0 200 400 600 800 1000 1200(ns)
Prescaler Sclk(MHz) Tq(ns) NBT(#Tq) Propseg(#Tq) Pseg1(#Tq) Pseg2(#Tq) RJW(#Tq) ?f(%) Sample Point(%) CBT Register
3) 3 8.00 125.00 16 4 7 4 4 0.98 75.00 0x80430CC3
*** Arbitration phase bit time = 2.00us (16Tq, Tq=125.00)
a) Sync: 125.00ns b) Propseg: 500.00ns c) Pseg1: 875.00ns d) Pseg2: 500.00ns
[aaaaaaaaaaaaaaa|bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc|dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd]
|________________________|________________________|________________________|________________________|________________________|________________________|
0 200 400 600 800 1000 1200(ns)
Prescaler Sclk(MHz) Tq(ns) NBT(#Tq) Propseg(#Tq) Pseg1(#Tq) Pseg2(#Tq) RJW(#Tq) ?f(%) Sample Point(%) CBT Register
4) 4 6.00 166.67 12 3 5 3 3 0.98 75.00 0x80620882
*** Arbitration phase bit time = 2.00us (12Tq, Tq=166.67)
a) Sync: 166.67ns b) Propseg: 500.00ns c) Pseg1: 833.33ns d) Pseg2: 500.00ns
[aaaaaaaaaaaaaaaaaaaa|bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc|dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd]
|________________________|________________________|________________________|________________________|________________________|________________________|
0 200 400 600 800 1000 1200(ns)
Prescaler Sclk(MHz) Tq(ns) NBT(#Tq) Propseg(#Tq) Pseg1(#Tq) Pseg2(#Tq) RJW(#Tq) ?f(%) Sample Point(%) CBT Register
5) 6 4.00 250.00 8 2 3 2 2 0.98 75.00 0x80A10441
*** Arbitration phase bit time = 2.00us (8Tq, Tq=250.00)
a) Sync: 250.00ns b) Propseg: 500.00ns c) Pseg1: 750.00ns d) Pseg2: 500.00ns
[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc|dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd]
|________________________|________________________|________________________|________________________|________________________|________________________|
0 200 400 600 800 1000 1200(ns)
MB: 0 OVERRUN: 0 ID: 0x3DF EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 98 7E 0 2 0 3 0 4 0 5 0 6 84 ED 0 8 7E 6D 0 A 0 B 0 C 0 D 0 E 0 F 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 3 23 0 1B 0 1C 0 1D 0 1E 0 1F 0 20 TS: 19585
MB: 1 OVERRUN: 0 ID: 0x4FA EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 20231
MB: 0 OVERRUN: 0 ID: 0x3DF EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 94 89 0 2 0 3 0 4 0 5 0 6 84 1F 0 8 7E AF 0 A 0 B 0 C 0 D 0 E 0 F 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 2 A0 0 1B 0 1C 0 1D 0 1E 0 1F 0 20 TS: 7078
MB: 1 OVERRUN: 0 ID: 0x4FA EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 7724
MB: 0 OVERRUN: 0 ID: 0x232 EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 9394
MB: 0 OVERRUN: 0 ID: 0x3DF EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 90 8F 0 2 0 3 0 4 0 5 0 6 83 51 0 8 7E F0 0 A 0 B 0 C 0 D 0 E 0 F 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 2 1D 0 1B 0 1C 0 1D 0 1E 0 1F 0 20 TS: 60544
MB: 1 OVERRUN: 0 ID: 0x4FA EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 61190
MB: 0 OVERRUN: 0 ID: 0x4DD EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 26125
MB: 0 OVERRUN: 0 ID: 0x3DF EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 8C 90 0 2 0 3 0 4 0 5 0 6 82 83 0 8 7F 32 0 A 0 B 0 C 0 D 0 E 0 F 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 1 9A 0 1B 0 1C 0 1D 0 1E 0 1F 0 20 TS: 48925
MB: 1 OVERRUN: 0 ID: 0x4FA EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 49572
MB: 0 OVERRUN: 0 ID: 0x232 EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 11555
MB: 1 OVERRUN: 0 ID: 0x555 EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 16482
MB: 0 OVERRUN: 0 ID: 0x3DF EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 88 8E 0 2 0 3 0 4 0 5 0 6 81 B6 0 8 7F 73 0 A 0 B 0 C 0 D 0 E 0 F 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 1 17 0 1B 0 1C 0 1D 0 1E 0 1F 0 20 TS: 37295
MB: 1 OVERRUN: 0 ID: 0x4FA EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 37940
MB: 0 OVERRUN: 0 ID: 0x3DF EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 84 8A 0 2 0 3 0 4 0 5 0 6 80 E8 0 8 7F B5 0 A 0 B 0 C 0 D 0 E 0 F 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 94 0 1B 0 1C 0 1D 0 1E 0 1F 0 20 TS: 24842
MB: 1 OVERRUN: 0 ID: 0x4FA EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 25489
MB: 0 OVERRUN: 0 ID: 0x3DF EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 80 85 0 2 0 3 0 4 0 5 0 6 80 1A 0 8 7F F6 0 A 0 B 0 C 0 D 0 E 0 F 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 11 0 1B 0 1C 0 1D 0 1E 0 1F 0 20 TS: 12332
MB: 1 OVERRUN: 0 ID: 0x4FA EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 12980
MB: 0 OVERRUN: 0 ID: 0x232 EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 14227
MB: 0 OVERRUN: 0 ID: 0x3DF EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 7C 80 0 2 0 3 0 4 0 5 0 6 7F 4C 0 8 80 38 0 A 0 B 0 C 0 D 0 E 0 F 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 72 0 1B 0 1C 0 1D 0 1E 0 1F 0 20 TS: 253
MB: 1 OVERRUN: 0 ID: 0x4FA EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 901
MB: 0 OVERRUN: 0 ID: 0x3DF EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 78 7B 0 2 0 3 0 4 0 5 0 6 7E 7E 0 8 80 7A 0 A 0 B 0 C 0 D 0 E 0 F 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 F5 0 1B 0 1C 0 1D 0 1E 0 1F 0 20 TS: 53770
MB: 1 OVERRUN: 0 ID: 0x4FA EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 54415
MB: 0 OVERRUN: 0 ID: 0x232 EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 16346
MB: 1 OVERRUN: 0 ID: 0x555 EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 21288
MB: 0 OVERRUN: 0 ID: 0x3DF EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 74 79 0 2 0 3 0 4 0 5 0 6 7D B0 0 8 80 BB 0 A 0 B 0 C 0 D 0 E 0 F 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 1 78 0 1B 0 1C 0 1D 0 1E 0 1F 0 20 TS: 42080
MB: 1 OVERRUN: 0 ID: 0x4FA EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 42724
MB: 0 OVERRUN: 0 ID: 0x3DF EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 70 79 0 2 0 3 0 4 0 5 0 6 7C E2 0 8 80 FD 0 A 0 B 0 C 0 D 0 E 0 F 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 1 FB 0 1B 0 1C 0 1D 0 1E 0 1F 0 20 TS: 29620
MB: 1 OVERRUN: 0 ID: 0x4FA EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 30267
MB: 0 OVERRUN: 0 ID: 0x3DF EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 6C 7D 0 2 0 3 0 4 0 5 0 6 7C 15 0 8 81 3E 0 A 0 B 0 C 0 D 0 E 0 F 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 2 7E 0 1B 0 1C 0 1D 0 1E 0 1F 0 20 TS: 17103
MB: 1 OVERRUN: 0 ID: 0x4FA EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 17751
MB: 2 OVERRUN: 0 ID: 0x232 EXT: 0 LEN: 64 BRS: 1 EDL: 1 DATA: 1 41 10 E1 4 BC 0 E9 E7 29 19 8F 15 32 2 8E FF B9 0 76 FF B9 A8 EB 99 30 C A0 4 C4 7E BB 2F 5B 30 90 D4 3E 15 4E 10 F7 C A0 15 4E 19 A5 19 A5 D9 3 11 5C D 5 8 AE 8 AE 11 67 1A A TS: 18980
通常のCANだと横にこんなに長くならないのですが、流石に64バイトは長い。
とにかく送受信しているチェックなのでデータの内容が正しいかどうかは気にしてませんが、何番目のデータとか数えるだけでもかなりきつそうです。
Teensy4.1に対して送信するデータを増やしていくと、OVERRUNを検出するようです。送信周期を遅くすると少し収まりますが、それでもデータを更に増やしていくとOVERRUNがまたまた再発します。CANFD向けの通信設定は通常のCANの場合と違っているので、それぞれの設定にどういう意味があるのか考えなければなりませんが、なかなか手強そうです。
送信周期もどれくらい遅くするか悩ましいところですが、とりあえず送信CANIDをいっぱい設定してどれくらい周期を遅くしたらOVERRUNが出ないかをチェックしてますが、これまでのCAN通信からするとちょっと遅過ぎるくらいの設定になりそうなんで、基本の通信速度をもっと早くしてみようかとか考え始めています。今回検討しているお試しアイテムとしてはそんなに長距離の通信を想定していないのでボーレートを上げても多分成立します。とは言えOVERRUNはバッファー読み込みが次にやってくる通信に対して間に合わなかったことを意味するのでボーレートを上げることがそもそも解決策になってないような気もするので、ちゃんと理解を深める必要がありそうです。