-
Notifications
You must be signed in to change notification settings - Fork 17
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
1.0.4 : fixed mask and acceptance filter for extended messages
- Loading branch information
1 parent
7e55d6e
commit 0070c13
Showing
5 changed files
with
268 additions
and
5 deletions.
There are no files selected for viewing
123 changes: 123 additions & 0 deletions
123
examples/LoopBackDemoTeensy3xExtendedFilterTest/LoopBackDemoTeensy3xExtendedFilterTest.ino
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
//—————————————————————————————————————————————————————————————————————————————— | ||
// ACAN2517FD Filter Demo in loopback mode, using hardware SPI1 | ||
// This sketch tests extended receive filters | ||
//—————————————————————————————————————————————————————————————————————————————— | ||
|
||
#include <ACAN2517FD.h> | ||
|
||
//—————————————————————————————————————————————————————————————————————————————— | ||
// MCP2517 connections: adapt theses settings to your design | ||
// As hardware SPI is used, you should select pins that support SPI functions. | ||
// This sketch is designed for a Teensy 3.5, using SPI1 | ||
// But standard Teensy 3.5 SPI1 pins are not used | ||
// SCK input of MCP2517 is connected to pin #32 | ||
// SDI input of MCP2517 is connected to pin #0 | ||
// SDO output of MCP2517 is connected to pin #1 | ||
// CS input of MCP2517 should be connected to a digital output port | ||
// INT output of MCP2517 should be connected to a digital input port, with interrupt capability | ||
//—————————————————————————————————————————————————————————————————————————————— | ||
|
||
static const byte MCP2517_SCK = 32 ; // SCK input of MCP2517 | ||
static const byte MCP2517_SDI = 0 ; // SDI input of MCP2517 | ||
static const byte MCP2517_SDO = 1 ; // SDO output of MCP2517 | ||
|
||
static const byte MCP2517_CS = 31 ; // CS input of MCP2517 | ||
static const byte MCP2517_INT = 38 ; // INT output of MCP2517 | ||
|
||
//—————————————————————————————————————————————————————————————————————————————— | ||
// MCP2517 Driver object | ||
//—————————————————————————————————————————————————————————————————————————————— | ||
|
||
ACAN2517FD can (MCP2517_CS, SPI1, MCP2517_INT) ; | ||
|
||
//—————————————————————————————————————————————————————————————————————————————— | ||
// SETUP | ||
//—————————————————————————————————————————————————————————————————————————————— | ||
|
||
void setup () { | ||
//--- Switch on builtin led | ||
pinMode (LED_BUILTIN, OUTPUT) ; | ||
digitalWrite (LED_BUILTIN, HIGH) ; | ||
//--- Start serial | ||
Serial.begin (38400) ; | ||
//--- Wait for serial (blink led at 10 Hz during waiting) | ||
while (!Serial) { | ||
delay (50) ; | ||
digitalWrite (LED_BUILTIN, !digitalRead (LED_BUILTIN)) ; | ||
} | ||
//----------------------------------- Define alternate pins for SPI1 (see https://www.pjrc.com/teensy/td_libs_SPI.html) | ||
SPI1.setMOSI (MCP2517_SDI) ; | ||
SPI1.setMISO (MCP2517_SDO) ; | ||
SPI1.setSCK (MCP2517_SCK) ; | ||
//----------------------------------- Begin SPI1 | ||
SPI1.begin () ; | ||
//----------------------------------- Configure ACAN2517FD | ||
Serial.println ("Configure ACAN2517FD") ; | ||
ACAN2517FDSettings settings (ACAN2517FDSettings::OSC_4MHz10xPLL, 125 * 1000, ACAN2517FDSettings::DATA_BITRATE_x4) ; // CAN bit rate 125 kb/s | ||
settings.mRequestedMode = ACAN2517FDSettings::InternalLoopBack; // Select loopback mode | ||
//----------------------------------- Append filters | ||
ACAN2517FDFilters filters ; | ||
for (uint32_t i=0 ; i<29 ; i++) { | ||
filters.appendFrameFilter (kExtended, 1 << i, NULL) ; // Filter #i: receive extended frame with identifier 1 << i | ||
} | ||
//----------------------------------- Enter configuration | ||
const uint32_t errorCode = can.begin (settings, [] { can.isr () ; }, filters) ; | ||
//----------------------------------- Config ok ? | ||
if (errorCode != 0) { | ||
Serial.print ("Configuration error 0x") ; | ||
Serial.println (errorCode, HEX) ; | ||
} | ||
} | ||
|
||
//—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— | ||
|
||
static unsigned gBlinkLedDate = 0 ; | ||
static uint32_t gPhase = 0 ; | ||
static uint32_t gReceiveFlags = (1 << 29) - 1 ; | ||
|
||
//—————————————————————————————————————————————————————————————————————————————— | ||
|
||
void loop () { | ||
CANFDMessage frame ; | ||
if (gBlinkLedDate < millis ()) { | ||
gBlinkLedDate += 100 ; | ||
digitalWrite (LED_BUILTIN, !digitalRead (LED_BUILTIN)) ; | ||
if (gPhase < 29) { | ||
frame.ext = true ; | ||
frame.id = 1 << gPhase ; | ||
frame.data32 [0] = 1 << gPhase ; | ||
frame.len = 4 ; | ||
const bool ok = can.tryToSend (frame) ; | ||
if (ok) { | ||
gPhase +=1 ; | ||
} | ||
} | ||
} | ||
//--- Dispatch received messages | ||
if (can.receive (frame)) { | ||
bool ok = (frame.len == 4) && frame.ext ; | ||
if (ok) { | ||
ok = frame.data32 [0] == (1U << frame.idx) ; | ||
} | ||
if (!ok) { | ||
Serial.print ("Receive error: idx ") ; | ||
Serial.print (frame.idx) ; | ||
Serial.print (", data ") ; | ||
Serial.print (frame.data32 [0], HEX) ; | ||
Serial.print (", length ") ; | ||
Serial.print (frame.len) ; | ||
Serial.print (", ext ") ; | ||
Serial.println (frame.ext) ; | ||
}else if ((gReceiveFlags & (1 << frame.idx)) == 0) { | ||
Serial.print ("Multiple reception ") ; | ||
Serial.println (frame.idx) ; | ||
}else{ | ||
gReceiveFlags &= ~ (1 << frame.idx) ; | ||
if (gReceiveFlags == 0) { | ||
Serial.println ("Done, all extended frames received") ; | ||
} | ||
} | ||
} | ||
} | ||
|
||
//—————————————————————————————————————————————————————————————————————————————— |
123 changes: 123 additions & 0 deletions
123
examples/LoopBackDemoTeensy3xStandardFilterTest/LoopBackDemoTeensy3xStandardFilterTest.ino
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
//—————————————————————————————————————————————————————————————————————————————— | ||
// ACAN2517FD Filter Demo in loopback mode, using hardware SPI1 | ||
// This sketch tests standard receive filters | ||
//—————————————————————————————————————————————————————————————————————————————— | ||
|
||
#include <ACAN2517FD.h> | ||
|
||
//—————————————————————————————————————————————————————————————————————————————— | ||
// MCP2517 connections: adapt theses settings to your design | ||
// As hardware SPI is used, you should select pins that support SPI functions. | ||
// This sketch is designed for a Teensy 3.5, using SPI1 | ||
// But standard Teensy 3.5 SPI1 pins are not used | ||
// SCK input of MCP2517 is connected to pin #32 | ||
// SDI input of MCP2517 is connected to pin #0 | ||
// SDO output of MCP2517 is connected to pin #1 | ||
// CS input of MCP2517 should be connected to a digital output port | ||
// INT output of MCP2517 should be connected to a digital input port, with interrupt capability | ||
//—————————————————————————————————————————————————————————————————————————————— | ||
|
||
static const byte MCP2517_SCK = 32 ; // SCK input of MCP2517 | ||
static const byte MCP2517_SDI = 0 ; // SDI input of MCP2517 | ||
static const byte MCP2517_SDO = 1 ; // SDO output of MCP2517 | ||
|
||
static const byte MCP2517_CS = 31 ; // CS input of MCP2517 | ||
static const byte MCP2517_INT = 38 ; // INT output of MCP2517 | ||
|
||
//—————————————————————————————————————————————————————————————————————————————— | ||
// MCP2517 Driver object | ||
//—————————————————————————————————————————————————————————————————————————————— | ||
|
||
ACAN2517FD can (MCP2517_CS, SPI1, MCP2517_INT) ; | ||
|
||
//—————————————————————————————————————————————————————————————————————————————— | ||
// SETUP | ||
//—————————————————————————————————————————————————————————————————————————————— | ||
|
||
void setup () { | ||
//--- Switch on builtin led | ||
pinMode (LED_BUILTIN, OUTPUT) ; | ||
digitalWrite (LED_BUILTIN, HIGH) ; | ||
//--- Start serial | ||
Serial.begin (38400) ; | ||
//--- Wait for serial (blink led at 10 Hz during waiting) | ||
while (!Serial) { | ||
delay (50) ; | ||
digitalWrite (LED_BUILTIN, !digitalRead (LED_BUILTIN)) ; | ||
} | ||
//----------------------------------- Define alternate pins for SPI1 (see https://www.pjrc.com/teensy/td_libs_SPI.html) | ||
SPI1.setMOSI (MCP2517_SDI) ; | ||
SPI1.setMISO (MCP2517_SDO) ; | ||
SPI1.setSCK (MCP2517_SCK) ; | ||
//----------------------------------- Begin SPI1 | ||
SPI1.begin () ; | ||
//----------------------------------- Configure ACAN2517FD | ||
Serial.println ("Configure ACAN2517FD") ; | ||
ACAN2517FDSettings settings (ACAN2517FDSettings::OSC_4MHz10xPLL, 125 * 1000, ACAN2517FDSettings::DATA_BITRATE_x4) ; | ||
settings.mRequestedMode = ACAN2517FDSettings::InternalLoopBack; // Select loopback mode | ||
//----------------------------------- Append filters | ||
ACAN2517FDFilters filters ; | ||
for (uint32_t i=0 ; i<11 ; i++) { | ||
filters.appendFrameFilter (kStandard, 1 << i, NULL) ; // Filter #i: receive standard frame with identifier 1 << i | ||
} | ||
//----------------------------------- Enter configuration | ||
const uint32_t errorCode = can.begin (settings, [] { can.isr () ; }, filters) ; | ||
//----------------------------------- Config ok ? | ||
if (errorCode != 0) { | ||
Serial.print ("Configuration error 0x") ; | ||
Serial.println (errorCode, HEX) ; | ||
} | ||
} | ||
|
||
//—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— | ||
|
||
static unsigned gBlinkLedDate = 0 ; | ||
static uint32_t gPhase = 0 ; | ||
static uint32_t gReceiveFlags = (1 << 11) - 1 ; | ||
|
||
//—————————————————————————————————————————————————————————————————————————————— | ||
|
||
void loop () { | ||
CANFDMessage frame ; | ||
if (gBlinkLedDate < millis ()) { | ||
gBlinkLedDate += 100 ; | ||
digitalWrite (LED_BUILTIN, !digitalRead (LED_BUILTIN)) ; | ||
if (gPhase < 11) { | ||
frame.ext = false ; | ||
frame.id = 1 << gPhase ; | ||
frame.data32 [0] = 1 << gPhase ; | ||
frame.len = 4 ; | ||
const bool ok = can.tryToSend (frame) ; | ||
if (ok) { | ||
gPhase +=1 ; | ||
} | ||
} | ||
} | ||
//--- Dispatch received messages | ||
if (can.receive (frame)) { | ||
bool ok = (frame.len == 4) && !frame.ext ; | ||
if (ok) { | ||
ok = frame.data32 [0] == (1U << frame.idx) ; | ||
} | ||
if (!ok) { | ||
Serial.print ("Receive error: idx ") ; | ||
Serial.print (frame.idx) ; | ||
Serial.print (", data ") ; | ||
Serial.print (frame.data32 [0], HEX) ; | ||
Serial.print (", length ") ; | ||
Serial.print (frame.len) ; | ||
Serial.print (", ext ") ; | ||
Serial.println (frame.ext) ; | ||
}else if ((gReceiveFlags & (1 << frame.idx)) == 0) { | ||
Serial.print ("Multiple reception ") ; | ||
Serial.println (frame.idx) ; | ||
}else{ | ||
gReceiveFlags &= ~ (1 << frame.idx) ; | ||
if (gReceiveFlags == 0) { | ||
Serial.println ("Done, all standard frames received") ; | ||
} | ||
} | ||
} | ||
} | ||
|
||
//—————————————————————————————————————————————————————————————————————————————— |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters