質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

9059閲覧

ArduinoでCAN-FD通信のやり方について

Alyn

総合スコア50

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

1クリップ

投稿2020/04/02 13:01

編集2020/06/18 00:25

前提・実現したいこと

Arduino UnoでCAN-FDの送受信をしたいです。
ボーレートは250kbps, データレートは2Mbpsです。(4Mbpsは設定できなかったため修正)
コントローラはMCP2517FD、トランシーバはMCP2562FDを使います。

ACAN2517FDというライブラリにあるLoopBackDemoArduinoUno.inoを参考にソースを作りました。
しかしながらループバックモードでは送受信するのにノーマルモードでは送受信できませんでした(専用のツールで確認)。
でも関数の返値は送信成功になっていました。

ソースコードに誤りがあるのかライブラリに誤りがあるのかわからないので、改善方法を教えてください。
もしくはCAN-BUS Shieldライブラリくらい簡単に記述されたCAN-FDライブラリがございましたら教えてください。

該当のソースコード

Arduino

1#include <ACAN2517FD.h> 2#include <SPI.h> 3//—————————————————————————————————————————————————————————————————————————————— 4// Very very important: put a 10kΩ resistor between CS and VDD of MCP2517FD 5 6static const byte MCP2517_CS = 10 ; // CS input of MCP2517 7static const byte MCP2517_INT = 2 ; // INT output of MCP2517 8 9//—————————————————————————————————————————————————————————————————————————————— 10// ACAN2517FD Driver object 11//—————————————————————————————————————————————————————————————————————————————— 12 13ACAN2517FD can (MCP2517_CS, SPI, MCP2517_INT) ; 14 15//—————————————————————————————————————————————————————————————————————————————— 16// SETUP 17//—————————————————————————————————————————————————————————————————————————————— 18 19void setup() 20{ 21//--- Start serial 22 Serial.begin(115200) ; 23 24//--- Wait for serial (blink led at 10 Hz during waiting) 25 while(!Serial) 26 { 27 delay(50) ; 28 } 29//----------------------------------- Begin SPI 30 SPI.begin() ; 31 32//--- Configure ACAN2517FD 33 Serial.print("sizeof(ACAN2517FDSettings): ") ; 34 Serial.print(sizeof(ACAN2517FDSettings)) ; 35 Serial.println(" bytes") ; 36 Serial.println("Configure ACAN2517FD") ; 37 38 ACAN2517FDSettings settings(ACAN2517FDSettings::OSC_20MHz, 250UL * 1000UL, DataBitRateFactor::x8) ; //クロック20MHz, ボーレート250kbps, データレート2Mbps 39 40 settings.mRequestedMode = ACAN2517FDSettings::NormalFD ; // ノーマルモード 41 42//--- Default values are too high for an Arduino Uno that contains 2048 bytes of RAM: reduce them 43 settings.mDriverTransmitFIFOSize = 1 ; 44 settings.mDriverReceiveFIFOSize = 1 ; 45 46//--- RAM Usage 47 Serial.print("MCP2517FD RAM Usage: ") ; 48 Serial.print(settings.ramUsage ()) ; 49 Serial.println(" bytes") ; 50 51//--- Begin 52 const uint32_t errorCode = can.begin (settings, [] { can.isr () ; }) ; 53 if(errorCode == 0) 54 { 55 Serial.print("Bit Rate prescaler: ") ; 56 Serial.println(settings.mBitRatePrescaler) ; 57 Serial.print("Arbitration Phase segment 1: ") ; 58 Serial.println(settings.mArbitrationPhaseSegment1) ; 59 Serial.print("Arbitration Phase segment 2: ") ; 60 Serial.println(settings.mArbitrationPhaseSegment2) ; 61 Serial.print("Arbitration SJW:") ; 62 Serial.println(settings.mArbitrationSJW) ; 63 Serial.print("Actual Arbitration Bit Rate: ") ; 64 Serial.print(settings.actualArbitrationBitRate ()) ; 65 Serial.println(" bit/s") ; 66 Serial.print("Exact Arbitration Bit Rate ? ") ; 67 Serial.println(settings.exactArbitrationBitRate () ? "yes" : "no") ; 68 Serial.print("Arbitration Sample point: ") ; 69 Serial.print(settings.arbitrationSamplePointFromBitStart ()) ; 70 Serial.println("%") ; 71 } 72 else 73 { 74 Serial.print("Configuration error 0x") ; 75 Serial.println(errorCode, HEX) ; 76 } 77} 78 79//—————————————————————————————————————————————————————————————————————————————— 80// LOOP 81//—————————————————————————————————————————————————————————————————————————————— 82 83static uint32_t gSendDate = 0 ; 84static uint32_t gReceivedFrameCount = 0 ; 85static uint32_t gSentFrameCount = 0 ; 86 87//—————————————————————————————————————————————————————————————————————————————— 88 89void loop() 90{ 91 CANFDMessage frame ; 92 93 if(gSendDate < millis ()) 94 { 95 gSendDate += 2000 ; 96 const bool ok = can.tryToSend (frame) ; 97 if(ok) 98 { 99 gSentFrameCount += 1 ; 100 Serial.print ("Sent: ") ; 101 Serial.println (gSentFrameCount) ; 102 } 103 else 104 { 105 Serial.println ("Send failure") ; 106 } 107 } 108 if(can.available()) 109 { 110 can.receive(frame) ; 111 gReceivedFrameCount++ ; 112 Serial.print("Received: ") ; 113 Serial.println(gReceivedFrameCount) ; 114 } 115} 116 117//——————————————————————————————————————————————————————————————————————————————

シリアルモニタ

Senent: 13
sizeof(ACAN2517FDSettings): 40 bytes
Configure ACAN2517FD
MCP2517FD RAM Usage: 2016 bytes
Bit Rate prescaler: 1
Arbitration Phase segment 1: 63
Arbitration Phase segment 2: 16
Arbitration SJW:16
Actual Arbitration Bit Rate: 250000 bit/s
Exact Arbitration Bit Rate ? yes
Arbitration Sample point: 80%
Sent: 1
Sent: 2
Sent: 3
Sent: 4
Sent: 5


補足情報

<ACAN2517FDライブラリ>
https://github.com/pierremolinaro/acan2517FD
https://github.com/pierremolinaro/acan2517FD/blob/master/extras/acan2517FD.pdf

<コントローラ MCP2517FD>
http://ww1.microchip.com/downloads/jp/DeviceDoc/20005688B_JP.pdf

<トランシーバ MCP2562FD>
http://ww1.microchip.com/downloads/jp/DeviceDoc/20005284A_JP.pdf

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/04/02 14:02

通信の確認はどのように行ったんでしょうか。 専用のツールとは何でしょう
Alyn

2020/04/02 14:05

Vector製品のツールで行いました。名前は忘れてしまいました。
mt08

2020/04/07 06:44

オシロで波形取れませんか?
mt08

2020/04/07 06:48

あと、120Ωのターミナルレジスタつけてますか?
guest

回答1

0

自己解決

送信ができない原因が判明しました。CANトランシーバのSTBYピンがHIGHになっていたため、スタンバイモードになっていました。
これを無理矢理GNDに接触させたら通信できるようになりました。
CANコントローラからスタンバイモードを解除する方法を調べようと思います。

投稿2020/06/09 13:42

Alyn

総合スコア50

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問