From 3322d48434b664ef6728e5c940d5c7253980626b Mon Sep 17 00:00:00 2001 From: Syed Asad Amin Date: Tue, 3 Aug 2021 21:25:27 +0500 Subject: [PATCH 1/2] Added support for One-Shot Mode (OSM) --- mcp2515.cpp | 11 +++++++++++ mcp2515.h | 5 +++++ 2 files changed, 16 insertions(+) diff --git a/mcp2515.cpp b/mcp2515.cpp index 6b86fb9..d1fa579 100644 --- a/mcp2515.cpp +++ b/mcp2515.cpp @@ -172,6 +172,9 @@ MCP2515::ERROR MCP2515::setNormalMode() MCP2515::ERROR MCP2515::setMode(const CANCTRL_REQOP_MODE mode) { + // Check for oneshot mode. + mode = osmFlag ? mode | CANCTRL_OSM : mode & ~(CANCTRL_OSM); + modifyRegister(MCP_CANCTRL, CANCTRL_REQOP, mode); unsigned long endTime = millis() + 10; @@ -764,3 +767,11 @@ uint8_t MCP2515::errorCountTX(void) { return readRegister(MCP_TEC); } + +void MCP2515::enableOSM(void) { + osmFlag = true; +} + +void MCP2515::disableOSM(void) { + osmFlag = false; +} diff --git a/mcp2515.h b/mcp2515.h index 5d9bef7..83bc87f 100644 --- a/mcp2515.h +++ b/mcp2515.h @@ -443,6 +443,7 @@ class MCP2515 } RXB[N_RXBUFFERS]; uint8_t SPICS; + bool osmFlag = false; private: @@ -490,6 +491,10 @@ class MCP2515 void clearERRIF(); uint8_t errorCountRX(void); uint8_t errorCountTX(void); + + // ONE SHOT MODE + void enableOSM(void); + void disableOSM(void); }; #endif From 596d8b0ddbac509c6b35fe1d565199910c0d55dd Mon Sep 17 00:00:00 2001 From: Syed Asad Amin Date: Fri, 6 Aug 2021 16:37:13 +0500 Subject: [PATCH 2/2] Bug fix for One-Shot Mode (OSM) support. --- mcp2515.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mcp2515.cpp b/mcp2515.cpp index d1fa579..90ef421 100644 --- a/mcp2515.cpp +++ b/mcp2515.cpp @@ -173,10 +173,13 @@ MCP2515::ERROR MCP2515::setNormalMode() MCP2515::ERROR MCP2515::setMode(const CANCTRL_REQOP_MODE mode) { // Check for oneshot mode. - mode = osmFlag ? mode | CANCTRL_OSM : mode & ~(CANCTRL_OSM); + uint8_t mcpMode = osmFlag ? mode | CANCTRL_OSM : mode & ~(CANCTRL_OSM); - modifyRegister(MCP_CANCTRL, CANCTRL_REQOP, mode); + // Writing CANCTRL register. + modifyRegister(MCP_CANCTRL, CANCTRL_REQOP, mcpMode); + // Checking from CANSTAT register only confirms the main working modes, + // and interrupts. Bit 4 is unimplemented. unsigned long endTime = millis() + 10; bool modeMatch = false; while (millis() < endTime) {