From a1bd360907eb41fa3d00f18c46e019a4b8e57dec Mon Sep 17 00:00:00 2001 From: Anton N Date: Sun, 15 Jan 2017 22:53:06 +0300 Subject: [PATCH 01/10] Allow to change clock for MCP2515 in order to support mcp2515+TJA1080 shields and modules --- CanHacker.cpp | 6 +++++- CanHacker.h | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CanHacker.cpp b/CanHacker.cpp index d27bb59..4c1bc75 100644 --- a/CanHacker.cpp +++ b/CanHacker.cpp @@ -54,8 +54,12 @@ Stream *CanHacker::getInterfaceStream() { return _stream; } +void CanHacker::setClock(uint8_t clock){ + canClock = clock; +} + CanHacker::ERROR CanHacker::connectCan() { - MCP2515::ERROR error = mcp2515->setBitrate(bitrate); + MCP2515::ERROR error = mcp2515->setBitrate(bitrate, canClock); if (error != MCP2515::ERROR_OK) { writeDebugStream(F("setBitrate error:\n")); writeDebugStream((int)error); diff --git a/CanHacker.h b/CanHacker.h index cc1cf82..8ddc871 100644 --- a/CanHacker.h +++ b/CanHacker.h @@ -47,6 +47,7 @@ class CanHacker { CanHacker(Stream *stream, Stream *debugStream, uint8_t cs); ~CanHacker(); + void setClock(const uint8_t clock); ERROR receiveCommand(const char *buffer, const int length); ERROR receiveCanFrame(const struct can_frame *frame); ERROR sendFrame(const struct can_frame *); @@ -64,6 +65,7 @@ class CanHacker { static const char BEL = 7; static const uint16_t TIMESTAMP_LIMIT = 0xEA60; + uint8_t canClock = MCP_16MHZ; bool _timestampEnabled = false; bool _listenOnly = false; bool _loopback = false; From fadd3176c81fab48b474ae88ebc68c0eb5f18ccf Mon Sep 17 00:00:00 2001 From: Anton N Date: Mon, 16 Jan 2017 13:48:07 +0300 Subject: [PATCH 02/10] Use enum CAN_CLOCK --- CanHacker.cpp | 2 +- CanHacker.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CanHacker.cpp b/CanHacker.cpp index 4c1bc75..734764a 100644 --- a/CanHacker.cpp +++ b/CanHacker.cpp @@ -54,7 +54,7 @@ Stream *CanHacker::getInterfaceStream() { return _stream; } -void CanHacker::setClock(uint8_t clock){ +void CanHacker::setClock(CAN_CLOCK clock){ canClock = clock; } diff --git a/CanHacker.h b/CanHacker.h index 8ddc871..1e79947 100644 --- a/CanHacker.h +++ b/CanHacker.h @@ -47,7 +47,7 @@ class CanHacker { CanHacker(Stream *stream, Stream *debugStream, uint8_t cs); ~CanHacker(); - void setClock(const uint8_t clock); + void setClock(const CAN_CLOCK clock); ERROR receiveCommand(const char *buffer, const int length); ERROR receiveCanFrame(const struct can_frame *frame); ERROR sendFrame(const struct can_frame *); @@ -65,7 +65,7 @@ class CanHacker { static const char BEL = 7; static const uint16_t TIMESTAMP_LIMIT = 0xEA60; - uint8_t canClock = MCP_16MHZ; + CAN_CLOCK canClock = MCP_16MHZ; bool _timestampEnabled = false; bool _listenOnly = false; bool _loopback = false; From db88896ed5eaa053b534a4d5828b6f63ff0f4a3a Mon Sep 17 00:00:00 2001 From: Anton N Date: Mon, 16 Jan 2017 13:57:40 +0300 Subject: [PATCH 03/10] Update documentation --- README.md | 1 + docs/en/README.md | 1 + docs/ru/README.md | 1 + 3 files changed, 3 insertions(+) diff --git a/README.md b/README.md index 35f131d..f527547 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ Implement communication with CAN bus via MCP2515 by CanHacker (lawicel) protocol - supports filter by ID (mask + code) - interface using [Stream](https://www.arduino.cc/en/Reference/Stream): ability to work with Serial, SoftwareSerial, Ethernet and other - supported can baudrates from 10Kbps up to 1Mbps +- supported modules with different oscillators (8, 16, 20 MHZ), 16 MHZ is default, use setClock if your oscillator is not 16MHZ - support [CanHacker](http://www.mictronics.de/projects/usb-can-bus/) (application for Windows) - support [CANreader](https://github.com/autowp/CANreader) (application for Android) diff --git a/docs/en/README.md b/docs/en/README.md index aaf86eb..7015117 100644 --- a/docs/en/README.md +++ b/docs/en/README.md @@ -12,6 +12,7 @@ Implement communication with CAN bus via MCP2515 by CanHacker (lawicel) protocol - supports filter by ID (mask + code) - interface using [Stream](https://www.arduino.cc/en/Reference/Stream): ability to work with Serial, SoftwareSerial, Ethernet and other - supported can baudrates from 10Kbps up to 1Mbps +- supported modules with different oscillators (8, 16, 20 MHZ), 16 MHZ is default, use setClock if your oscillator is not 16MHZ - support [CanHacker](http://www.mictronics.de/projects/usb-can-bus/) (application for Windows) - support [CANreader](https://github.com/autowp/CANreader) (application for Android) diff --git a/docs/ru/README.md b/docs/ru/README.md index fe44357..ca49ba9 100644 --- a/docs/ru/README.md +++ b/docs/ru/README.md @@ -12,6 +12,7 @@ - поддержка фильтра по ID (маска + код) - интерфейс, работающий со [Stream](https://www.arduino.cc/en/Reference/Stream): возможность работы с Serial, SoftwareSerial, Ethernet и другими интерфейсами - поддерживаемые скорости can шины от 10Kbps до 1Mbps +- поддерживаются модули с разными кварцами - 8, 16, 20 МГц. По умолчанию установлена частота 16 МГц, используйте функцию setClock если у вас модуль с другим кварцем. - поддержка [CanHacker](http://www.mictronics.de/projects/usb-can-bus/) (приложение для Windows) - поддержка [CANreader](https://github.com/autowp/CANreader) (приложение для Android) From 9c51655c1beef958916ca1921d2d90ab2504145c Mon Sep 17 00:00:00 2001 From: Dmitry Date: Fri, 12 Jan 2018 14:35:38 +0300 Subject: [PATCH 04/10] MHZ -> MHz --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f527547..08d0149 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Implement communication with CAN bus via MCP2515 by CanHacker (lawicel) protocol - supports filter by ID (mask + code) - interface using [Stream](https://www.arduino.cc/en/Reference/Stream): ability to work with Serial, SoftwareSerial, Ethernet and other - supported can baudrates from 10Kbps up to 1Mbps -- supported modules with different oscillators (8, 16, 20 MHZ), 16 MHZ is default, use setClock if your oscillator is not 16MHZ +- supported modules with different oscillators (8, 16, 20 MHz), 16 MHz is default, use setClock if your oscillator is not 16MHz - support [CanHacker](http://www.mictronics.de/projects/usb-can-bus/) (application for Windows) - support [CANreader](https://github.com/autowp/CANreader) (application for Android) @@ -34,4 +34,4 @@ On Arduino Uno have problem with too long boot period and losing first command ## Contributing -Feel free to open issues, create pull requests and other contributions \ No newline at end of file +Feel free to open issues, create pull requests and other contributions From a5f08c62ac85a2ea5c42de1744032cafc1159bdd Mon Sep 17 00:00:00 2001 From: TheRo0T Date: Thu, 3 May 2018 23:06:11 +0400 Subject: [PATCH 05/10] Add example for Arduino Leonardo --- .../leonardo_cdc/leonardo_cdc.ino | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 examples/leonardo_cdc/leonardo_cdc/leonardo_cdc.ino diff --git a/examples/leonardo_cdc/leonardo_cdc/leonardo_cdc.ino b/examples/leonardo_cdc/leonardo_cdc/leonardo_cdc.ino new file mode 100644 index 0000000..ff45ade --- /dev/null +++ b/examples/leonardo_cdc/leonardo_cdc/leonardo_cdc.ino @@ -0,0 +1,67 @@ +#include +#include + +#include +#include +#include + +#include + +const int SPI_CS_PIN = 10; +const int INT_PIN = 3; + + +CanHackerLineReader *lineReader = NULL; +CanHacker *canHacker = NULL; + +void handleError(const CanHacker::ERROR error); + +void setup() { + Serial.begin(115200); + SPI.begin(); + + Stream *interfaceStream = &Serial; + Stream *debugStream = &Serial; + + + canHacker = new CanHacker(interfaceStream, debugStream, SPI_CS_PIN); + canHacker->enableLoopback(); + lineReader = new CanHackerLineReader(canHacker); + + pinMode(INT_PIN, INPUT); +} + +void loop() { + if (digitalRead(INT_PIN) == LOW) { + CanHacker::ERROR error = canHacker->processInterrupt(); + handleError(error); + } + if (Serial.available()) { + CanHacker::ERROR error = lineReader->process(); + handleError(error); + } +} + + +void handleError(const CanHacker::ERROR error) { + + switch (error) { + case CanHacker::ERROR_OK: + case CanHacker::ERROR_UNKNOWN_COMMAND: + case CanHacker::ERROR_NOT_CONNECTED: + case CanHacker::ERROR_MCP2515_ERRIF: + case CanHacker::ERROR_INVALID_COMMAND: + return; + + default: + break; + } + + Serial.print("Failure (code "); + Serial.print((int)error); + Serial.println(")"); + + while (1) { + delay(2000); + } ; +} From 38978cb648316ed202ae1aa61026ab5b9aa44aa4 Mon Sep 17 00:00:00 2001 From: TheRo0T Date: Thu, 3 May 2018 23:30:56 +0400 Subject: [PATCH 06/10] small fix --- .../leonardo_cdc/leonardo_cdc.ino | 29 +------------------ 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/examples/leonardo_cdc/leonardo_cdc/leonardo_cdc.ino b/examples/leonardo_cdc/leonardo_cdc/leonardo_cdc.ino index ff45ade..e0e1d1d 100644 --- a/examples/leonardo_cdc/leonardo_cdc/leonardo_cdc.ino +++ b/examples/leonardo_cdc/leonardo_cdc/leonardo_cdc.ino @@ -14,8 +14,6 @@ const int INT_PIN = 3; CanHackerLineReader *lineReader = NULL; CanHacker *canHacker = NULL; -void handleError(const CanHacker::ERROR error); - void setup() { Serial.begin(115200); SPI.begin(); @@ -25,7 +23,7 @@ void setup() { canHacker = new CanHacker(interfaceStream, debugStream, SPI_CS_PIN); - canHacker->enableLoopback(); + canHacker->enableLoopback(); // Enable Loopback mode for offline tests lineReader = new CanHackerLineReader(canHacker); pinMode(INT_PIN, INPUT); @@ -34,34 +32,9 @@ void setup() { void loop() { if (digitalRead(INT_PIN) == LOW) { CanHacker::ERROR error = canHacker->processInterrupt(); - handleError(error); } if (Serial.available()) { CanHacker::ERROR error = lineReader->process(); - handleError(error); } } - -void handleError(const CanHacker::ERROR error) { - - switch (error) { - case CanHacker::ERROR_OK: - case CanHacker::ERROR_UNKNOWN_COMMAND: - case CanHacker::ERROR_NOT_CONNECTED: - case CanHacker::ERROR_MCP2515_ERRIF: - case CanHacker::ERROR_INVALID_COMMAND: - return; - - default: - break; - } - - Serial.print("Failure (code "); - Serial.print((int)error); - Serial.println(")"); - - while (1) { - delay(2000); - } ; -} From e6c525a166f1cb34f3243555af0d2b915cf0301f Mon Sep 17 00:00:00 2001 From: Dmitry Date: Thu, 3 May 2018 22:34:28 +0300 Subject: [PATCH 07/10] Smiplify Leonardo example --- examples/leonardo_cdc/leonardo_cdc/leonardo_cdc.ino | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/examples/leonardo_cdc/leonardo_cdc/leonardo_cdc.ino b/examples/leonardo_cdc/leonardo_cdc/leonardo_cdc.ino index e0e1d1d..b90fdf2 100644 --- a/examples/leonardo_cdc/leonardo_cdc/leonardo_cdc.ino +++ b/examples/leonardo_cdc/leonardo_cdc/leonardo_cdc.ino @@ -17,12 +17,8 @@ CanHacker *canHacker = NULL; void setup() { Serial.begin(115200); SPI.begin(); - - Stream *interfaceStream = &Serial; - Stream *debugStream = &Serial; - - canHacker = new CanHacker(interfaceStream, debugStream, SPI_CS_PIN); + canHacker = new CanHacker(&Serial, NULL, SPI_CS_PIN); canHacker->enableLoopback(); // Enable Loopback mode for offline tests lineReader = new CanHackerLineReader(canHacker); @@ -31,10 +27,10 @@ void setup() { void loop() { if (digitalRead(INT_PIN) == LOW) { - CanHacker::ERROR error = canHacker->processInterrupt(); + canHacker->processInterrupt(); } if (Serial.available()) { - CanHacker::ERROR error = lineReader->process(); + lineReader->process(); } } From c3046340bce2d4614ec26fc59d731c74adee0719 Mon Sep 17 00:00:00 2001 From: Alberto Panu Date: Tue, 13 Nov 2018 20:57:20 +0100 Subject: [PATCH 08/10] Update README.md Compiled with Arduino 1.8.7 removed an error. --- docs/en/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/en/README.md b/docs/en/README.md index 7015117..95150da 100644 --- a/docs/en/README.md +++ b/docs/en/README.md @@ -50,11 +50,10 @@ void setup() { Serial.begin(115200); while (!Serial); SPI.begin(); - softwareSerial.begin(115200); Stream *interfaceStream = &Serial; - canHacker = new CanHacker(interfaceStream, null, SPI_CS_PIN); + canHacker = new CanHacker(interfaceStream, NULL, SPI_CS_PIN); lineReader = new CanHackerLineReader(canHacker); pinMode(INT_PIN, INPUT); From c3b356c991c103c9705cc4530de70b9a07799abf Mon Sep 17 00:00:00 2001 From: Vladimir Dronnikov Date: Sat, 14 Aug 2021 14:21:24 +0300 Subject: [PATCH 09/10] Fix errors for ESP32 flavor --- CanHackerLineReader.h | 1 + 1 file changed, 1 insertion(+) diff --git a/CanHackerLineReader.h b/CanHackerLineReader.h index 6bfd96c..dc37940 100644 --- a/CanHackerLineReader.h +++ b/CanHackerLineReader.h @@ -1,6 +1,7 @@ #ifndef CANHACKERLINEREADER_H_ #define CANHACKERLINEREADER_H_ +#include "Stream.h" #include "CanHacker.h" class CanHackerLineReader { From 63694b6219d27bc4d9f89a85ada38cbef7bec47f Mon Sep 17 00:00:00 2001 From: lordware <82336845+lordware@users.noreply.github.com> Date: Fri, 19 Jan 2024 14:37:19 +0100 Subject: [PATCH 10/10] Update protocol.md fixes a spelling mistake --- docs/en/protocol.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/protocol.md b/docs/en/protocol.md index 16102a5..27b7de1 100644 --- a/docs/en/protocol.md +++ b/docs/en/protocol.md @@ -1,6 +1,6 @@ Protocol CanHacker (lawicel) described in [CanHacker for Windows documentation](http://www.mictronics.de/projects/usb-can-bus/) -Library implements it partially. Suported commands listed below. +Library implements it partially. Supported commands listed below. ### `C[CR]` @@ -188,4 +188,4 @@ i - ID bytes (000-7FF) or (00000000-1FFFFFFF) L - Data length code (0-8) DD - Data bytes (00-FF) ssss - Optinal time stamp (0000-EA5F) -``` \ No newline at end of file +```