From cbcad4a79169347a441e6b30f09c07d91dbb2eba Mon Sep 17 00:00:00 2001 From: Zak Kemble Date: Wed, 2 Aug 2017 20:25:06 +0100 Subject: [PATCH 01/11] Keep serial print strings in flash --- mcp_can.cpp | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index a8c15df..895afb5 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -492,24 +492,24 @@ INT8U MCP_CAN::mcp2515_init(const INT8U canIDMode, const INT8U canSpeed, const I if(res > 0) { #if DEBUG_MODE - Serial.print("Entering Configuration Mode Failure...\r\n"); + Serial.println(F("Entering Configuration Mode Failure...")); #endif return res; } #if DEBUG_MODE - Serial.print("Entering Configuration Mode Successful!\r\n"); + Serial.println(F("Entering Configuration Mode Successful!")); #endif // Set Baudrate if(mcp2515_configRate(canSpeed, canClock)) { #if DEBUG_MODE - Serial.print("Setting Baudrate Failure...\r\n"); + Serial.println(F("Setting Baudrate Failure...")); #endif return res; } #if DEBUG_MODE - Serial.print("Setting Baudrate Successful!\r\n"); + Serial.println(F("Setting Baudrate Successful!")); #endif if ( res == MCP2515_OK ) { @@ -556,7 +556,7 @@ INT8U MCP_CAN::mcp2515_init(const INT8U canIDMode, const INT8U canSpeed, const I default: #if DEBUG_MODE - Serial.print("`Setting ID Mode Failure...\r\n"); + Serial.println(F("`Setting ID Mode Failure...")); #endif return MCP2515_FAIL; break; @@ -567,7 +567,7 @@ INT8U MCP_CAN::mcp2515_init(const INT8U canIDMode, const INT8U canSpeed, const I if(res) { #if DEBUG_MODE - Serial.print("Returning to Previous Mode Failure...\r\n"); + Serial.println(F("Returning to Previous Mode Failure...")); #endif return res; } @@ -769,12 +769,12 @@ INT8U MCP_CAN::init_Mask(INT8U num, INT8U ext, INT32U ulData) { INT8U res = MCP2515_OK; #if DEBUG_MODE - Serial.print("Starting to Set Mask!\r\n"); + Serial.println(F("Starting to Set Mask!")); #endif res = mcp2515_setCANCTRL_Mode(MODE_CONFIG); if(res > 0){ #if DEBUG_MODE - Serial.print("Entering Configuration Mode Failure...\r\n"); + Serial.println(F("Entering Configuration Mode Failure...")); #endif return res; } @@ -791,12 +791,13 @@ INT8U MCP_CAN::init_Mask(INT8U num, INT8U ext, INT32U ulData) res = mcp2515_setCANCTRL_Mode(mcpMode); if(res > 0){ #if DEBUG_MODE - Serial.print("Entering Previous Mode Failure...\r\nSetting Mask Failure...\r\n"); + Serial.println(F("Entering Previous Mode Failure...")); + Serial.println(F("Setting Mask Failure...")); #endif return res; } #if DEBUG_MODE - Serial.print("Setting Mask Successful!\r\n"); + Serial.println(F("Setting Mask Successful!")); #endif return res; } @@ -810,12 +811,12 @@ INT8U MCP_CAN::init_Mask(INT8U num, INT32U ulData) INT8U res = MCP2515_OK; INT8U ext = 0; #if DEBUG_MODE - Serial.print("Starting to Set Mask!\r\n"); + Serial.println(F("Starting to Set Mask!")); #endif res = mcp2515_setCANCTRL_Mode(MODE_CONFIG); if(res > 0){ #if DEBUG_MODE - Serial.print("Entering Configuration Mode Failure...\r\n"); + Serial.println(F("Entering Configuration Mode Failure...")); #endif return res; } @@ -835,12 +836,13 @@ INT8U MCP_CAN::init_Mask(INT8U num, INT32U ulData) res = mcp2515_setCANCTRL_Mode(mcpMode); if(res > 0){ #if DEBUG_MODE - Serial.print("Entering Previous Mode Failure...\r\nSetting Mask Failure...\r\n"); + Serial.println(F("Entering Previous Mode Failure...")); + Serial.println(F("Setting Mask Failure...")); #endif return res; } #if DEBUG_MODE - Serial.print("Setting Mask Successful!\r\n"); + Serial.println(F("Setting Mask Successful!")); #endif return res; } @@ -853,13 +855,13 @@ INT8U MCP_CAN::init_Filt(INT8U num, INT8U ext, INT32U ulData) { INT8U res = MCP2515_OK; #if DEBUG_MODE - Serial.print("Starting to Set Filter!\r\n"); + Serial.println(F("Starting to Set Filter!")); #endif res = mcp2515_setCANCTRL_Mode(MODE_CONFIG); if(res > 0) { #if DEBUG_MODE - Serial.print("Enter Configuration Mode Failure...\r\n"); + Serial.println(F("Enter Configuration Mode Failure...")); #endif return res; } @@ -898,12 +900,13 @@ INT8U MCP_CAN::init_Filt(INT8U num, INT8U ext, INT32U ulData) if(res > 0) { #if DEBUG_MODE - Serial.print("Entering Previous Mode Failure...\r\nSetting Filter Failure...\r\n"); + Serial.println(F("Entering Previous Mode Failure...")); + Serial.println(F("Setting Filter Failure...")); #endif return res; } #if DEBUG_MODE - Serial.print("Setting Filter Successfull!\r\n"); + Serial.println(F("Setting Filter Successfull!")); #endif return res; @@ -919,13 +922,13 @@ INT8U MCP_CAN::init_Filt(INT8U num, INT32U ulData) INT8U ext = 0; #if DEBUG_MODE - Serial.print("Starting to Set Filter!\r\n"); + Serial.println(F("Starting to Set Filter!")); #endif res = mcp2515_setCANCTRL_Mode(MODE_CONFIG); if(res > 0) { #if DEBUG_MODE - Serial.print("Enter Configuration Mode Failure...\r\n"); + Serial.println(F("Enter Configuration Mode Failure...")); #endif return res; } @@ -967,12 +970,13 @@ INT8U MCP_CAN::init_Filt(INT8U num, INT32U ulData) if(res > 0) { #if DEBUG_MODE - Serial.print("Entering Previous Mode Failure...\r\nSetting Filter Failure...\r\n"); + Serial.println(F("Entering Previous Mode Failure...")); + Serial.println(F("Setting Filter Failure...")); #endif return res; } #if DEBUG_MODE - Serial.print("Setting Filter Successfull!\r\n"); + Serial.println(F("Setting Filter Successfull!")); #endif return res; From 91396966b87e9aefbaa04fdc9faf91c1ba2969ae Mon Sep 17 00:00:00 2001 From: Zak Kemble Date: Wed, 2 Aug 2017 20:43:44 +0100 Subject: [PATCH 02/11] Improved sleep functionality Increased reset delay, needed if the chip was in sleep mode Added sleep example --- README.md | 2 + examples/CAN_sleep/CAN_sleep.ino | 107 +++++++++++++++++++++++++++++++ mcp_can.cpp | 71 ++++++++++++++++---- mcp_can.h | 1 + mcp_can_dfs.h | 4 ++ 5 files changed, 173 insertions(+), 12 deletions(-) create mode 100644 examples/CAN_sleep/CAN_sleep.ino diff --git a/README.md b/README.md index 174cbed..5dc4a49 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,8 @@ Using the setMode() function the sketch can now put the protocol controller into User can enable and disable (default) One-Shot transmission mode from the sketch using enOneShotTX() or disOneShotTX() respectively. +To wake up from CAN bus activity while in sleep mode enable the wake up interrupt with setSleepWakeup(1). Passing 0 will disable the wakeup interrupt (default). + Installation ============== Copy this into the "[.../MySketches/]libraries/" folder and restart the Arduino editor. diff --git a/examples/CAN_sleep/CAN_sleep.ino b/examples/CAN_sleep/CAN_sleep.ino new file mode 100644 index 0000000..f0235bd --- /dev/null +++ b/examples/CAN_sleep/CAN_sleep.ino @@ -0,0 +1,107 @@ +// CAN Sleep Example +// By Zak Kemble, based on the CAN receive example + +// If you only have 2 devices on the CAN bus (the device running this sketch and some other device sending messages), then you may find that duplicate messages are received when waking up. +// This is because when the MCP2515 wakes up it enters LISTENONLY mode where it does not send ACKs to messages, so the transmitter will retransmit the same message a few times. + +#include +#include +#include + +#define CAN0_INT 2 // Set INT to pin 2 +MCP_CAN CAN0(10); // Set CS to pin 10 + +void setup() +{ + Serial.begin(115200); + + // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled. + if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK) + Serial.println(F("MCP2515 Initialized Successfully!")); + else + Serial.println(F("Error Initializing MCP2515...")); + + CAN0.setMode(MCP_NORMAL); // Set operation mode to normal so the MCP2515 sends acks to received data. + CAN0.setSleepWakeup(1); // Enable wake up interrupt when in sleep mode + + pinMode(CAN0_INT, INPUT); // Configuring pin for /INT input + + // Enable interrupts for the CAN0_INT pin (should be pin 2 or 3 for Uno and other ATmega328P based boards) + attachInterrupt(digitalPinToInterrupt(CAN0_INT), ISR_CAN, FALLING); + + set_sleep_mode(SLEEP_MODE_PWR_DOWN); + + Serial.println(F("MCP2515 Library Sleep Example...")); +} + +void loop() +{ + if(!digitalRead(CAN0_INT)) // If CAN0_INT pin is low, read receive buffer + { + unsigned long rxId; + byte len; + byte rxBuf[8]; + + if(CAN0.readMsgBuf(&rxId, &len, rxBuf) == CAN_OK) // Read data: len = data length, buf = data byte(s) + { + char msgString[128]; // Array to store serial string + if(rxId & CAN_IS_EXTENDED) // Determine if ID is standard (11 bits) or extended (29 bits) + sprintf_P(msgString, PSTR("Extended ID: 0x%.8lX DLC: %1d Data:"), (rxId & CAN_EXTENDED_ID), len); + else + sprintf_P(msgString, PSTR("Standard ID: 0x%.3lX DLC: %1d Data:"), rxId, len); + + Serial.print(msgString); + + if(rxId & CAN_IS_REMOTE_REQUEST) // Determine if message is a remote request frame. + Serial.print(F(" REMOTE REQUEST FRAME")); + else + { + for(byte i=0;i 200) // Wait no more than 200ms for the operation to complete + return MCP2515_FAIL; + } + + // Turn wake interrupt back off if it was originally off + if(!wakeIntEnabled) + mcp2515_modifyRegister(MCP_CANINTE, MCP_WAKIF, 0); + } + + // Clear wake flag + mcp2515_modifyRegister(MCP_CANINTF, MCP_WAKIF, 0); + + startTime = millis(); + + // Spam new mode request and wait for the operation to complete + while(1) + { + // Request new mode + // This is inside the loop as sometimes requesting the new mode once doesn't work (usually when attempting to sleep) + mcp2515_modifyRegister(MCP_CANCTRL, MODE_MASK, newmode); + + byte statReg = mcp2515_readRegister(MCP_CANSTAT); + if((statReg & MODE_MASK) == newmode) // We're now in the new mode + return MCP2515_OK; + else if((byte)(millis() - startTime) > 200) // Wait no more than 200ms for the operation to complete + return MCP2515_FAIL; + } } /********************************************************************************************************* diff --git a/mcp_can.h b/mcp_can.h index 823b440..9e75fb1 100644 --- a/mcp_can.h +++ b/mcp_can.h @@ -110,6 +110,7 @@ class MCP_CAN INT8U init_Mask(INT8U num, INT32U ulData); // Initilize Mask(s) INT8U init_Filt(INT8U num, INT8U ext, INT32U ulData); // Initilize Filter(s) INT8U init_Filt(INT8U num, INT32U ulData); // Initilize Filter(s) + void setSleepWakeup(INT8U enable); // Enable or disable the wake up interrupt (If disabled the MCP2515 will not be woken up by CAN bus activity) INT8U setMode(INT8U opMode); // Set operational mode INT8U sendMsgBuf(INT32U id, INT8U ext, INT8U len, INT8U *buf); // Send message to transmit buffer INT8U sendMsgBuf(INT32U id, INT8U len, INT8U *buf); // Send message to transmit buffer diff --git a/mcp_can_dfs.h b/mcp_can_dfs.h index 3eba601..ae08619 100644 --- a/mcp_can_dfs.h +++ b/mcp_can_dfs.h @@ -462,6 +462,10 @@ #define CAN_MAX_CHAR_IN_MESSAGE (8) +#define CAN_IS_EXTENDED 0x80000000 +#define CAN_IS_REMOTE_REQUEST 0x40000000 +#define CAN_EXTENDED_ID 0x1FFFFFFF + #endif /********************************************************************************************************* END FILE From 75d1231a1f29f36a8c8cbf9ad9f07b86a53d098c Mon Sep 17 00:00:00 2001 From: Zak Kemble Date: Thu, 3 Aug 2017 23:04:11 +0100 Subject: [PATCH 03/11] Fixed an issue with sleeping when not connected to a bus --- mcp_can.cpp | 32 +++++++++++++++++++------------- mcp_can.h | 1 + 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index 62f7a6e..de9130f 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -159,9 +159,7 @@ INT8U MCP_CAN::setMode(const INT8U opMode) *********************************************************************************************************/ INT8U MCP_CAN::mcp2515_setCANCTRL_Mode(const INT8U newmode) { - byte startTime = millis(); - - // If the chip is asleep and we want to change mode then a manaul wake needs to be done + // If the chip is asleep and we want to change mode then a manual wake needs to be done // This is done by setting the wake up interrupt flag // This undocumented trick was found at https://github.com/mkleemann/can/blob/master/can_sleep_mcp2515.c if((mcp2515_readRegister(MCP_CANSTAT) & MODE_MASK) == MCP_SLEEP && newmode != MCP_SLEEP) @@ -174,15 +172,14 @@ INT8U MCP_CAN::mcp2515_setCANCTRL_Mode(const INT8U newmode) // Set wake flag (this does the actual waking up) mcp2515_modifyRegister(MCP_CANINTF, MCP_WAKIF, MCP_WAKIF); - // Wait for the chip to exit SLEEP and enter LISTENONLY mode - while(1) - { - byte statReg = mcp2515_readRegister(MCP_CANSTAT); - if((statReg & MODE_MASK) == MCP_LISTENONLY) // Now in LISTENONLY mode - break; - else if((byte)(millis() - startTime) > 200) // Wait no more than 200ms for the operation to complete - return MCP2515_FAIL; - } + // Wait for the chip to exit SLEEP and enter LISTENONLY mode. + + // If the chip is not connected to a CAN bus (or the bus has no other powered nodes) it will sometimes trigger the wake interrupt as soon + // as it's put to sleep, but it will stay in SLEEP mode instead of automatically switching to LISTENONLY mode. + // In this situation the mode needs to be manually set to LISTENONLY. + + if(mcp2515_requestNewMode(MCP_LISTENONLY) != MCP2515_OK) + return MCP2515_FAIL; // Turn wake interrupt back off if it was originally off if(!wakeIntEnabled) @@ -192,7 +189,16 @@ INT8U MCP_CAN::mcp2515_setCANCTRL_Mode(const INT8U newmode) // Clear wake flag mcp2515_modifyRegister(MCP_CANINTF, MCP_WAKIF, 0); - startTime = millis(); + return mcp2515_requestNewMode(newmode); +} + +/********************************************************************************************************* +** Function name: mcp2515_requestNewMode +** Descriptions: Set control mode +*********************************************************************************************************/ +INT8U MCP_CAN::mcp2515_requestNewMode(const INT8U newmode) +{ + byte startTime = millis(); // Spam new mode request and wait for the operation to complete while(1) diff --git a/mcp_can.h b/mcp_can.h index 9e75fb1..8fbf871 100644 --- a/mcp_can.h +++ b/mcp_can.h @@ -71,6 +71,7 @@ class MCP_CAN INT8U mcp2515_readStatus(void); // Read MCP2515 Status INT8U mcp2515_setCANCTRL_Mode(const INT8U newmode); // Set mode + INT8U mcp2515_requestNewMode(const INT8U newmode); // Set mode INT8U mcp2515_configRate(const INT8U canSpeed, // Set baudrate const INT8U canClock); From 71cacaadca4e5967c38f5f47e7d13a23fcfc8689 Mon Sep 17 00:00:00 2001 From: Bascy Date: Mon, 12 Mar 2018 22:53:15 +0100 Subject: [PATCH 04/11] Fixed setting and clearing of msgbuf --- mcp_can.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index c160939..c0dc9fb 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -1005,7 +1005,7 @@ INT8U MCP_CAN::setMsg(INT32U id, INT8U rtr, INT8U ext, INT8U len, INT8U *pData) m_nRtr = rtr; m_nExtFlg = ext; m_nDlc = len; - for(i = 0; i Date: Wed, 11 Apr 2018 08:41:46 +0200 Subject: [PATCH 05/11] Added sendRtrMsgBuf() methods, fixed use of MCP_RTR_MASK --- mcp_can.cpp | 25 ++++++++++++++++++++++--- mcp_can.h | 6 +++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index af07d1e..e330fa1 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -770,7 +770,7 @@ void MCP_CAN::mcp2515_read_canMsg( const INT8U buffer_sidh_addr) /* read ctrl = mcp2515_readRegister( mcp_addr-1 ); m_nDlc = mcp2515_readRegister( mcp_addr+4 ); - if (ctrl & 0x08) + if (ctrl & MCP_RTR_MASK) m_nRtr = 1; else m_nRtr = 0; @@ -1147,7 +1147,7 @@ INT8U MCP_CAN::sendMsgBuf(INT32U id, INT8U len, INT8U *buf) if((id & 0x80000000) == 0x80000000) ext = 1; - if((id & 0x40000000) == 0x40000000) + if((id & MCP_RTR_MASK) == MCP_RTR_MASK) rtr = 1; setMsg(id, rtr, ext, len, buf); @@ -1215,7 +1215,7 @@ INT8U MCP_CAN::readMsgBuf(INT32U *id, INT8U *len, INT8U buf[]) m_nID |= 0x80000000; if (m_nRtr) - m_nID |= 0x40000000; + m_nID |= MCP_RTR_MASK; *id = m_nID; *len = m_nDlc; @@ -1344,6 +1344,25 @@ INT8U MCP_CAN::getGPI(void) return (res >> 3); } +/********************************************************************************************************* +** Function name: sendRtrMsgBuf +** Descriptions: Public function, Send message in buf with RTR flag set +*********************************************************************************************************/ +INT8U MCP_CAN::sendRtrMsgBuf(unsigned long id, INT8U ext, INT8U len, INT8U* buf) { + return sendMsgBuf(id | MCP_RTR_MASK, ext, len, buf); +} + +/********************************************************************************************************* +** Function name: sendRtrMsgBuf +** Descriptions: Public function, Send message in buf with RTR flag set +*********************************************************************************************************/ +INT8U MCP_CAN::sendRtrMsgBuf(unsigned long id, INT8U len, INT8U* buf) { + return sendMsgBuf( id | MCP_RTR_MASK, len, buf); +} + +INT8U MCP_CAN::getRemoteRequestFlag(void) { + return m_nRtr; +} /********************************************************************************************************* END FILE *********************************************************************************************************/ diff --git a/mcp_can.h b/mcp_can.h index 5565f53..a64baf7 100644 --- a/mcp_can.h +++ b/mcp_can.h @@ -111,10 +111,12 @@ class MCP_CAN INT8U init_Mask(INT8U num, INT32U ulData); // Initilize Mask(s) INT8U init_Filt(INT8U num, INT8U ext, INT32U ulData); // Initilize Filter(s) INT8U init_Filt(INT8U num, INT32U ulData); // Initilize Filter(s) - void setSleepWakeup(INT8U enable); // Enable or disable the wake up interrupt (If disabled the MCP2515 will not be woken up by CAN bus activity) + void setSleepWakeup(INT8U enable); // Enable or disable the wake up interrupt (If disabled the MCP2515 will not be woken up by CAN bus activity) INT8U setMode(INT8U opMode); // Set operational mode INT8U sendMsgBuf(INT32U id, INT8U ext, INT8U len, INT8U *buf); // Send message to transmit buffer INT8U sendMsgBuf(INT32U id, INT8U len, INT8U *buf); // Send message to transmit buffer + INT8U sendRtrMsgBuf(INT32U id, INT8U ext, INT8U len, INT8U *buf); // Send remote request message to transmit buffer + INT8U sendRtrMsgBuf(INT32U id, INT8U len, INT8U *buf); // Send remote request message to transmit buffer INT8U readMsgBuf(INT32U *id, INT8U *ext, INT8U *len, INT8U *buf); // Read message from receive buffer INT8U readMsgBuf(INT32U *id, INT8U *len, INT8U *buf); // Read message from receive buffer INT8U checkReceive(void); // Check for received data @@ -127,6 +129,8 @@ class MCP_CAN INT8U abortTX(void); // Abort queued transmission(s) INT8U setGPO(INT8U data); // Sets GPO INT8U getGPI(void); // Reads GPI + + INT8U getRemoteRequestFlag(void); //Read Rtr from last message }; #endif From ef60b00bc54bf06f2395e34965b21724bc4a0dfd Mon Sep 17 00:00:00 2001 From: Bascy Date: Wed, 11 Apr 2018 22:09:19 +0200 Subject: [PATCH 06/11] Reverted after CAN config failure on ESP --- mcp_can.cpp | 107 ++++--------------------- mcp_can.h | 15 +--- mcp_can_dfs.h | 218 ++++++++++++++++++++++++-------------------------- 3 files changed, 126 insertions(+), 214 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index e330fa1..de9130f 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -1,11 +1,11 @@ -/* +/* mcp_can.cpp 2012 Copyright (c) Seeed Technology Inc. All right reserved. - 2017 Copyright (c) Cory J. Fowler All Rights Reserved. + 2014 Copyright (c) Cory J. Fowler All Rights Reserved. Author: Loovee Contributor: Cory J. Fowler - 2017-09-25 + 2014-9-16 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either @@ -32,12 +32,9 @@ *********************************************************************************************************/ void MCP_CAN::mcp2515_reset(void) { - SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0)); MCP2515_SELECT(); spi_readwrite(MCP_RESET); MCP2515_UNSELECT(); - SPI.endTransaction(); - delayMicroseconds(10); //delayMicroseconds(10); delay(5); // If the MCP2515 was in sleep mode when the reset command was issued then we need to wait a while for it to reset properly } @@ -50,13 +47,11 @@ INT8U MCP_CAN::mcp2515_readRegister(const INT8U address) { INT8U ret; - SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0)); MCP2515_SELECT(); spi_readwrite(MCP_READ); spi_readwrite(address); ret = spi_read(); MCP2515_UNSELECT(); - SPI.endTransaction(); return ret; } @@ -68,7 +63,6 @@ INT8U MCP_CAN::mcp2515_readRegister(const INT8U address) void MCP_CAN::mcp2515_readRegisterS(const INT8U address, INT8U values[], const INT8U n) { INT8U i; - SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0)); MCP2515_SELECT(); spi_readwrite(MCP_READ); spi_readwrite(address); @@ -77,7 +71,6 @@ void MCP_CAN::mcp2515_readRegisterS(const INT8U address, INT8U values[], const I values[i] = spi_read(); MCP2515_UNSELECT(); - SPI.endTransaction(); } /********************************************************************************************************* @@ -86,13 +79,12 @@ void MCP_CAN::mcp2515_readRegisterS(const INT8U address, INT8U values[], const I *********************************************************************************************************/ void MCP_CAN::mcp2515_setRegister(const INT8U address, const INT8U value) { - SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0)); MCP2515_SELECT(); spi_readwrite(MCP_WRITE); spi_readwrite(address); spi_readwrite(value); MCP2515_UNSELECT(); - SPI.endTransaction(); + //delayMicroseconds(250); } /********************************************************************************************************* @@ -102,7 +94,6 @@ void MCP_CAN::mcp2515_setRegister(const INT8U address, const INT8U value) void MCP_CAN::mcp2515_setRegisterS(const INT8U address, const INT8U values[], const INT8U n) { INT8U i; - SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0)); MCP2515_SELECT(); spi_readwrite(MCP_WRITE); spi_readwrite(address); @@ -111,7 +102,7 @@ void MCP_CAN::mcp2515_setRegisterS(const INT8U address, const INT8U values[], co spi_readwrite(values[i]); MCP2515_UNSELECT(); - SPI.endTransaction(); + //delayMicroseconds(250); } /********************************************************************************************************* @@ -120,14 +111,13 @@ void MCP_CAN::mcp2515_setRegisterS(const INT8U address, const INT8U values[], co *********************************************************************************************************/ void MCP_CAN::mcp2515_modifyRegister(const INT8U address, const INT8U mask, const INT8U data) { - SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0)); MCP2515_SELECT(); spi_readwrite(MCP_BITMOD); spi_readwrite(address); spi_readwrite(mask); spi_readwrite(data); MCP2515_UNSELECT(); - SPI.endTransaction(); + //delayMicroseconds(250); } /********************************************************************************************************* @@ -137,12 +127,10 @@ void MCP_CAN::mcp2515_modifyRegister(const INT8U address, const INT8U mask, cons INT8U MCP_CAN::mcp2515_readStatus(void) { INT8U i; - SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0)); MCP2515_SELECT(); spi_readwrite(MCP_READ_STATUS); i = spi_read(); MCP2515_UNSELECT(); - SPI.endTransaction(); return i; } @@ -585,11 +573,6 @@ INT8U MCP_CAN::mcp2515_init(const INT8U canIDMode, const INT8U canSpeed, const I /* interrupt mode */ mcp2515_setRegister(MCP_CANINTE, MCP_RX0IF | MCP_RX1IF); - //Sets BF pins as GPO - mcp2515_setRegister(MCP_BFPCTRL,MCP_BxBFS_MASK | MCP_BxBFE_MASK); - //Sets RTS pins as GPI - mcp2515_setRegister(MCP_TXRTSCTRL,0x00); - switch(canIDMode) { case (MCP_ANY): @@ -770,7 +753,7 @@ void MCP_CAN::mcp2515_read_canMsg( const INT8U buffer_sidh_addr) /* read ctrl = mcp2515_readRegister( mcp_addr-1 ); m_nDlc = mcp2515_readRegister( mcp_addr+4 ); - if (ctrl & MCP_RTR_MASK) + if (ctrl & 0x08) m_nRtr = 1; else m_nRtr = 0; @@ -846,8 +829,8 @@ INT8U MCP_CAN::init_Mask(INT8U num, INT8U ext, INT32U ulData) #if DEBUG_MODE Serial.println(F("Entering Configuration Mode Failure...")); #endif - return res; - } + return res; +} if (num == 0){ mcp2515_write_mf(MCP_RXM0SIDH, ext, ulData); @@ -864,8 +847,8 @@ INT8U MCP_CAN::init_Mask(INT8U num, INT8U ext, INT32U ulData) Serial.println(F("Entering Previous Mode Failure...")); Serial.println(F("Setting Mask Failure...")); #endif - return res; - } + return res; + } #if DEBUG_MODE Serial.println(F("Setting Mask Successful!")); #endif @@ -891,7 +874,7 @@ INT8U MCP_CAN::init_Mask(INT8U num, INT32U ulData) return res; } - if((ulData & 0x80000000) == 0x80000000) + if((num & 0x80000000) == 0x80000000) ext = 1; if (num == 0){ @@ -1003,7 +986,7 @@ INT8U MCP_CAN::init_Filt(INT8U num, INT32U ulData) return res; } - if((ulData & 0x80000000) == 0x80000000) + if((num & 0x80000000) == 0x80000000) ext = 1; switch( num ) @@ -1063,7 +1046,7 @@ INT8U MCP_CAN::setMsg(INT32U id, INT8U rtr, INT8U ext, INT8U len, INT8U *pData) m_nRtr = rtr; m_nExtFlg = ext; m_nDlc = len; - for(i = 0; i> 3); -} - -/********************************************************************************************************* -** Function name: sendRtrMsgBuf -** Descriptions: Public function, Send message in buf with RTR flag set -*********************************************************************************************************/ -INT8U MCP_CAN::sendRtrMsgBuf(unsigned long id, INT8U ext, INT8U len, INT8U* buf) { - return sendMsgBuf(id | MCP_RTR_MASK, ext, len, buf); -} - -/********************************************************************************************************* -** Function name: sendRtrMsgBuf -** Descriptions: Public function, Send message in buf with RTR flag set -*********************************************************************************************************/ -INT8U MCP_CAN::sendRtrMsgBuf(unsigned long id, INT8U len, INT8U* buf) { - return sendMsgBuf( id | MCP_RTR_MASK, len, buf); -} - -INT8U MCP_CAN::getRemoteRequestFlag(void) { - return m_nRtr; -} /********************************************************************************************************* END FILE *********************************************************************************************************/ diff --git a/mcp_can.h b/mcp_can.h index a64baf7..8fbf871 100644 --- a/mcp_can.h +++ b/mcp_can.h @@ -1,11 +1,11 @@ -/* +/* mcp_can.h 2012 Copyright (c) Seeed Technology Inc. All right reserved. - 2017 Copyright (c) Cory J. Fowler All Rights Reserved. + 2016 Copyright (c) Cory J. Fowler All Rights Reserved. Author:Loovee Contributor: Cory J. Fowler - 2017-09-25 + 2016-07-01 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either @@ -111,12 +111,10 @@ class MCP_CAN INT8U init_Mask(INT8U num, INT32U ulData); // Initilize Mask(s) INT8U init_Filt(INT8U num, INT8U ext, INT32U ulData); // Initilize Filter(s) INT8U init_Filt(INT8U num, INT32U ulData); // Initilize Filter(s) - void setSleepWakeup(INT8U enable); // Enable or disable the wake up interrupt (If disabled the MCP2515 will not be woken up by CAN bus activity) + void setSleepWakeup(INT8U enable); // Enable or disable the wake up interrupt (If disabled the MCP2515 will not be woken up by CAN bus activity) INT8U setMode(INT8U opMode); // Set operational mode INT8U sendMsgBuf(INT32U id, INT8U ext, INT8U len, INT8U *buf); // Send message to transmit buffer INT8U sendMsgBuf(INT32U id, INT8U len, INT8U *buf); // Send message to transmit buffer - INT8U sendRtrMsgBuf(INT32U id, INT8U ext, INT8U len, INT8U *buf); // Send remote request message to transmit buffer - INT8U sendRtrMsgBuf(INT32U id, INT8U len, INT8U *buf); // Send remote request message to transmit buffer INT8U readMsgBuf(INT32U *id, INT8U *ext, INT8U *len, INT8U *buf); // Read message from receive buffer INT8U readMsgBuf(INT32U *id, INT8U *len, INT8U *buf); // Read message from receive buffer INT8U checkReceive(void); // Check for received data @@ -126,11 +124,6 @@ class MCP_CAN INT8U errorCountTX(void); // Get error count INT8U enOneShotTX(void); // Enable one-shot transmission INT8U disOneShotTX(void); // Disable one-shot transmission - INT8U abortTX(void); // Abort queued transmission(s) - INT8U setGPO(INT8U data); // Sets GPO - INT8U getGPI(void); // Reads GPI - - INT8U getRemoteRequestFlag(void); //Read Rtr from last message }; #endif diff --git a/mcp_can_dfs.h b/mcp_can_dfs.h index da18982..ae08619 100644 --- a/mcp_can_dfs.h +++ b/mcp_can_dfs.h @@ -1,11 +1,11 @@ /* mcp_can_dfs.h 2012 Copyright (c) Seeed Technology Inc. All right reserved. - 2017 Copyright (c) Cory J. Fowler All Rights Reserved. + 2014 Copyright (c) Cory J. Fowler All Rights Reserved. Author:Loovee Contributor: Cory J. Fowler - 2017-09-25 + 2014-1-16 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either @@ -88,12 +88,6 @@ #define MCP_EFLG_EWARN (1<<0) #define MCP_EFLG_ERRORMASK (0xF8) /* 5 MS-Bits */ -#define MCP_BxBFS_MASK 0x30 -#define MCP_BxBFE_MASK 0x0C -#define MCP_BxBFM_MASK 0x03 - -#define MCP_BxRTS_MASK 0x38 -#define MCP_BxRTSM_MASK 0x07 /* * Define MCP2515 register addresses @@ -110,8 +104,6 @@ #define MCP_RXF2SIDL 0x09 #define MCP_RXF2EID8 0x0A #define MCP_RXF2EID0 0x0B -#define MCP_BFPCTRL 0x0C -#define MCP_TXRTSCTRL 0x0D #define MCP_CANSTAT 0x0E #define MCP_CANCTRL 0x0F #define MCP_RXF3SIDH 0x10 @@ -151,10 +143,10 @@ #define MCP_RXB1SIDH 0x71 -#define MCP_TX_INT 0x1C /* Enable all transmit interrup ts */ -#define MCP_TX01_INT 0x0C /* Enable TXB0 and TXB1 interru pts */ -#define MCP_RX_INT 0x03 /* Enable receive interrupts */ -#define MCP_NO_INT 0x00 /* Disable all interrupts */ +#define MCP_TX_INT 0x1C // Enable all transmit interrup ts +#define MCP_TX01_INT 0x0C // Enable TXB0 and TXB1 interru pts +#define MCP_RX_INT 0x03 // Enable receive interrupts +#define MCP_NO_INT 0x00 // Disable all interrupts #define MCP_TX01_MASK 0x14 #define MCP_TX_MASK 0x54 @@ -249,155 +241,155 @@ /* * Speed 8M */ -#define MCP_8MHz_1000kBPS_CFG1 (0x00) -#define MCP_8MHz_1000kBPS_CFG2 (0xC0) /* Enabled SAM bit */ -#define MCP_8MHz_1000kBPS_CFG3 (0x80) /* Sample point at 75% */ +#define MCP_8MHz_1000kBPS_CFG1 (0x00) +#define MCP_8MHz_1000kBPS_CFG2 (0x80) +#define MCP_8MHz_1000kBPS_CFG3 (0x80) #define MCP_8MHz_500kBPS_CFG1 (0x00) -#define MCP_8MHz_500kBPS_CFG2 (0xD1) /* Enabled SAM bit */ -#define MCP_8MHz_500kBPS_CFG3 (0x81) /* Sample point at 75% */ +#define MCP_8MHz_500kBPS_CFG2 (0x90) +#define MCP_8MHz_500kBPS_CFG3 (0x82) -#define MCP_8MHz_250kBPS_CFG1 (0x80) /* Increased SJW */ -#define MCP_8MHz_250kBPS_CFG2 (0xE5) /* Enabled SAM bit */ -#define MCP_8MHz_250kBPS_CFG3 (0x83) /* Sample point at 75% */ +#define MCP_8MHz_250kBPS_CFG1 (0x00) +#define MCP_8MHz_250kBPS_CFG2 (0xB1) +#define MCP_8MHz_250kBPS_CFG3 (0x85) -#define MCP_8MHz_200kBPS_CFG1 (0x80) /* Increased SJW */ -#define MCP_8MHz_200kBPS_CFG2 (0xF6) /* Enabled SAM bit */ -#define MCP_8MHz_200kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_8MHz_200kBPS_CFG1 (0x00) +#define MCP_8MHz_200kBPS_CFG2 (0xB4) +#define MCP_8MHz_200kBPS_CFG3 (0x86) -#define MCP_8MHz_125kBPS_CFG1 (0x81) /* Increased SJW */ -#define MCP_8MHz_125kBPS_CFG2 (0xE5) /* Enabled SAM bit */ -#define MCP_8MHz_125kBPS_CFG3 (0x83) /* Sample point at 75% */ +#define MCP_8MHz_125kBPS_CFG1 (0x01) +#define MCP_8MHz_125kBPS_CFG2 (0xB1) +#define MCP_8MHz_125kBPS_CFG3 (0x85) -#define MCP_8MHz_100kBPS_CFG1 (0x81) /* Increased SJW */ -#define MCP_8MHz_100kBPS_CFG2 (0xF6) /* Enabled SAM bit */ -#define MCP_8MHz_100kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_8MHz_100kBPS_CFG1 (0x01) +#define MCP_8MHz_100kBPS_CFG2 (0xB4) +#define MCP_8MHz_100kBPS_CFG3 (0x86) -#define MCP_8MHz_80kBPS_CFG1 (0x84) /* Increased SJW */ -#define MCP_8MHz_80kBPS_CFG2 (0xD3) /* Enabled SAM bit */ -#define MCP_8MHz_80kBPS_CFG3 (0x81) /* Sample point at 75% */ +#define MCP_8MHz_80kBPS_CFG1 (0x01) +#define MCP_8MHz_80kBPS_CFG2 (0xBF) +#define MCP_8MHz_80kBPS_CFG3 (0x87) -#define MCP_8MHz_50kBPS_CFG1 (0x84) /* Increased SJW */ -#define MCP_8MHz_50kBPS_CFG2 (0xE5) /* Enabled SAM bit */ -#define MCP_8MHz_50kBPS_CFG3 (0x83) /* Sample point at 75% */ +#define MCP_8MHz_50kBPS_CFG1 (0x03) +#define MCP_8MHz_50kBPS_CFG2 (0xB4) +#define MCP_8MHz_50kBPS_CFG3 (0x86) -#define MCP_8MHz_40kBPS_CFG1 (0x84) /* Increased SJW */ -#define MCP_8MHz_40kBPS_CFG2 (0xF6) /* Enabled SAM bit */ -#define MCP_8MHz_40kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_8MHz_40kBPS_CFG1 (0x03) +#define MCP_8MHz_40kBPS_CFG2 (0xBF) +#define MCP_8MHz_40kBPS_CFG3 (0x87) -#define MCP_8MHz_33k3BPS_CFG1 (0x85) /* Increased SJW */ -#define MCP_8MHz_33k3BPS_CFG2 (0xF6) /* Enabled SAM bit */ -#define MCP_8MHz_33k3BPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_8MHz_33k3BPS_CFG1 (0x47) +#define MCP_8MHz_33k3BPS_CFG2 (0xE2) +#define MCP_8MHz_33k3BPS_CFG3 (0x85) -#define MCP_8MHz_31k25BPS_CFG1 (0x87) /* Increased SJW */ -#define MCP_8MHz_31k25BPS_CFG2 (0xE5) /* Enabled SAM bit */ -#define MCP_8MHz_31k25BPS_CFG3 (0x83) /* Sample point at 75% */ +#define MCP_8MHz_31k25BPS_CFG1 (0x07) +#define MCP_8MHz_31k25BPS_CFG2 (0xA4) +#define MCP_8MHz_31k25BPS_CFG3 (0x84) -#define MCP_8MHz_20kBPS_CFG1 (0x89) /* Increased SJW */ -#define MCP_8MHz_20kBPS_CFG2 (0xF6) /* Enabled SAM bit */ -#define MCP_8MHz_20kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_8MHz_20kBPS_CFG1 (0x07) +#define MCP_8MHz_20kBPS_CFG2 (0xBF) +#define MCP_8MHz_20kBPS_CFG3 (0x87) -#define MCP_8MHz_10kBPS_CFG1 (0x93) /* Increased SJW */ -#define MCP_8MHz_10kBPS_CFG2 (0xF6) /* Enabled SAM bit */ -#define MCP_8MHz_10kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_8MHz_10kBPS_CFG1 (0x0F) +#define MCP_8MHz_10kBPS_CFG2 (0xBF) +#define MCP_8MHz_10kBPS_CFG3 (0x87) -#define MCP_8MHz_5kBPS_CFG1 (0xA7) /* Increased SJW */ -#define MCP_8MHz_5kBPS_CFG2 (0xF6) /* Enabled SAM bit */ -#define MCP_8MHz_5kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_8MHz_5kBPS_CFG1 (0x1F) +#define MCP_8MHz_5kBPS_CFG2 (0xBF) +#define MCP_8MHz_5kBPS_CFG3 (0x87) /* * speed 16M */ #define MCP_16MHz_1000kBPS_CFG1 (0x00) -#define MCP_16MHz_1000kBPS_CFG2 (0xCA) -#define MCP_16MHz_1000kBPS_CFG3 (0x81) /* Sample point at 75% */ +#define MCP_16MHz_1000kBPS_CFG2 (0xD0) +#define MCP_16MHz_1000kBPS_CFG3 (0x82) -#define MCP_16MHz_500kBPS_CFG1 (0x40) /* Increased SJW */ -#define MCP_16MHz_500kBPS_CFG2 (0xE5) -#define MCP_16MHz_500kBPS_CFG3 (0x83) /* Sample point at 75% */ +#define MCP_16MHz_500kBPS_CFG1 (0x00) +#define MCP_16MHz_500kBPS_CFG2 (0xF0) +#define MCP_16MHz_500kBPS_CFG3 (0x86) #define MCP_16MHz_250kBPS_CFG1 (0x41) -#define MCP_16MHz_250kBPS_CFG2 (0xE5) -#define MCP_16MHz_250kBPS_CFG3 (0x83) /* Sample point at 75% */ +#define MCP_16MHz_250kBPS_CFG2 (0xF1) +#define MCP_16MHz_250kBPS_CFG3 (0x85) -#define MCP_16MHz_200kBPS_CFG1 (0x41) /* Increased SJW */ -#define MCP_16MHz_200kBPS_CFG2 (0xF6) -#define MCP_16MHz_200kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_16MHz_200kBPS_CFG1 (0x01) +#define MCP_16MHz_200kBPS_CFG2 (0xFA) +#define MCP_16MHz_200kBPS_CFG3 (0x87) -#define MCP_16MHz_125kBPS_CFG1 (0x43) /* Increased SJW */ -#define MCP_16MHz_125kBPS_CFG2 (0xE5) -#define MCP_16MHz_125kBPS_CFG3 (0x83) /* Sample point at 75% */ +#define MCP_16MHz_125kBPS_CFG1 (0x03) +#define MCP_16MHz_125kBPS_CFG2 (0xF0) +#define MCP_16MHz_125kBPS_CFG3 (0x86) -#define MCP_16MHz_100kBPS_CFG1 (0x44) /* Increased SJW */ -#define MCP_16MHz_100kBPS_CFG2 (0xE5) -#define MCP_16MHz_100kBPS_CFG3 (0x83) /* Sample point at 75% */ +#define MCP_16MHz_100kBPS_CFG1 (0x03) +#define MCP_16MHz_100kBPS_CFG2 (0xFA) +#define MCP_16MHz_100kBPS_CFG3 (0x87) -#define MCP_16MHz_80kBPS_CFG1 (0x44) /* Increased SJW */ -#define MCP_16MHz_80kBPS_CFG2 (0xF6) -#define MCP_16MHz_80kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_16MHz_80kBPS_CFG1 (0x03) +#define MCP_16MHz_80kBPS_CFG2 (0xFF) +#define MCP_16MHz_80kBPS_CFG3 (0x87) -#define MCP_16MHz_50kBPS_CFG1 (0x47) /* Increased SJW */ -#define MCP_16MHz_50kBPS_CFG2 (0xF6) -#define MCP_16MHz_50kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_16MHz_50kBPS_CFG1 (0x07) +#define MCP_16MHz_50kBPS_CFG2 (0xFA) +#define MCP_16MHz_50kBPS_CFG3 (0x87) -#define MCP_16MHz_40kBPS_CFG1 (0x49) /* Increased SJW */ -#define MCP_16MHz_40kBPS_CFG2 (0xF6) -#define MCP_16MHz_40kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_16MHz_40kBPS_CFG1 (0x07) +#define MCP_16MHz_40kBPS_CFG2 (0xFF) +#define MCP_16MHz_40kBPS_CFG3 (0x87) #define MCP_16MHz_33k3BPS_CFG1 (0x4E) -#define MCP_16MHz_33k3BPS_CFG2 (0xE5) -#define MCP_16MHz_33k3BPS_CFG3 (0x83) /* Sample point at 75% */ +#define MCP_16MHz_33k3BPS_CFG2 (0xF1) +#define MCP_16MHz_33k3BPS_CFG3 (0x85) -#define MCP_16MHz_20kBPS_CFG1 (0x53) /* Increased SJW */ -#define MCP_16MHz_20kBPS_CFG2 (0xF6) -#define MCP_16MHz_20kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_16MHz_20kBPS_CFG1 (0x0F) +#define MCP_16MHz_20kBPS_CFG2 (0xFF) +#define MCP_16MHz_20kBPS_CFG3 (0x87) -#define MCP_16MHz_10kBPS_CFG1 (0x67) /* Increased SJW */ -#define MCP_16MHz_10kBPS_CFG2 (0xF6) -#define MCP_16MHz_10kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_16MHz_10kBPS_CFG1 (0x1F) +#define MCP_16MHz_10kBPS_CFG2 (0xFF) +#define MCP_16MHz_10kBPS_CFG3 (0x87) #define MCP_16MHz_5kBPS_CFG1 (0x3F) #define MCP_16MHz_5kBPS_CFG2 (0xFF) -#define MCP_16MHz_5kBPS_CFG3 (0x87) /* Sample point at 68% */ +#define MCP_16MHz_5kBPS_CFG3 (0x87) /* * speed 20M */ #define MCP_20MHz_1000kBPS_CFG1 (0x00) #define MCP_20MHz_1000kBPS_CFG2 (0xD9) -#define MCP_20MHz_1000kBPS_CFG3 (0x82) /* Sample point at 80% */ +#define MCP_20MHz_1000kBPS_CFG3 (0x82) -#define MCP_20MHz_500kBPS_CFG1 (0x40) /* Increased SJW */ -#define MCP_20MHz_500kBPS_CFG2 (0xF6) -#define MCP_20MHz_500kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_20MHz_500kBPS_CFG1 (0x00) +#define MCP_20MHz_500kBPS_CFG2 (0xFA) +#define MCP_20MHz_500kBPS_CFG3 (0x87) -#define MCP_20MHz_250kBPS_CFG1 (0x41) /* Increased SJW */ -#define MCP_20MHz_250kBPS_CFG2 (0xF6) -#define MCP_20MHz_250kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_20MHz_250kBPS_CFG1 (0x41) +#define MCP_20MHz_250kBPS_CFG2 (0xFB) +#define MCP_20MHz_250kBPS_CFG3 (0x86) -#define MCP_20MHz_200kBPS_CFG1 (0x44) /* Increased SJW */ -#define MCP_20MHz_200kBPS_CFG2 (0xD3) -#define MCP_20MHz_200kBPS_CFG3 (0x81) /* Sample point at 80% */ +#define MCP_20MHz_200kBPS_CFG1 (0x01) +#define MCP_20MHz_200kBPS_CFG2 (0xFF) +#define MCP_20MHz_200kBPS_CFG3 (0x87) -#define MCP_20MHz_125kBPS_CFG1 (0x44) /* Increased SJW */ -#define MCP_20MHz_125kBPS_CFG2 (0xE5) -#define MCP_20MHz_125kBPS_CFG3 (0x83) /* Sample point at 75% */ +#define MCP_20MHz_125kBPS_CFG1 (0x03) +#define MCP_20MHz_125kBPS_CFG2 (0xFA) +#define MCP_20MHz_125kBPS_CFG3 (0x87) -#define MCP_20MHz_100kBPS_CFG1 (0x44) /* Increased SJW */ -#define MCP_20MHz_100kBPS_CFG2 (0xF6) -#define MCP_20MHz_100kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_20MHz_100kBPS_CFG1 (0x04) +#define MCP_20MHz_100kBPS_CFG2 (0xFA) +#define MCP_20MHz_100kBPS_CFG3 (0x87) -#define MCP_20MHz_80kBPS_CFG1 (0xC4) /* Increased SJW */ +#define MCP_20MHz_80kBPS_CFG1 (0x04) #define MCP_20MHz_80kBPS_CFG2 (0xFF) -#define MCP_20MHz_80kBPS_CFG3 (0x87) /* Sample point at 68% */ +#define MCP_20MHz_80kBPS_CFG3 (0x87) -#define MCP_20MHz_50kBPS_CFG1 (0x49) /* Increased SJW */ -#define MCP_20MHz_50kBPS_CFG2 (0xF6) -#define MCP_20MHz_50kBPS_CFG3 (0x84) /* Sample point at 75% */ +#define MCP_20MHz_50kBPS_CFG1 (0x09) +#define MCP_20MHz_50kBPS_CFG2 (0xFA) +#define MCP_20MHz_50kBPS_CFG3 (0x87) -#define MCP_20MHz_40kBPS_CFG1 (0x18) -#define MCP_20MHz_40kBPS_CFG2 (0xD3) -#define MCP_20MHz_40kBPS_CFG3 (0x81) /* Sample point at 80% */ +#define MCP_20MHz_40kBPS_CFG1 (0x09) +#define MCP_20MHz_40kBPS_CFG2 (0xFF) +#define MCP_20MHz_40kBPS_CFG3 (0x87) #define MCPDEBUG (0) From 7298ed9bc4029e72bd385a12435a5611e4c013e8 Mon Sep 17 00:00:00 2001 From: Bascy Date: Wed, 11 Apr 2018 22:58:51 +0200 Subject: [PATCH 07/11] Added accessor method for m_rtr --- mcp_can.cpp | 5 ++++- mcp_can.h | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index de9130f..39f849c 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -731,7 +731,7 @@ void MCP_CAN::mcp2515_write_canMsg( const INT8U buffer_sidh_addr) mcp2515_setRegisterS(mcp_addr+5, m_nDta, m_nDlc ); /* write data bytes */ if ( m_nRtr == 1) /* if RTR set bit in byte */ - m_nDlc |= MCP_RTR_MASK; + m_nDlc = m_nDlc | MCP_RTR_MASK; mcp2515_setRegister((mcp_addr+4), m_nDlc ); /* write the RTR and DLC */ mcp2515_write_id(mcp_addr, m_nExtFlg, m_nID ); /* write CAN id */ @@ -1290,6 +1290,9 @@ INT8U MCP_CAN::disOneShotTX(void) return CAN_OK; } +bool MCP_CAN::isRequestMessage(){ + return m_nRtr; +} /********************************************************************************************************* END FILE *********************************************************************************************************/ diff --git a/mcp_can.h b/mcp_can.h index 8fbf871..c6d614b 100644 --- a/mcp_can.h +++ b/mcp_can.h @@ -124,6 +124,8 @@ class MCP_CAN INT8U errorCountTX(void); // Get error count INT8U enOneShotTX(void); // Enable one-shot transmission INT8U disOneShotTX(void); // Disable one-shot transmission + + bool isRequestMessage(); }; #endif From 4d582bb615debcc6a9857ab9e52865bb8fbde735 Mon Sep 17 00:00:00 2001 From: Bascy Date: Sat, 14 Apr 2018 22:33:09 +0200 Subject: [PATCH 08/11] Testing unittesting with Travis --- .travis.yml | 5 +++++ Gemfile | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 .travis.yml create mode 100644 Gemfile diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..4d2c130 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +sudo: false +language: ruby +script: + - bundle install + - bundle exec arduino_ci_remote.rb \ No newline at end of file diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..e8740e0 --- /dev/null +++ b/Gemfile @@ -0,0 +1,2 @@ +source 'https://rubygems.org' +gem 'arduino_ci' \ No newline at end of file From ca1bbfdc240666fed0fa308030cc483b8e48807f Mon Sep 17 00:00:00 2001 From: Bascy Date: Sun, 15 Apr 2018 00:12:19 +0200 Subject: [PATCH 09/11] Testing unittesting with Travis --- .arduino-ci.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .arduino-ci.yaml diff --git a/.arduino-ci.yaml b/.arduino-ci.yaml new file mode 100644 index 0000000..a158f85 --- /dev/null +++ b/.arduino-ci.yaml @@ -0,0 +1,9 @@ +compile: + libraries: ~ + platforms: + - uno + +unittest: + libraries: ~ + platforms: + - uno From 5fddd464c7263216fee3eed419b506a5605cc298 Mon Sep 17 00:00:00 2001 From: Bascy Date: Sun, 15 Apr 2018 00:22:49 +0200 Subject: [PATCH 10/11] Testing unittesting with Travis --- .arduino-ci.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.arduino-ci.yaml b/.arduino-ci.yaml index a158f85..9064797 100644 --- a/.arduino-ci.yaml +++ b/.arduino-ci.yaml @@ -1,9 +1,7 @@ compile: - libraries: ~ platforms: - uno unittest: - libraries: ~ platforms: - uno From 965527f2ac78aae88c55267b388d6d413dcc3697 Mon Sep 17 00:00:00 2001 From: Bascy Date: Thu, 3 May 2018 00:25:29 +0200 Subject: [PATCH 11/11] Disabled debug mode --- mcp_can_dfs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcp_can_dfs.h b/mcp_can_dfs.h index ae08619..f017f28 100644 --- a/mcp_can_dfs.h +++ b/mcp_can_dfs.h @@ -37,7 +37,7 @@ #endif // if print debug information -#define DEBUG_MODE 1 +// #define DEBUG_MODE 1 /* * Begin mt