前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー