diff --git a/.arduino-ci.yaml b/.arduino-ci.yaml new file mode 100644 index 0000000..9064797 --- /dev/null +++ b/.arduino-ci.yaml @@ -0,0 +1,7 @@ +compile: + platforms: + - uno + +unittest: + platforms: + - uno 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 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; + } } /********************************************************************************************************* @@ -503,24 +545,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 ) { @@ -531,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): @@ -572,7 +609,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; @@ -583,7 +620,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; } @@ -694,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 */ @@ -785,15 +822,15 @@ 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; - } + return res; +} if (num == 0){ mcp2515_write_mf(MCP_RXM0SIDH, ext, ulData); @@ -807,12 +844,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; - } + return res; + } #if DEBUG_MODE - Serial.print("Setting Mask Successful!\r\n"); + Serial.println(F("Setting Mask Successful!")); #endif return res; } @@ -826,17 +864,17 @@ 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; } - if((ulData & 0x80000000) == 0x80000000) + if((num & 0x80000000) == 0x80000000) ext = 1; if (num == 0){ @@ -851,12 +889,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; } @@ -869,13 +908,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; } @@ -914,12 +953,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; @@ -935,18 +975,18 @@ 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; } - if((ulData & 0x80000000) == 0x80000000) + if((num & 0x80000000) == 0x80000000) ext = 1; switch( num ) @@ -983,12 +1023,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; @@ -1249,43 +1290,9 @@ INT8U MCP_CAN::disOneShotTX(void) return CAN_OK; } -/********************************************************************************************************* -** Function name: mcp2515_abortTX -** Descriptions: Aborts any queued transmissions -*********************************************************************************************************/ -INT8U MCP_CAN::abortTX(void) -{ - mcp2515_modifyRegister(MCP_CANCTRL, ABORT_TX, ABORT_TX); - - // Maybe check to see if the TX buffer transmission request bits are cleared instead? - if((mcp2515_readRegister(MCP_CANCTRL) & ABORT_TX) != ABORT_TX) - return CAN_FAIL; - else - return CAN_OK; +bool MCP_CAN::isRequestMessage(){ + return m_nRtr; } - -/********************************************************************************************************* -** Function name: setGPO -** Descriptions: Public function, Checks for r -*********************************************************************************************************/ -INT8U MCP_CAN::setGPO(INT8U data) -{ - mcp2515_modifyRegister(MCP_BFPCTRL, MCP_BxBFS_MASK, (data<<4)); - - return 0; -} - -/********************************************************************************************************* -** Function name: getGPI -** Descriptions: Public function, Checks for r -*********************************************************************************************************/ -INT8U MCP_CAN::getGPI(void) -{ - INT8U res; - res = mcp2515_readRegister(MCP_TXRTSCTRL) & MCP_BxRTS_MASK; - return (res >> 3); -} - /********************************************************************************************************* END FILE *********************************************************************************************************/ diff --git a/mcp_can.h b/mcp_can.h index 51f2e18..c6d614b 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 @@ -71,7 +71,8 @@ class MCP_CAN INT8U mcp2515_readStatus(void); // Read MCP2515 Status INT8U mcp2515_setCANCTRL_Mode(const INT8U newmode); // Set mode - INT8U mcp2515_configRate(const INT8U canSpeed, // Set baud rate + INT8U mcp2515_requestNewMode(const INT8U newmode); // Set mode + INT8U mcp2515_configRate(const INT8U canSpeed, // Set baudrate const INT8U canClock); INT8U mcp2515_init(const INT8U canIDMode, // Initialize Controller @@ -105,11 +106,12 @@ class MCP_CAN public: MCP_CAN(INT8U _CS); - INT8U begin(INT8U idmodeset, INT8U speedset, INT8U clockset); // Initialize controller parameters - INT8U init_Mask(INT8U num, INT8U ext, INT32U ulData); // Initialize Mask(s) - INT8U init_Mask(INT8U num, INT32U ulData); // Initialize Mask(s) - INT8U init_Filt(INT8U num, INT8U ext, INT32U ulData); // Initialize Filter(s) - INT8U init_Filt(INT8U num, INT32U ulData); // Initialize Filter(s) + INT8U begin(INT8U idmodeset, INT8U speedset, INT8U clockset); // Initilize controller prameters + INT8U init_Mask(INT8U num, INT8U ext, INT32U ulData); // Initilize Mask(s) + 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 @@ -122,9 +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 - INT8U abortTX(void); // Abort queued transmission(s) - INT8U setGPO(INT8U data); // Sets GPO - INT8U getGPI(void); // Reads GPI + + bool isRequestMessage(); }; #endif diff --git a/mcp_can_dfs.h b/mcp_can_dfs.h index 65b6631..f017f28 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 @@ -37,7 +37,7 @@ #endif // if print debug information -#define DEBUG_MODE 1 +// #define DEBUG_MODE 1 /* * Begin mt @@ -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) @@ -470,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