From 2d1d4f219ec4c33f60a04e2a138e16c37bd4505a Mon Sep 17 00:00:00 2001 From: Dmitry Date: Fri, 25 Dec 2015 01:14:22 +0300 Subject: [PATCH 01/36] Add "const" to pData Add "const" to pData to prevent compile errors in some situations --- mcp_can.cpp | 8 ++++---- mcp_can.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index 19a0822..375efe9 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -696,7 +696,7 @@ INT8U MCP_CAN::init_Filt(INT8U num, INT8U ext, INT32U ulData) ** Function name: setMsg ** Descriptions: set can message, such as dlc, id, dta[] and so on *********************************************************************************************************/ -INT8U MCP_CAN::setMsg(INT32U id, INT8U ext, INT8U len, INT8U rtr, INT8U *pData) +INT8U MCP_CAN::setMsg(INT32U id, INT8U ext, INT8U len, INT8U rtr, const INT8U *pData) { int i = 0; m_nExtFlg = ext; @@ -715,7 +715,7 @@ INT8U MCP_CAN::setMsg(INT32U id, INT8U ext, INT8U len, INT8U rtr, INT8U *pData) ** Function name: setMsg ** Descriptions: set can message, such as dlc, id, dta[] and so on *********************************************************************************************************/ -INT8U MCP_CAN::setMsg(INT32U id, INT8U ext, INT8U len, INT8U *pData) +INT8U MCP_CAN::setMsg(INT32U id, INT8U ext, INT8U len, const INT8U *pData) { int i = 0; m_nExtFlg = ext; @@ -784,7 +784,7 @@ INT8U MCP_CAN::sendMsg() ** Function name: sendMsgBuf ** Descriptions: send buf *********************************************************************************************************/ -INT8U MCP_CAN::sendMsgBuf(INT32U id, INT8U ext, INT8U rtr, INT8U len, INT8U *buf) +INT8U MCP_CAN::sendMsgBuf(INT32U id, INT8U ext, INT8U rtr, INT8U len, const INT8U *buf) { setMsg(id, ext, len, rtr, buf); return sendMsg(); @@ -794,7 +794,7 @@ INT8U MCP_CAN::sendMsgBuf(INT32U id, INT8U ext, INT8U rtr, INT8U len, INT8U *buf ** Function name: sendMsgBuf ** Descriptions: send buf *********************************************************************************************************/ -INT8U MCP_CAN::sendMsgBuf(INT32U id, INT8U ext, INT8U len, INT8U *buf) +INT8U MCP_CAN::sendMsgBuf(INT32U id, INT8U ext, INT8U len, const INT8U *buf) { setMsg(id, ext, len, buf); return sendMsg(); diff --git a/mcp_can.h b/mcp_can.h index cbef86f..41479e0 100644 --- a/mcp_can.h +++ b/mcp_can.h @@ -89,8 +89,8 @@ private: * can operator function */ - INT8U setMsg(INT32U id, INT8U ext, INT8U len, INT8U rtr, INT8U *pData); /* set message */ - INT8U setMsg(INT32U id, INT8U ext, INT8U len, INT8U *pData); /* set message */ + INT8U setMsg(INT32U id, INT8U ext, INT8U len, INT8U rtr, const INT8U *pData); /* set message */ + INT8U setMsg(INT32U id, INT8U ext, INT8U len, const INT8U *pData); /* set message */ INT8U clearMsg(); /* clear all message to zero */ INT8U readMsg(); /* read message */ INT8U sendMsg(); /* send message */ @@ -100,8 +100,8 @@ public: INT8U begin(INT8U speedset); /* init can */ INT8U init_Mask(INT8U num, INT8U ext, INT32U ulData); /* init Masks */ INT8U init_Filt(INT8U num, INT8U ext, INT32U ulData); /* init filters */ - INT8U sendMsgBuf(INT32U id, INT8U ext, INT8U rtr, INT8U len, INT8U *buf); /* send buf */ - INT8U sendMsgBuf(INT32U id, INT8U ext, INT8U len, INT8U *buf); /* send buf */ + INT8U sendMsgBuf(INT32U id, INT8U ext, INT8U rtr, INT8U len, const INT8U *buf); /* send buf */ + INT8U sendMsgBuf(INT32U id, INT8U ext, INT8U len, const INT8U *buf); /* send buf */ INT8U readMsgBuf(INT8U *len, INT8U *buf); /* read buf */ INT8U readMsgBufID(INT32U *ID, INT8U *len, INT8U *buf); /* read buf with object ID */ INT8U checkReceive(void); /* if something received */ From 15a56d90e075ae700b9ee1e7964f59c707d84aa3 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sat, 26 Dec 2015 14:49:53 +0300 Subject: [PATCH 02/36] Add "mode" parameter to constructor --- mcp_can.cpp | 16 +++++++++++++--- mcp_can.h | 2 ++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index 375efe9..9d7f66d 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -390,7 +390,7 @@ INT8U MCP_CAN::mcp2515_init(const INT8U canSpeed) /* mcp25 MCP_RXB_RX_STDEXT); #endif /* enter normal mode */ - res = mcp2515_setCANCTRL_Mode(MODE_NORMAL); + res = mcp2515_setCANCTRL_Mode(m_mode); if(res) { #if DEBUG_MODE @@ -553,6 +553,16 @@ INT8U MCP_CAN::mcp2515_getNextFreeTXBuf(INT8U *txbuf_n) /* get N *********************************************************************************************************/ MCP_CAN::MCP_CAN(INT8U _CS) { + MCP_CAN(_CS, MODE_NORMAL); +} + +/********************************************************************************************************* +** Function name: set CS +** Descriptions: init CS pin and set UNSELECTED +*********************************************************************************************************/ +MCP_CAN::MCP_CAN(INT8U _CS, INT8U mode) +{ + m_mode = mode; SPICS = _CS; pinMode(SPICS, OUTPUT); MCP2515_UNSELECT(); @@ -603,7 +613,7 @@ INT8U MCP_CAN::init_Mask(INT8U num, INT8U ext, INT32U ulData) } else res = MCP2515_FAIL; - res = mcp2515_setCANCTRL_Mode(MODE_NORMAL); + res = mcp2515_setCANCTRL_Mode(m_mode); if(res > 0){ #if DEBUG_MODE Serial.print("Enter normal mode fall\r\n"); @@ -673,7 +683,7 @@ INT8U MCP_CAN::init_Filt(INT8U num, INT8U ext, INT32U ulData) res = MCP2515_FAIL; } - res = mcp2515_setCANCTRL_Mode(MODE_NORMAL); + res = mcp2515_setCANCTRL_Mode(m_mode); if(res > 0) { #if DEBUG_MODE diff --git a/mcp_can.h b/mcp_can.h index 41479e0..df1b78a 100644 --- a/mcp_can.h +++ b/mcp_can.h @@ -40,6 +40,7 @@ class MCP_CAN INT8U m_nRtr; /* rtr */ INT8U m_nfilhit; INT8U SPICS; + INT8U m_mode; /* * mcp2515 driver function @@ -97,6 +98,7 @@ private: public: MCP_CAN(INT8U _CS); + MCP_CAN(INT8U _CS, INT8U mode); INT8U begin(INT8U speedset); /* init can */ INT8U init_Mask(INT8U num, INT8U ext, INT32U ulData); /* init Masks */ INT8U init_Filt(INT8U num, INT8U ext, INT32U ulData); /* init filters */ From 75a299f28fb965a8c11736dab44c7089c39717a4 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Mon, 4 Jan 2016 19:53:06 +0300 Subject: [PATCH 03/36] Totally simplify --- mcp_can.cpp | 445 ++++++++++++++++---------------------------------- mcp_can.h | 55 ++----- mcp_can_dfs.h | 4 - 3 files changed, 155 insertions(+), 349 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index 9d7f66d..a87860a 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -22,8 +22,15 @@ */ #include "mcp_can.h" -#define spi_readwrite SPI.transfer -#define spi_read() spi_readwrite(0x00) +void MCP_CAN::startSPI() { + SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0)); + digitalWrite(SPICS, LOW); +} + +void MCP_CAN::endSPI() { + digitalWrite(SPICS, HIGH); + SPI.endTransaction(); +} /********************************************************************************************************* ** Function name: mcp2515_reset @@ -31,9 +38,9 @@ *********************************************************************************************************/ void MCP_CAN::mcp2515_reset(void) { - MCP2515_SELECT(); - spi_readwrite(MCP_RESET); - MCP2515_UNSELECT(); + startSPI(); + SPI.transfer(MCP_RESET); + endSPI(); delay(10); } @@ -45,11 +52,11 @@ INT8U MCP_CAN::mcp2515_readRegister(const INT8U address) { INT8U ret; - MCP2515_SELECT(); - spi_readwrite(MCP_READ); - spi_readwrite(address); - ret = spi_read(); - MCP2515_UNSELECT(); + startSPI(); + SPI.transfer(MCP_READ); + SPI.transfer(address); + ret = SPI.transfer(0x00); + endSPI(); return ret; } @@ -61,14 +68,14 @@ INT8U MCP_CAN::mcp2515_readRegister(const INT8U address) void MCP_CAN::mcp2515_readRegisterS(const INT8U address, INT8U values[], const INT8U n) { INT8U i; - MCP2515_SELECT(); - spi_readwrite(MCP_READ); - spi_readwrite(address); + startSPI(); + SPI.transfer(MCP_READ); + SPI.transfer(address); // mcp2515 has auto-increment of address-pointer - for (i=0; i>5); - - if ( (tbufdata[MCP_SIDL] & MCP_TXB_EXIDE_M) == MCP_TXB_EXIDE_M ) - { - /* extended id */ - *id = (*id<<2) + (tbufdata[MCP_SIDL] & 0x03); - *id = (*id<<8) + tbufdata[MCP_EID8]; - *id = (*id<<8) + tbufdata[MCP_EID0]; - *ext = 1; - } -} - -/********************************************************************************************************* -** Function name: mcp2515_write_canMsg -** Descriptions: write msg -*********************************************************************************************************/ -void MCP_CAN::mcp2515_write_canMsg( const INT8U buffer_sidh_addr) -{ - INT8U mcp_addr; - mcp_addr = 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; - } - mcp2515_setRegister((mcp_addr+4), m_nDlc ); /* write the RTR and DLC */ - mcp2515_write_id(mcp_addr, m_nExtFlg, m_nID ); /* write CAN id */ - -} - -/********************************************************************************************************* -** Function name: mcp2515_read_canMsg -** Descriptions: read message -*********************************************************************************************************/ -void MCP_CAN::mcp2515_read_canMsg( const INT8U buffer_sidh_addr) /* read can msg */ -{ - INT8U mcp_addr, ctrl; - - mcp_addr = buffer_sidh_addr; - - mcp2515_read_id( mcp_addr, &m_nExtFlg,&m_nID ); - - ctrl = mcp2515_readRegister( mcp_addr-1 ); - m_nDlc = mcp2515_readRegister( mcp_addr+4 ); - - if ((ctrl & 0x08)) { - m_nRtr = 1; - } - else { - m_nRtr = 0; - } - - m_nDlc &= MCP_DLC_MASK; - mcp2515_readRegisterS( mcp_addr+5, &(m_nDta[0]), m_nDlc ); -} - -/********************************************************************************************************* -** Function name: sendMsg -** Descriptions: send message -*********************************************************************************************************/ -void MCP_CAN::mcp2515_start_transmit(const INT8U mcp_addr) /* start transmit */ -{ - mcp2515_modifyRegister( mcp_addr-1 , MCP_TXB_TXREQ_M, MCP_TXB_TXREQ_M ); -} - /********************************************************************************************************* ** Function name: sendMsg ** Descriptions: send message @@ -547,15 +476,6 @@ INT8U MCP_CAN::mcp2515_getNextFreeTXBuf(INT8U *txbuf_n) /* get N return res; } -/********************************************************************************************************* -** Function name: set CS -** Descriptions: init CS pin and set UNSELECTED -*********************************************************************************************************/ -MCP_CAN::MCP_CAN(INT8U _CS) -{ - MCP_CAN(_CS, MODE_NORMAL); -} - /********************************************************************************************************* ** Function name: set CS ** Descriptions: init CS pin and set UNSELECTED @@ -565,7 +485,7 @@ MCP_CAN::MCP_CAN(INT8U _CS, INT8U mode) m_mode = mode; SPICS = _CS; pinMode(SPICS, OUTPUT); - MCP2515_UNSELECT(); + endSPI(); } /********************************************************************************************************* @@ -586,7 +506,7 @@ INT8U MCP_CAN::begin(INT8U speedset) ** Function name: init_Mask ** Descriptions: init canid Masks *********************************************************************************************************/ -INT8U MCP_CAN::init_Mask(INT8U num, INT8U ext, INT32U ulData) +INT8U MCP_CAN::init_Mask(INT8U num, bool ext, INT32U ulData) { INT8U res = MCP2515_OK; #if DEBUG_MODE @@ -634,7 +554,7 @@ INT8U MCP_CAN::init_Mask(INT8U num, INT8U ext, INT32U ulData) ** Function name: init_Filt ** Descriptions: init canid filters *********************************************************************************************************/ -INT8U MCP_CAN::init_Filt(INT8U num, INT8U ext, INT32U ulData) +INT8U MCP_CAN::init_Filt(INT8U num, bool ext, INT32U ulData) { INT8U res = MCP2515_OK; #if DEBUG_MODE @@ -703,182 +623,102 @@ INT8U MCP_CAN::init_Filt(INT8U num, INT8U ext, INT32U ulData) } /********************************************************************************************************* -** Function name: setMsg -** Descriptions: set can message, such as dlc, id, dta[] and so on +** Function name: sendMsgBuf +** Descriptions: send buf *********************************************************************************************************/ -INT8U MCP_CAN::setMsg(INT32U id, INT8U ext, INT8U len, INT8U rtr, const INT8U *pData) +INT8U MCP_CAN::sendMessage(const INT32U id, const bool ext, const bool rtr, const INT8U len, const INT8U *buf) { - int i = 0; - m_nExtFlg = ext; - m_nID = id; - m_nDlc = len; - m_nRtr = rtr; - for(i = 0; i>5); + + if ( (tbufdata[MCP_SIDL] & MCP_TXB_EXIDE_M) == MCP_TXB_EXIDE_M ) { + *id = (*id<<2) + (tbufdata[MCP_SIDL] & 0x03); + *id = (*id<<8) + tbufdata[MCP_EID8]; + *id = (*id<<8) + tbufdata[MCP_EID0]; + *ext = true; + } else { + *ext = false; + } + + INT8U ctrl = mcp2515_readRegister( buffer_sidh_addr-1 ); + if (ctrl & 0x08) { + *rtr = true; + } else { + *rtr = false; + } + + INT8U mDlc = mcp2515_readRegister( buffer_sidh_addr+4 ); + *dlc = mDlc & MCP_DLC_MASK; + if (*dlc > CAN_MAX_CHAR_IN_MESSAGE) { + return CAN_FAIL; + } + + mcp2515_readRegisterS(buffer_sidh_addr+5, buf, *dlc); + + switch (buffer_sidh_addr) { + case MCP_RXBUF_0: + mcp2515_modifyRegister(MCP_CANINTF, MCP_RX0IF, 0); + break; + case MCP_RXBUF_1: + mcp2515_modifyRegister(MCP_CANINTF, MCP_RX1IF, 0); + break; + } + + return CAN_OK; } -/********************************************************************************************************* -** Function name: sendMsgBuf -** Descriptions: send buf -*********************************************************************************************************/ -INT8U MCP_CAN::sendMsgBuf(INT32U id, INT8U ext, INT8U len, const INT8U *buf) -{ - setMsg(id, ext, len, buf); - return sendMsg(); -} - - -/********************************************************************************************************* -** Function name: readMsg -** Descriptions: read message -*********************************************************************************************************/ -INT8U MCP_CAN::readMsg() -{ - INT8U stat, res; - - stat = mcp2515_readStatus(); - - if ( stat & MCP_STAT_RX0IF ) /* Msg in Buffer 0 */ - { - mcp2515_read_canMsg( MCP_RXBUF_0); - mcp2515_modifyRegister(MCP_CANINTF, MCP_RX0IF, 0); - res = CAN_OK; - } - else if ( stat & MCP_STAT_RX1IF ) /* Msg in Buffer 1 */ - { - mcp2515_read_canMsg( MCP_RXBUF_1); - mcp2515_modifyRegister(MCP_CANINTF, MCP_RX1IF, 0); - res = CAN_OK; - } - else - { - res = CAN_NOMSG; - } - return res; -} - -/********************************************************************************************************* -** Function name: readMsgBuf -** Descriptions: read message buf -*********************************************************************************************************/ -INT8U MCP_CAN::readMsgBuf(INT8U *len, INT8U buf[]) +INT8U MCP_CAN::readMessage(INT32U *id, INT8U *len, INT8U buf[], bool *rtr, bool *ext) { INT8U rc; - - rc = readMsg(); - - if (rc == CAN_OK) { - *len = m_nDlc; - for(int i = 0; i Date: Mon, 4 Jan 2016 20:25:24 +0300 Subject: [PATCH 04/36] Remove wait for CAN TX --- mcp_can.cpp | 54 ++++++++++++++--------------------------------------- mcp_can.h | 2 -- 2 files changed, 14 insertions(+), 42 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index a87860a..77119f0 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -451,31 +451,6 @@ void MCP_CAN::mcp2515_write_id( const INT8U mcp_addr, const bool ext, const INT3 mcp2515_setRegisterS( mcp_addr, tbufdata, 4 ); } -/********************************************************************************************************* -** Function name: sendMsg -** Descriptions: send message -*********************************************************************************************************/ -INT8U MCP_CAN::mcp2515_getNextFreeTXBuf(INT8U *txbuf_n) /* get Next free txbuf */ -{ - INT8U res, i, ctrlval; - INT8U ctrlregs[MCP_N_TXBUFFERS] = { MCP_TXB0CTRL, MCP_TXB1CTRL, MCP_TXB2CTRL }; - - res = MCP_ALLTXBUSY; - *txbuf_n = 0x00; - - /* check all 3 TX-Buffers */ - for (i=0; i Date: Wed, 6 Jan 2016 04:08:44 +0300 Subject: [PATCH 05/36] Refactoring C -> C++ --- mcp_can.cpp | 609 +++++++++++++++++++------------------------------- mcp_can.h | 333 ++++++++++++++++++++------- mcp_can_dfs.h | 294 +----------------------- 3 files changed, 489 insertions(+), 747 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index 77119f0..5094593 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -1,29 +1,18 @@ -/* - mcp_can.cpp - 2012 Copyright (c) Seeed Technology Inc. All right reserved. - - Author:Loovee - Contributor: Cory J. Fowler - 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 - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110- - 1301 USA -*/ #include "mcp_can.h" +const struct MCP_CAN::TXBn_REGS MCP_CAN::TXB[MCP_CAN::N_TXBUFFERS] = { + {MCP_TXB0CTRL, MCP_TXB0SIDH, MCP_TXB0DATA}, + {MCP_TXB1CTRL, MCP_TXB1SIDH, MCP_TXB1DATA}, + {MCP_TXB2CTRL, MCP_TXB2SIDH, MCP_TXB2DATA} +}; + +const struct MCP_CAN::RXBn_REGS MCP_CAN::RXB[N_RXBUFFERS] = { + {MCP_RXB0CTRL, MCP_RXB0SIDH, MCP_RXB0DATA}, + {MCP_RXB1CTRL, MCP_RXB1SIDH, MCP_RXB1DATA} +}; + void MCP_CAN::startSPI() { - SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0)); + SPI.beginTransaction(SPISettings(SPI_CLOCK, MSBFIRST, SPI_MODE0)); digitalWrite(SPICS, LOW); } @@ -39,84 +28,78 @@ void MCP_CAN::endSPI() { void MCP_CAN::mcp2515_reset(void) { startSPI(); - SPI.transfer(MCP_RESET); + SPI.transfer(INSTRUCTION_RESET); endSPI(); delay(10); } /********************************************************************************************************* -** Function name: mcp2515_readRegister +** Function name: readRegister ** Descriptions: read register *********************************************************************************************************/ -INT8U MCP_CAN::mcp2515_readRegister(const INT8U address) +uint8_t MCP_CAN::readRegister(const REGISTER reg) { - INT8U ret; - startSPI(); - SPI.transfer(MCP_READ); - SPI.transfer(address); - ret = SPI.transfer(0x00); + SPI.transfer(INSTRUCTION_READ); + SPI.transfer(reg); + uint8_t ret = SPI.transfer(0x00); endSPI(); return ret; } /********************************************************************************************************* -** Function name: mcp2515_readRegisterS +** Function name: readRegisterS ** Descriptions: read registerS *********************************************************************************************************/ -void MCP_CAN::mcp2515_readRegisterS(const INT8U address, INT8U values[], const INT8U n) +void MCP_CAN::readRegisterS(const REGISTER address, uint8_t values[], const uint8_t n) { - INT8U i; - startSPI(); - SPI.transfer(MCP_READ); - SPI.transfer(address); - // mcp2515 has auto-increment of address-pointer - for (i=0; i TXBnD7 */ - a1 = MCP_TXB0CTRL; - a2 = MCP_TXB1CTRL; - a3 = MCP_TXB2CTRL; - for (i = 0; i < 14; i++) { /* in-buffer loop */ - mcp2515_setRegister(a1, 0); - mcp2515_setRegister(a2, 0); - mcp2515_setRegister(a3, 0); - a1++; - a2++; - a3++; - } - mcp2515_setRegister(MCP_RXB0CTRL, 0); - mcp2515_setRegister(MCP_RXB1CTRL, 0); + uint8_t zeros[14]; + memset(zeros, 0, sizeof(zeros)); + setRegisterS(MCP_TXB0CTRL, zeros, 14); + setRegisterS(MCP_TXB1CTRL, zeros, 14); + setRegisterS(MCP_TXB2CTRL, zeros, 14); + + setRegister(MCP_RXB0CTRL, 0); + setRegister(MCP_RXB1CTRL, 0); } /********************************************************************************************************* ** Function name: mcp2515_init ** Descriptions: init the device *********************************************************************************************************/ -INT8U MCP_CAN::mcp2515_init(const INT8U canSpeed) /* mcp2515init */ +MCP_CAN::ERROR MCP_CAN::mcp2515_init(const CAN_SPEED canSpeed) /* mcp2515init */ { - - INT8U res; - mcp2515_reset(); - res = mcp2515_setCANCTRL_Mode(MODE_CONFIG); - if(res > 0) - { -#if DEBUG_MODE - Serial.print("Enter setting mode fall\r\n"); -#else - delay(10); -#endif - return res; - } -#if DEBUG_MODE - Serial.print("Enter setting mode success \r\n"); -#else + ERROR res = setCANCTRL_Mode(MODE_CONFIG); delay(10); -#endif - - /* set boadrate */ - if(mcp2515_configRate(canSpeed)) - { -#if DEBUG_MODE - Serial.print("set rate fall!!\r\n"); -#else - delay(10); -#endif - return res; + if (res != ERROR_OK) { + return res; } -#if DEBUG_MODE - Serial.print("set rate success!!\r\n"); -#else + + res = configRate(canSpeed); delay(10); -#endif - - if ( res == MCP2515_OK ) { - - /* init canbuffers */ - mcp2515_initCANBuffers(); - - /* interrupt mode */ - mcp2515_setRegister(MCP_CANINTE, MCP_RX0IF | MCP_RX1IF); - -#if (DEBUG_RXANY==1) - /* enable both receive-buffers */ - /* to receive any message */ - /* and enable rollover */ - mcp2515_modifyRegister(MCP_RXB0CTRL, - MCP_RXB_RX_MASK | MCP_RXB_BUKT_MASK, - MCP_RXB_RX_ANY | MCP_RXB_BUKT_MASK); - mcp2515_modifyRegister(MCP_RXB1CTRL, MCP_RXB_RX_MASK, - MCP_RXB_RX_ANY); -#else - /* enable both receive-buffers */ - /* to receive messages */ - /* with std. and ext. identifie */ - /* rs */ - /* and enable rollover */ - mcp2515_modifyRegister(MCP_RXB0CTRL, - MCP_RXB_RX_MASK | MCP_RXB_BUKT_MASK, - MCP_RXB_RX_STDEXT | MCP_RXB_BUKT_MASK ); - mcp2515_modifyRegister(MCP_RXB1CTRL, MCP_RXB_RX_MASK, - MCP_RXB_RX_STDEXT); -#endif - /* enter normal mode */ - res = mcp2515_setCANCTRL_Mode(m_mode); - if(res) - { -#if DEBUG_MODE - Serial.print("Enter Normal Mode Fall!!\r\n"); -#else - delay(10); -#endif - return res; - } - - -#if DEBUG_MODE - Serial.print("Enter Normal Mode Success!!\r\n"); -#else - delay(10); -#endif - + if (res != ERROR_OK) { + return res; } + + initCANBuffers(); + + setRegister(MCP_CANINTE, CANINTF_RX0IF | CANINTF_RX1IF); + + modifyRegister(MCP_RXB0CTRL, + MCP_RXB_RX_MASK | MCP_RXB_BUKT_MASK, + MCP_RXB_RX_STDEXT | MCP_RXB_BUKT_MASK ); + modifyRegister(MCP_RXB1CTRL, MCP_RXB_RX_MASK, + MCP_RXB_RX_STDEXT); + /* enter normal mode */ + res = setCANCTRL_Mode(m_mode); + delay(10); + return res; } /********************************************************************************************************* -** Function name: mcp2515_write_id +** Function name: write_id ** Descriptions: write can id *********************************************************************************************************/ -void MCP_CAN::mcp2515_write_id( const INT8U mcp_addr, const bool ext, const INT32U id ) +void MCP_CAN::write_id(const REGISTER mcp_addr, const bool ext, const uint32_t id) { - uint16_t canid; - INT8U tbufdata[4]; + uint8_t tbufdata[4]; - canid = (uint16_t)(id & 0x0FFFF); + prepareId(tbufdata, ext, id); - if ( ext == 1) - { - tbufdata[MCP_EID0] = (INT8U) (canid & 0xFF); - tbufdata[MCP_EID8] = (INT8U) (canid >> 8); + setRegisterS(mcp_addr, tbufdata, 4); +} + +void MCP_CAN::prepareId(uint8_t *buffer, const bool ext, const uint32_t id) +{ + uint16_t canid = (uint16_t)(id & 0x0FFFF); + + if (ext) { + buffer[MCP_EID0] = (uint8_t) (canid & 0xFF); + buffer[MCP_EID8] = (uint8_t) (canid >> 8); canid = (uint16_t)(id >> 16); - tbufdata[MCP_SIDL] = (INT8U) (canid & 0x03); - tbufdata[MCP_SIDL] += (INT8U) ((canid & 0x1C) << 3); - tbufdata[MCP_SIDL] |= MCP_TXB_EXIDE_M; - tbufdata[MCP_SIDH] = (INT8U) (canid >> 5 ); + buffer[MCP_SIDL] = (uint8_t) (canid & 0x03); + buffer[MCP_SIDL] += (uint8_t) ((canid & 0x1C) << 3); + buffer[MCP_SIDL] |= TXB_EXIDE_MASK; + buffer[MCP_SIDH] = (uint8_t) (canid >> 5 ); + } else { + buffer[MCP_SIDH] = (uint8_t) (canid >> 3 ); + buffer[MCP_SIDL] = (uint8_t) ((canid & 0x07 ) << 5); + buffer[MCP_EID0] = 0; + buffer[MCP_EID8] = 0; } - else - { - tbufdata[MCP_SIDH] = (INT8U) (canid >> 3 ); - tbufdata[MCP_SIDL] = (INT8U) ((canid & 0x07 ) << 5); - tbufdata[MCP_EID0] = 0; - tbufdata[MCP_EID8] = 0; - } - mcp2515_setRegisterS( mcp_addr, tbufdata, 4 ); } /********************************************************************************************************* ** Function name: set CS ** Descriptions: init CS pin and set UNSELECTED *********************************************************************************************************/ -MCP_CAN::MCP_CAN(INT8U _CS, INT8U mode) +MCP_CAN::MCP_CAN(uint8_t _CS, MODE mode) { m_mode = mode; SPICS = _CS; @@ -467,182 +380,133 @@ MCP_CAN::MCP_CAN(INT8U _CS, INT8U mode) ** Function name: init ** Descriptions: init can and set speed *********************************************************************************************************/ -INT8U MCP_CAN::begin(INT8U speedset) +MCP_CAN::ERROR MCP_CAN::begin(const CAN_SPEED speedset) { - INT8U res; - SPI.begin(); - res = mcp2515_init(speedset); - if (res == MCP2515_OK) return CAN_OK; - else return CAN_FAILINIT; + return mcp2515_init(speedset); } /********************************************************************************************************* -** Function name: init_Mask +** Function name: initMask ** Descriptions: init canid Masks *********************************************************************************************************/ -INT8U MCP_CAN::init_Mask(INT8U num, bool ext, INT32U ulData) +MCP_CAN::ERROR MCP_CAN::initMask(uint8_t num, const bool ext, uint32_t ulData) { - INT8U res = MCP2515_OK; -#if DEBUG_MODE - Serial.print("Begin to set Mask!!\r\n"); -#else delay(10); -#endif - res = mcp2515_setCANCTRL_Mode(MODE_CONFIG); - if(res > 0){ -#if DEBUG_MODE - Serial.print("Enter setting mode fall\r\n"); -#else - delay(10); -#endif - return res; - } - - if (num == 0){ - mcp2515_write_id(MCP_RXM0SIDH, ext, ulData); + ERROR res = setCANCTRL_Mode(MODE_CONFIG); + if (res != ERROR_OK){ + delay(10); + return res; } - else if(num == 1){ - mcp2515_write_id(MCP_RXM1SIDH, ext, ulData); - } - else res = MCP2515_FAIL; - res = mcp2515_setCANCTRL_Mode(m_mode); - if(res > 0){ -#if DEBUG_MODE - Serial.print("Enter normal mode fall\r\n"); -#else + if (num == 0) { + write_id(MCP_RXM0SIDH, ext, ulData); + } else if (num == 1){ + write_id(MCP_RXM1SIDH, ext, ulData); + } else { + //res = ERROR_FAIL; + } + + res = setCANCTRL_Mode(m_mode); delay(10); -#endif - return res; - } -#if DEBUG_MODE - Serial.print("set Mask success!!\r\n"); -#else - delay(10); -#endif return res; } /********************************************************************************************************* -** Function name: init_Filt +** Function name: initFilt ** Descriptions: init canid filters *********************************************************************************************************/ -INT8U MCP_CAN::init_Filt(INT8U num, bool ext, INT32U ulData) +MCP_CAN::ERROR MCP_CAN::initFilt(uint8_t num, const bool ext, uint32_t ulData) { - INT8U res = MCP2515_OK; -#if DEBUG_MODE - Serial.print("Begin to set Filter!!\r\n"); -#else delay(10); -#endif - res = mcp2515_setCANCTRL_Mode(MODE_CONFIG); - if(res > 0) - { -#if DEBUG_MODE - Serial.print("Enter setting mode fall\r\n"); -#else - delay(10); -#endif - return res; + ERROR res = setCANCTRL_Mode(MODE_CONFIG); + if (res != ERROR_OK) { + delay(10); + return res; } - switch( num ) - { + switch (num) { case 0: - mcp2515_write_id(MCP_RXF0SIDH, ext, ulData); + write_id(MCP_RXF0SIDH, ext, ulData); break; case 1: - mcp2515_write_id(MCP_RXF1SIDH, ext, ulData); + write_id(MCP_RXF1SIDH, ext, ulData); break; case 2: - mcp2515_write_id(MCP_RXF2SIDH, ext, ulData); + write_id(MCP_RXF2SIDH, ext, ulData); break; case 3: - mcp2515_write_id(MCP_RXF3SIDH, ext, ulData); + write_id(MCP_RXF3SIDH, ext, ulData); break; case 4: - mcp2515_write_id(MCP_RXF4SIDH, ext, ulData); + write_id(MCP_RXF4SIDH, ext, ulData); break; case 5: - mcp2515_write_id(MCP_RXF5SIDH, ext, ulData); + write_id(MCP_RXF5SIDH, ext, ulData); break; default: - res = MCP2515_FAIL; + //res = ERROR_FAIL; + break; } - res = mcp2515_setCANCTRL_Mode(m_mode); - if(res > 0) - { -#if DEBUG_MODE - Serial.print("Enter normal mode fall\r\nSet filter fail!!\r\n"); -#else - delay(10); -#endif - return res; - } -#if DEBUG_MODE - Serial.print("set Filter success!!\r\n"); -#else + res = setCANCTRL_Mode(m_mode); delay(10); -#endif - return res; } -/********************************************************************************************************* -** Function name: sendMsgBuf -** Descriptions: send buf -*********************************************************************************************************/ -INT8U MCP_CAN::sendMessage(const INT32U id, const bool ext, const bool rtr, const INT8U len, const INT8U *buf) +MCP_CAN::ERROR MCP_CAN::sendMessage(const uint32_t id, const bool ext, const bool rtr, const uint8_t len, const uint8_t *buf) { - INT8U txbuf_n = 0; - INT8U ctrlregs[MCP_N_TXBUFFERS] = { MCP_TXB0CTRL, MCP_TXB1CTRL, MCP_TXB2CTRL }; + if (len > CAN_MAX_CHAR_IN_MESSAGE) { + return ERROR_FAILTX; + } - for (int i=0; iSIDH, data, 5 + len); - return CAN_OK; + modifyRegister(txbuf->CTRL, TXB_TXREQ, TXB_TXREQ); + + return ERROR_OK; } -INT8U MCP_CAN::readMessage(const INT8U buffer_sidh_addr, INT32U *id, INT8U *dlc, INT8U buf[], bool *rtr, bool *ext) /* read can msg */ +MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, uint32_t *id, uint8_t *dlc, uint8_t buf[], bool *rtr, bool *ext) { - INT8U tbufdata[4]; + const struct RXBn_REGS *rxb = &RXB[rxbn]; - mcp2515_readRegisterS(buffer_sidh_addr, tbufdata, 4); + uint8_t tbufdata[5]; + + readRegisterS(rxb->SIDH, tbufdata, 5); *id = (tbufdata[MCP_SIDH]<<3) + (tbufdata[MCP_SIDL]>>5); - if ( (tbufdata[MCP_SIDL] & MCP_TXB_EXIDE_M) == MCP_TXB_EXIDE_M ) { + if ( (tbufdata[MCP_SIDL] & TXB_EXIDE_MASK) == TXB_EXIDE_MASK ) { *id = (*id<<2) + (tbufdata[MCP_SIDL] & 0x03); *id = (*id<<8) + tbufdata[MCP_EID8]; *id = (*id<<8) + tbufdata[MCP_EID0]; @@ -651,46 +515,43 @@ INT8U MCP_CAN::readMessage(const INT8U buffer_sidh_addr, INT32U *id, INT8U *dlc, *ext = false; } - INT8U ctrl = mcp2515_readRegister( buffer_sidh_addr-1 ); + *dlc = tbufdata[MCP_DLC] & DLC_MASK; + if (*dlc > CAN_MAX_CHAR_IN_MESSAGE) { + return ERROR_FAIL; + } + + uint8_t ctrl = readRegister(rxb->CTRL); if (ctrl & 0x08) { *rtr = true; } else { *rtr = false; } - INT8U mDlc = mcp2515_readRegister( buffer_sidh_addr+4 ); - *dlc = mDlc & MCP_DLC_MASK; - if (*dlc > CAN_MAX_CHAR_IN_MESSAGE) { - return CAN_FAIL; - } + readRegisterS(rxb->DATA, buf, *dlc); - mcp2515_readRegisterS(buffer_sidh_addr+5, buf, *dlc); - - switch (buffer_sidh_addr) { - case MCP_RXBUF_0: - mcp2515_modifyRegister(MCP_CANINTF, MCP_RX0IF, 0); + switch (rxbn) { + case RXB0: + modifyRegister(MCP_CANINTF, CANINTF_RX0IF, 0); break; - case MCP_RXBUF_1: - mcp2515_modifyRegister(MCP_CANINTF, MCP_RX1IF, 0); + case RXB1: + modifyRegister(MCP_CANINTF, CANINTF_RX1IF, 0); break; } - return CAN_OK; + return ERROR_OK; } -INT8U MCP_CAN::readMessage(INT32U *id, INT8U *len, INT8U buf[], bool *rtr, bool *ext) +MCP_CAN::ERROR MCP_CAN::readMessage(uint32_t *id, uint8_t *len, uint8_t buf[], bool *rtr, bool *ext) { - INT8U rc; - INT8U stat = mcp2515_readStatus(); + ERROR rc; + uint8_t stat = getStatus(); - if ( stat & MCP_STAT_RX0IF ) { - readMessage(MCP_RXBUF_0, id, len, buf, rtr, ext); - rc = CAN_OK; - } else if ( stat & MCP_STAT_RX1IF ) { - readMessage(MCP_RXBUF_1, id, len, buf, rtr, ext); - rc = CAN_OK; + if ( stat & STAT_RX0IF ) { + rc = readMessage(RXB0, id, len, buf, rtr, ext); + } else if ( stat & STAT_RX1IF ) { + rc = readMessage(RXB1, id, len, buf, rtr, ext); } else { - rc = CAN_NOMSG; + rc = ERROR_NOMSG; } return rc; @@ -700,17 +561,13 @@ INT8U MCP_CAN::readMessage(INT32U *id, INT8U *len, INT8U buf[], bool *rtr, bool ** Function name: checkReceive ** Descriptions: check if got something *********************************************************************************************************/ -INT8U MCP_CAN::checkReceive(void) +bool MCP_CAN::checkReceive(void) { - INT8U res; - res = mcp2515_readStatus(); /* RXnIF in Bit 1 and 0 */ - if ( res & MCP_STAT_RXIF_MASK ) - { - return CAN_MSGAVAIL; - } - else - { - return CAN_NOMSG; + uint8_t res = getStatus(); + if ( res & STAT_RXIF_MASK ) { + return true; + } else { + return false; } } @@ -718,42 +575,34 @@ INT8U MCP_CAN::checkReceive(void) ** Function name: checkError ** Descriptions: if something error *********************************************************************************************************/ -INT8U MCP_CAN::checkError(void) +bool MCP_CAN::checkError(void) { - INT8U eflg = mcp2515_readRegister(MCP_EFLG); + uint8_t eflg = readRegister(MCP_EFLG); - if ( eflg & MCP_EFLG_ERRORMASK ) - { - return CAN_CTRLERROR; - } - else - { - return CAN_OK; + if ( eflg & EFLG_ERRORMASK ) { + return true; + } else { + return false; } } -INT8U MCP_CAN::getInterrupts(void) +uint8_t MCP_CAN::getInterrupts(void) { - return mcp2515_readRegister(MCP_CANINTF); + return readRegister(MCP_CANINTF); } void MCP_CAN::clearInterrupts(void) { - mcp2515_setRegister(MCP_CANINTF, 0); + setRegister(MCP_CANINTF, 0); } -INT8U MCP_CAN::getInterruptMask(void) +uint8_t MCP_CAN::getInterruptMask(void) { - return mcp2515_readRegister(MCP_CANINTE); + return readRegister(MCP_CANINTE); } void MCP_CAN::clearTXInterrupts(void) { - mcp2515_modifyRegister(MCP_CANINTF, MCP_TX_INT, 0); -} - -INT8U MCP_CAN::getCanStat(void) -{ - return mcp2515_readStatus(); + modifyRegister(MCP_CANINTF, (CANINTF_TX0IF | CANINTF_TX1IF | CANINTF_TX2IF), 0); } diff --git a/mcp_can.h b/mcp_can.h index 3326da5..10de160 100644 --- a/mcp_can.h +++ b/mcp_can.h @@ -1,92 +1,275 @@ -/* - mcp_can.h - 2012 Copyright (c) Seeed Technology Inc. All right reserved. - - Author:Loovee - Contributor: Cory J. Fowler - 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 - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110- - 1301 USA -*/ #ifndef _MCP2515_H_ #define _MCP2515_H_ +#include + #include "mcp_can_dfs.h" +enum CAN_SPEED { + CAN_5KBPS, + CAN_10KBPS, + CAN_20KBPS, + CAN_31K25BPS, + CAN_33KBPS, + CAN_40KBPS, + CAN_50KBPS, + CAN_80KBPS, + CAN_83K3BPS, + CAN_95KBPS, + CAN_100KBPS, + CAN_125KBPS, + CAN_200KBPS, + CAN_250KBPS, + CAN_500KBPS, + CAN_1000KBPS +}; + class MCP_CAN { + public: + enum ERROR { + ERROR_OK = 0, + ERROR_FAIL = 1, + ERROR_ALLTXBUSY = 2, + ERROR_FAILINIT = 3, + ERROR_FAILTX = 4, + ERROR_NOMSG = 5 + }; + + enum RXBn { + RXB0 = 0, + RXB1 = 1 + }; + + enum /*class*/ MODE : uint8_t { + MODE_NORMAL = 0x00, + MODE_SLEEP = 0x20, + MODE_LOOPBACK = 0x40, + MODE_LISTENONLY = 0x60, + MODE_CONFIG = 0x80, + MODE_POWERUP = 0xE0 + }; + + enum /*class*/ CANINTF : uint8_t { + CANINTF_RX0IF = 0x01, + CANINTF_RX1IF = 0x02, + CANINTF_TX0IF = 0x04, + CANINTF_TX1IF = 0x08, + CANINTF_TX2IF = 0x10, + CANINTF_ERRIF = 0x20, + CANINTF_WAKIF = 0x40, + CANINTF_MERRF = 0x80 + }; + private: - INT8U SPICS; - INT8U m_mode; + static const uint8_t MODE_MASK = 0xE0; -/* -* mcp2515 driver function -*/ - // private: -private: + static const uint8_t TXB_EXIDE_MASK = 0x08; + static const uint8_t DLC_MASK = 0x0F; + static const uint8_t RTR_MASK = 0x40; - void mcp2515_reset(void); /* reset mcp2515 */ + enum /*class*/ STAT : uint8_t { + STAT_RX0IF = (1<<0), + STAT_RX1IF = (1<<1) + }; - INT8U mcp2515_readRegister(const INT8U address); /* read mcp2515's register */ + static const uint8_t STAT_RXIF_MASK = STAT_RX0IF | STAT_RX1IF; + + enum /*class*/ TXBnCTRL : uint8_t { + TXB_ABTF = 0x40, + TXB_MLOA = 0x20, + TXB_TXERR = 0x10, + TXB_TXREQ = 0x08, + TXB_TXIE = 0x04, + TXB_TXP = 0x03 + }; + + enum /*class*/ EFLG : uint8_t { + EFLG_RX1OVR = (1<<7), + EFLG_RX0OVR = (1<<6), + EFLG_TXBO = (1<<5), + EFLG_TXEP = (1<<4), + EFLG_RXEP = (1<<3), + EFLG_TXWAR = (1<<2), + EFLG_RXWAR = (1<<1), + EFLG_EWARN = (1<<0) + }; + + static const uint8_t EFLG_ERRORMASK = EFLG_RX1OVR + | EFLG_RX0OVR + | EFLG_TXBO + | EFLG_TXEP + | EFLG_RXEP; + + enum /*class*/ INSTRUCTION : uint8_t { + INSTRUCTION_WRITE = 0x02, + INSTRUCTION_READ = 0x03, + INSTRUCTION_BITMOD = 0x05, + INSTRUCTION_LOAD_TX0 = 0x40, + INSTRUCTION_LOAD_TX1 = 0x42, + INSTRUCTION_LOAD_TX2 = 0x44, + INSTRUCTION_RTS_TX0 = 0x81, + INSTRUCTION_RTS_TX1 = 0x82, + INSTRUCTION_RTS_TX2 = 0x84, + INSTRUCTION_RTS_ALL = 0x87, + INSTRUCTION_READ_RX0 = 0x90, + INSTRUCTION_READ_RX1 = 0x94, + INSTRUCTION_READ_STATUS = 0xA0, + INSTRUCTION_RX_STATUS = 0xB0, + INSTRUCTION_RESET = 0xC0 + }; + + enum /*class*/ REGISTER : uint8_t { + MCP_RXF0SIDH = 0x00, + MCP_RXF0SIDL = 0x01, + MCP_RXF0EID8 = 0x02, + MCP_RXF0EID0 = 0x03, + MCP_RXF1SIDH = 0x04, + MCP_RXF1SIDL = 0x05, + MCP_RXF1EID8 = 0x06, + MCP_RXF1EID0 = 0x07, + MCP_RXF2SIDH = 0x08, + MCP_RXF2SIDL = 0x09, + MCP_RXF2EID8 = 0x0A, + MCP_RXF2EID0 = 0x0B, + MCP_CANSTAT = 0x0E, + MCP_CANCTRL = 0x0F, + MCP_RXF3SIDH = 0x10, + MCP_RXF3SIDL = 0x11, + MCP_RXF3EID8 = 0x12, + MCP_RXF3EID0 = 0x13, + MCP_RXF4SIDH = 0x14, + MCP_RXF4SIDL = 0x15, + MCP_RXF4EID8 = 0x16, + MCP_RXF4EID0 = 0x17, + MCP_RXF5SIDH = 0x18, + MCP_RXF5SIDL = 0x19, + MCP_RXF5EID8 = 0x1A, + MCP_RXF5EID0 = 0x1B, + MCP_TEC = 0x1C, + MCP_REC = 0x1D, + MCP_RXM0SIDH = 0x20, + MCP_RXM0SIDL = 0x21, + MCP_RXM0EID8 = 0x22, + MCP_RXM0EID0 = 0x23, + MCP_RXM1SIDH = 0x24, + MCP_RXM1SIDL = 0x25, + MCP_RXM1EID8 = 0x26, + MCP_RXM1EID0 = 0x27, + MCP_CNF3 = 0x28, + MCP_CNF2 = 0x29, + MCP_CNF1 = 0x2A, + MCP_CANINTE = 0x2B, + MCP_CANINTF = 0x2C, + MCP_EFLG = 0x2D, + MCP_TXB0CTRL = 0x30, + MCP_TXB0SIDH = 0x31, + MCP_TXB0SIDL = 0x32, + MCP_TXB0EID8 = 0x33, + MCP_TXB0EID0 = 0x34, + MCP_TXB0DLC = 0x35, + MCP_TXB0DATA = 0x36, + MCP_TXB1CTRL = 0x40, + MCP_TXB1SIDH = 0x41, + MCP_TXB1SIDL = 0x42, + MCP_TXB1EID8 = 0x43, + MCP_TXB1EID0 = 0x44, + MCP_TXB1DLC = 0x45, + MCP_TXB1DATA = 0x46, + MCP_TXB2CTRL = 0x50, + MCP_TXB2SIDH = 0x51, + MCP_TXB2SIDL = 0x52, + MCP_TXB2EID8 = 0x53, + MCP_TXB2EID0 = 0x54, + MCP_TXB2DLC = 0x55, + MCP_TXB2DATA = 0x56, + MCP_RXB0CTRL = 0x60, + MCP_RXB0SIDH = 0x61, + MCP_RXB0SIDL = 0x62, + MCP_RXB0EID8 = 0x63, + MCP_RXB0EID0 = 0x64, + MCP_RXB0DLC = 0x65, + MCP_RXB0DATA = 0x66, + MCP_RXB1CTRL = 0x70, + MCP_RXB1SIDH = 0x71, + MCP_RXB1SIDL = 0x72, + MCP_RXB1EID8 = 0x73, + MCP_RXB1EID0 = 0x74, + MCP_RXB1DLC = 0x75, + MCP_RXB1DATA = 0x76 + }; + + static const int CAN_MAX_CHAR_IN_MESSAGE = 8; + static const uint32_t SPI_CLOCK = 10000000; // 10MHz + + static const int N_TXBUFFERS = 3; + static const int N_RXBUFFERS = 2; + + static const struct TXBn_REGS { + REGISTER CTRL; + REGISTER SIDH; + REGISTER DATA; + } TXB[N_TXBUFFERS]; + + static const struct RXBn_REGS { + REGISTER CTRL; + REGISTER SIDH; + REGISTER DATA; + } RXB[N_RXBUFFERS]; + + uint8_t SPICS; + MODE m_mode; + + private: + + void mcp2515_reset(void); /* reset mcp2515 */ + + uint8_t readRegister(const REGISTER reg); /* read mcp2515's register */ + + void readRegisterS(const REGISTER reg, + uint8_t values[], + const uint8_t n); + void setRegister(const REGISTER reg, /* set mcp2515's register */ + const uint8_t value); + + void setRegisterS(const REGISTER reg, /* set mcp2515's registers */ + const uint8_t values[], + const uint8_t n); + + void initCANBuffers(void); + + void modifyRegister(const REGISTER reg, + const uint8_t mask, + const uint8_t data); + + ERROR setCANCTRL_Mode(const MODE newmode); + ERROR configRate(const CAN_SPEED canSpeed); + ERROR mcp2515_init(const CAN_SPEED canSpeed); + + void write_id(const REGISTER mcp_addr, + const bool ext, + const uint32_t id); - void mcp2515_readRegisterS(const INT8U address, - INT8U values[], - const INT8U n); - void mcp2515_setRegister(const INT8U address, /* set mcp2515's register */ - const INT8U value); - - void mcp2515_setRegisterS(const INT8U address, /* set mcp2515's registers */ - const INT8U values[], - const INT8U n); + void prepareId(uint8_t *buffer, const bool ext, const uint32_t id); - void mcp2515_initCANBuffers(void); + void startSPI(); + void endSPI(); - void mcp2515_modifyRegister(const INT8U address, /* set bit of one register */ - const INT8U mask, - const INT8U data); - - INT8U mcp2515_readStatus(void); /* read mcp2515's Status */ - INT8U mcp2515_setCANCTRL_Mode(const INT8U newmode); /* set mode */ - INT8U mcp2515_configRate(const INT8U canSpeed); /* set boadrate */ - INT8U mcp2515_init(const INT8U canSpeed); /* mcp2515init */ - - void mcp2515_write_id( const INT8U mcp_addr, /* write can id */ - const bool ext, - const INT32U id ); - - void startSPI(); - void endSPI(); - -public: - MCP_CAN(INT8U _CS, INT8U mode); - INT8U begin(INT8U speedset); /* init can */ - INT8U init_Mask(INT8U num, bool ext, INT32U ulData); /* init Masks */ - INT8U init_Filt(INT8U num, bool ext, INT32U ulData); /* init filters */ - INT8U sendMessage(const INT32U id, const bool ext, const bool rtr, const INT8U len, const INT8U *buf); /* send buf */ - INT8U readMessage(const INT8U buffer_sidh_addr, INT32U *id, INT8U *dlc, INT8U buf[], bool *rtr, bool *ext); /* read can msg */ - INT8U readMessage(INT32U *ID, INT8U *len, INT8U buf[], bool *rtr, bool *ext); /* read buf with object ID */ - INT8U checkReceive(void); /* if something received */ - INT8U checkError(void); /* if something error */ - INT8U getInterrupts(void); - INT8U getInterruptMask(void); - void clearInterrupts(void); - void clearTXInterrupts(void); - INT8U getCanStat(void); + public: + MCP_CAN(uint8_t _CS, MODE mode); + ERROR begin(const CAN_SPEED speedset); /* init can */ + ERROR initMask(uint8_t num, bool ext, uint32_t ulData); /* init Masks */ + ERROR initFilt(uint8_t num, bool ext, uint32_t ulData); /* init filters */ + ERROR sendMessage(const uint32_t id, const bool ext, const bool rtr, const uint8_t len, const uint8_t *buf); /* send buf */ + ERROR readMessage(const RXBn rxbn, uint32_t *id, uint8_t *dlc, uint8_t buf[], bool *rtr, bool *ext); /* read can msg */ + ERROR readMessage(uint32_t *ID, uint8_t *len, uint8_t buf[], bool *rtr, bool *ext); /* read buf with object ID */ + bool checkReceive(void); /* if something received */ + bool checkError(void); /* if something error */ + uint8_t getInterrupts(void); + uint8_t getInterruptMask(void); + void clearInterrupts(void); + void clearTXInterrupts(void); + uint8_t getStatus(void); }; #endif -/********************************************************************************************************* - END FILE -*********************************************************************************************************/ diff --git a/mcp_can_dfs.h b/mcp_can_dfs.h index 5c723ab..1824879 100644 --- a/mcp_can_dfs.h +++ b/mcp_can_dfs.h @@ -1,249 +1,22 @@ -/* - mcp_can_dfs.h - 2012 Copyright (c) Seeed Technology Inc. All right reserved. - - Author:Loovee - Contributor: Cory J. Fowler - 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 - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110- - 1301 USA -*/ #ifndef _MCP2515DFS_H_ #define _MCP2515DFS_H_ -#include -#include -#include - -#ifndef INT32U -#define INT32U unsigned long -#endif - -#ifndef INT8U -#define INT8U byte -#endif - -// if print debug information -#define DEBUG_MODE 0 - /* * Begin mt */ -#define TIMEOUTVALUE 50 #define MCP_SIDH 0 #define MCP_SIDL 1 #define MCP_EID8 2 #define MCP_EID0 3 +#define MCP_DLC 4 +#define MCP_DATA 5 -#define MCP_TXB_EXIDE_M 0x08 /* In TXBnSIDL */ -#define MCP_DLC_MASK 0x0F /* 4 LSBits */ -#define MCP_RTR_MASK 0x40 /* (1<<6) Bit 6 */ - -#define MCP_RXB_RX_ANY 0x60 #define MCP_RXB_RX_EXT 0x40 #define MCP_RXB_RX_STD 0x20 #define MCP_RXB_RX_STDEXT 0x00 #define MCP_RXB_RX_MASK 0x60 #define MCP_RXB_BUKT_MASK (1<<2) -/* -** Bits in the TXBnCTRL registers. -*/ -#define MCP_TXB_TXBUFE_M 0x80 -#define MCP_TXB_ABTF_M 0x40 -#define MCP_TXB_MLOA_M 0x20 -#define MCP_TXB_TXERR_M 0x10 -#define MCP_TXB_TXREQ_M 0x08 -#define MCP_TXB_TXIE_M 0x04 -#define MCP_TXB_TXP10_M 0x03 - -#define MCP_TXB_RTR_M 0x40 /* In TXBnDLC */ -#define MCP_RXB_IDE_M 0x08 /* In RXBnSIDL */ -#define MCP_RXB_RTR_M 0x40 /* In RXBnDLC */ - -#define MCP_STAT_RXIF_MASK (0x03) -#define MCP_STAT_RX0IF (1<<0) -#define MCP_STAT_RX1IF (1<<1) - -#define MCP_EFLG_RX1OVR (1<<7) -#define MCP_EFLG_RX0OVR (1<<6) -#define MCP_EFLG_TXBO (1<<5) -#define MCP_EFLG_TXEP (1<<4) -#define MCP_EFLG_RXEP (1<<3) -#define MCP_EFLG_TXWAR (1<<2) -#define MCP_EFLG_RXWAR (1<<1) -#define MCP_EFLG_EWARN (1<<0) -#define MCP_EFLG_ERRORMASK (0xF8) /* 5 MS-Bits */ - - -/* - * Define MCP2515 register addresses - */ - -#define MCP_RXF0SIDH 0x00 -#define MCP_RXF0SIDL 0x01 -#define MCP_RXF0EID8 0x02 -#define MCP_RXF0EID0 0x03 -#define MCP_RXF1SIDH 0x04 -#define MCP_RXF1SIDL 0x05 -#define MCP_RXF1EID8 0x06 -#define MCP_RXF1EID0 0x07 -#define MCP_RXF2SIDH 0x08 -#define MCP_RXF2SIDL 0x09 -#define MCP_RXF2EID8 0x0A -#define MCP_RXF2EID0 0x0B -#define MCP_CANSTAT 0x0E -#define MCP_CANCTRL 0x0F -#define MCP_RXF3SIDH 0x10 -#define MCP_RXF3SIDL 0x11 -#define MCP_RXF3EID8 0x12 -#define MCP_RXF3EID0 0x13 -#define MCP_RXF4SIDH 0x14 -#define MCP_RXF4SIDL 0x15 -#define MCP_RXF4EID8 0x16 -#define MCP_RXF4EID0 0x17 -#define MCP_RXF5SIDH 0x18 -#define MCP_RXF5SIDL 0x19 -#define MCP_RXF5EID8 0x1A -#define MCP_RXF5EID0 0x1B -#define MCP_TEC 0x1C -#define MCP_REC 0x1D -#define MCP_RXM0SIDH 0x20 -#define MCP_RXM0SIDL 0x21 -#define MCP_RXM0EID8 0x22 -#define MCP_RXM0EID0 0x23 -#define MCP_RXM1SIDH 0x24 -#define MCP_RXM1SIDL 0x25 -#define MCP_RXM1EID8 0x26 -#define MCP_RXM1EID0 0x27 -#define MCP_CNF3 0x28 -#define MCP_CNF2 0x29 -#define MCP_CNF1 0x2A -#define MCP_CANINTE 0x2B -#define MCP_CANINTF 0x2C -#define MCP_EFLG 0x2D -#define MCP_TXB0CTRL 0x30 -#define MCP_TXB1CTRL 0x40 -#define MCP_TXB2CTRL 0x50 -#define MCP_RXB0CTRL 0x60 -#define MCP_RXB0SIDH 0x61 -#define MCP_RXB1CTRL 0x70 -#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_TX01_MASK 0x14 -#define MCP_TX_MASK 0x54 - -/* - * Define SPI Instruction Set - */ - -#define MCP_WRITE 0x02 - -#define MCP_READ 0x03 - -#define MCP_BITMOD 0x05 - -#define MCP_LOAD_TX0 0x40 -#define MCP_LOAD_TX1 0x42 -#define MCP_LOAD_TX2 0x44 - -#define MCP_RTS_TX0 0x81 -#define MCP_RTS_TX1 0x82 -#define MCP_RTS_TX2 0x84 -#define MCP_RTS_ALL 0x87 - -#define MCP_READ_RX0 0x90 -#define MCP_READ_RX1 0x94 - -#define MCP_READ_STATUS 0xA0 - -#define MCP_RX_STATUS 0xB0 - -#define MCP_RESET 0xC0 - - -/* - * CANCTRL Register Values - */ - -#define MODE_NORMAL 0x00 -#define MODE_SLEEP 0x20 -#define MODE_LOOPBACK 0x40 -#define MODE_LISTENONLY 0x60 -#define MODE_CONFIG 0x80 -#define MODE_POWERUP 0xE0 -#define MODE_MASK 0xE0 -#define ABORT_TX 0x10 -#define MODE_ONESHOT 0x08 -#define CLKOUT_ENABLE 0x04 -#define CLKOUT_DISABLE 0x00 -#define CLKOUT_PS1 0x00 -#define CLKOUT_PS2 0x01 -#define CLKOUT_PS4 0x02 -#define CLKOUT_PS8 0x03 - - -/* - * CNF1 Register Values - */ - -#define SJW1 0x00 -#define SJW2 0x40 -#define SJW3 0x80 -#define SJW4 0xC0 - - -/* - * CNF2 Register Values - */ - -#define BTLMODE 0x80 -#define SAMPLE_1X 0x00 -#define SAMPLE_3X 0x40 - - -/* - * CNF3 Register Values - */ - -#define SOF_ENABLE 0x80 -#define SOF_DISABLE 0x00 -#define WAKFIL_ENABLE 0x40 -#define WAKFIL_DISABLE 0x00 - - -/* - * CANINTF Register Bits - */ - -#define MCP_RX0IF 0x01 -#define MCP_RX1IF 0x02 -#define MCP_TX0IF 0x04 -#define MCP_TX1IF 0x08 -#define MCP_TX2IF 0x10 -#define MCP_ERRIF 0x20 -#define MCP_WAKIF 0x40 -#define MCP_MERRF 0x80 - /* * speed 16M */ @@ -318,67 +91,4 @@ #define MCP_16MHz_5kBPS_CFG3 (0x87) - -#define MCPDEBUG (0) -#define MCPDEBUG_TXBUF (0) -#define MCP_N_TXBUFFERS (3) - -#define MCP_RXBUF_0 (MCP_RXB0SIDH) -#define MCP_RXBUF_1 (MCP_RXB1SIDH) - -#define MCP2515_OK (0) -#define MCP2515_FAIL (1) -#define MCP_ALLTXBUSY (2) - -#define CANDEBUG 1 - -#define CANUSELOOP 0 - -#define CANSENDTIMEOUT (200) /* milliseconds */ - -/* - * initial value of gCANAutoProcess - */ -#define CANAUTOPROCESS (1) -#define CANAUTOON (1) -#define CANAUTOOFF (0) - -#define CAN_STDID (0) -#define CAN_EXTID (1) - -#define CANDEFAULTIDENT (0x55CC) -#define CANDEFAULTIDENTEXT (CAN_EXTID) - -#define CAN_5KBPS 1 -#define CAN_10KBPS 2 -#define CAN_20KBPS 3 -#define CAN_31K25BPS 4 -#define CAN_33KBPS 5 -#define CAN_40KBPS 6 -#define CAN_50KBPS 7 -#define CAN_80KBPS 8 -#define CAN_83K3BPS 9 -#define CAN_95KBPS 10 -#define CAN_100KBPS 11 -#define CAN_125KBPS 12 -#define CAN_200KBPS 13 -#define CAN_250KBPS 14 -#define CAN_500KBPS 15 -#define CAN_1000KBPS 16 - -#define CAN_OK (0) -#define CAN_FAILINIT (1) -#define CAN_FAILTX (2) -#define CAN_MSGAVAIL (3) -#define CAN_NOMSG (4) -#define CAN_CTRLERROR (5) -#define CAN_GETTXBFTIMEOUT (6) -#define CAN_SENDMSGTIMEOUT (7) -#define CAN_FAIL (0xff) - -#define CAN_MAX_CHAR_IN_MESSAGE (8) - #endif -/********************************************************************************************************* - END FILE -*********************************************************************************************************/ From 42b083be63c6df6caad6fdd4f6e1eb4aa2afafd9 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 04:27:36 +0300 Subject: [PATCH 06/36] enum RXF, consts --- mcp_can.cpp | 51 +++++++++++++++++++++++---------------------------- mcp_can.h | 15 ++++++++++++--- 2 files changed, 35 insertions(+), 31 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index 5094593..291c4f9 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -129,11 +129,7 @@ MCP_CAN::ERROR MCP_CAN::setCANCTRL_Mode(const MODE newmode) modifyRegister(MCP_CANCTRL, MODE_MASK, newmode); uint8_t i = readRegister(MCP_CANCTRL) & MODE_MASK; - if (i == newmode) { - return ERROR_OK; - } - - return ERROR_FAIL; + return i == newmode ? ERROR_OK : ERROR_FAIL; } @@ -368,7 +364,7 @@ void MCP_CAN::prepareId(uint8_t *buffer, const bool ext, const uint32_t id) ** Function name: set CS ** Descriptions: init CS pin and set UNSELECTED *********************************************************************************************************/ -MCP_CAN::MCP_CAN(uint8_t _CS, MODE mode) +MCP_CAN::MCP_CAN(const uint8_t _CS, const MODE mode) { m_mode = mode; SPICS = _CS; @@ -390,7 +386,7 @@ MCP_CAN::ERROR MCP_CAN::begin(const CAN_SPEED speedset) ** Function name: initMask ** Descriptions: init canid Masks *********************************************************************************************************/ -MCP_CAN::ERROR MCP_CAN::initMask(uint8_t num, const bool ext, uint32_t ulData) +MCP_CAN::ERROR MCP_CAN::initMask(const uint8_t num, const bool ext, const uint32_t ulData) { delay(10); @@ -417,7 +413,7 @@ MCP_CAN::ERROR MCP_CAN::initMask(uint8_t num, const bool ext, uint32_t ulData) ** Function name: initFilt ** Descriptions: init canid filters *********************************************************************************************************/ -MCP_CAN::ERROR MCP_CAN::initFilt(uint8_t num, const bool ext, uint32_t ulData) +MCP_CAN::ERROR MCP_CAN::initFilt(const RXF num, const bool ext, const uint32_t ulData) { delay(10); ERROR res = setCANCTRL_Mode(MODE_CONFIG); @@ -427,33 +423,32 @@ MCP_CAN::ERROR MCP_CAN::initFilt(uint8_t num, const bool ext, uint32_t ulData) } switch (num) { - case 0: - write_id(MCP_RXF0SIDH, ext, ulData); - break; + case RXF0: + write_id(MCP_RXF0SIDH, ext, ulData); + break; - case 1: - write_id(MCP_RXF1SIDH, ext, ulData); - break; + case RXF1: + write_id(MCP_RXF1SIDH, ext, ulData); + break; - case 2: - write_id(MCP_RXF2SIDH, ext, ulData); - break; + case RXF2: + write_id(MCP_RXF2SIDH, ext, ulData); + break; - case 3: - write_id(MCP_RXF3SIDH, ext, ulData); - break; + case RXF3: + write_id(MCP_RXF3SIDH, ext, ulData); + break; - case 4: - write_id(MCP_RXF4SIDH, ext, ulData); - break; + case RXF4: + write_id(MCP_RXF4SIDH, ext, ulData); + break; - case 5: - write_id(MCP_RXF5SIDH, ext, ulData); - break; + case RXF5: + write_id(MCP_RXF5SIDH, ext, ulData); + break; default: - //res = ERROR_FAIL; - break; + return ERROR_FAIL; } res = setCANCTRL_Mode(m_mode); diff --git a/mcp_can.h b/mcp_can.h index 10de160..ba6450f 100644 --- a/mcp_can.h +++ b/mcp_can.h @@ -68,6 +68,15 @@ class MCP_CAN static const uint8_t DLC_MASK = 0x0F; static const uint8_t RTR_MASK = 0x40; + enum RXF { + RXF0 = 0, + RXF1 = 1, + RXF2 = 2, + RXF3 = 3, + RXF4 = 4, + RXF5 = 5 + }; + enum /*class*/ STAT : uint8_t { STAT_RX0IF = (1<<0), STAT_RX1IF = (1<<1) @@ -256,10 +265,10 @@ class MCP_CAN void endSPI(); public: - MCP_CAN(uint8_t _CS, MODE mode); + MCP_CAN(const uint8_t _CS, const MODE mode); ERROR begin(const CAN_SPEED speedset); /* init can */ - ERROR initMask(uint8_t num, bool ext, uint32_t ulData); /* init Masks */ - ERROR initFilt(uint8_t num, bool ext, uint32_t ulData); /* init filters */ + ERROR initMask(const uint8_t num, const bool ext, const uint32_t ulData); /* init Masks */ + ERROR initFilt(const RXF num, const bool ext, const uint32_t ulData); /* init filters */ ERROR sendMessage(const uint32_t id, const bool ext, const bool rtr, const uint8_t len, const uint8_t *buf); /* send buf */ ERROR readMessage(const RXBn rxbn, uint32_t *id, uint8_t *dlc, uint8_t buf[], bool *rtr, bool *ext); /* read can msg */ ERROR readMessage(uint32_t *ID, uint8_t *len, uint8_t buf[], bool *rtr, bool *ext); /* read buf with object ID */ From adf07dc12732d10a736d277a1910dd0027349aef Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 04:55:14 +0300 Subject: [PATCH 07/36] minor changes --- mcp_can.cpp | 14 +++++++------- mcp_can.h | 39 +++++++++++++++------------------------ 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index 291c4f9..2794b3c 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -294,7 +294,7 @@ void MCP_CAN::initCANBuffers(void) ** Function name: mcp2515_init ** Descriptions: init the device *********************************************************************************************************/ -MCP_CAN::ERROR MCP_CAN::mcp2515_init(const CAN_SPEED canSpeed) /* mcp2515init */ +MCP_CAN::ERROR MCP_CAN::mcp2515_init(const CAN_SPEED canSpeed) { mcp2515_reset(); @@ -319,7 +319,7 @@ MCP_CAN::ERROR MCP_CAN::mcp2515_init(const CAN_SPEED canSpeed) MCP_RXB_RX_STDEXT | MCP_RXB_BUKT_MASK ); modifyRegister(MCP_RXB1CTRL, MCP_RXB_RX_MASK, MCP_RXB_RX_STDEXT); - /* enter normal mode */ + res = setCANCTRL_Mode(m_mode); delay(10); @@ -331,13 +331,13 @@ MCP_CAN::ERROR MCP_CAN::mcp2515_init(const CAN_SPEED canSpeed) ** Function name: write_id ** Descriptions: write can id *********************************************************************************************************/ -void MCP_CAN::write_id(const REGISTER mcp_addr, const bool ext, const uint32_t id) +void MCP_CAN::write_id(const REGISTER reg, const bool ext, const uint32_t id) { uint8_t tbufdata[4]; prepareId(tbufdata, ext, id); - setRegisterS(mcp_addr, tbufdata, 4); + setRegisterS(reg, tbufdata, 4); } void MCP_CAN::prepareId(uint8_t *buffer, const bool ext, const uint32_t id) @@ -536,15 +536,15 @@ MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, uint32_t *id, uint8_t *dlc, return ERROR_OK; } -MCP_CAN::ERROR MCP_CAN::readMessage(uint32_t *id, uint8_t *len, uint8_t buf[], bool *rtr, bool *ext) +MCP_CAN::ERROR MCP_CAN::readMessage(uint32_t *id, uint8_t *dlc, uint8_t buf[], bool *rtr, bool *ext) { ERROR rc; uint8_t stat = getStatus(); if ( stat & STAT_RX0IF ) { - rc = readMessage(RXB0, id, len, buf, rtr, ext); + rc = readMessage(RXB0, id, dlc, buf, rtr, ext); } else if ( stat & STAT_RX1IF ) { - rc = readMessage(RXB1, id, len, buf, rtr, ext); + rc = readMessage(RXB1, id, dlc, buf, rtr, ext); } else { rc = ERROR_NOMSG; } diff --git a/mcp_can.h b/mcp_can.h index ba6450f..8610723 100644 --- a/mcp_can.h +++ b/mcp_can.h @@ -231,33 +231,24 @@ class MCP_CAN private: - void mcp2515_reset(void); /* reset mcp2515 */ + void mcp2515_reset(void); - uint8_t readRegister(const REGISTER reg); /* read mcp2515's register */ + uint8_t readRegister(const REGISTER reg); - void readRegisterS(const REGISTER reg, - uint8_t values[], - const uint8_t n); - void setRegister(const REGISTER reg, /* set mcp2515's register */ - const uint8_t value); + void readRegisterS(const REGISTER reg, uint8_t values[], const uint8_t n); + void setRegister(const REGISTER reg, const uint8_t value); - void setRegisterS(const REGISTER reg, /* set mcp2515's registers */ - const uint8_t values[], - const uint8_t n); + void setRegisterS(const REGISTER reg, const uint8_t values[], const uint8_t n); void initCANBuffers(void); - void modifyRegister(const REGISTER reg, - const uint8_t mask, - const uint8_t data); + void modifyRegister(const REGISTER reg, const uint8_t mask, const uint8_t data); ERROR setCANCTRL_Mode(const MODE newmode); ERROR configRate(const CAN_SPEED canSpeed); ERROR mcp2515_init(const CAN_SPEED canSpeed); - void write_id(const REGISTER mcp_addr, - const bool ext, - const uint32_t id); + void write_id(const REGISTER reg, const bool ext, const uint32_t id); void prepareId(uint8_t *buffer, const bool ext, const uint32_t id); @@ -266,14 +257,14 @@ class MCP_CAN public: MCP_CAN(const uint8_t _CS, const MODE mode); - ERROR begin(const CAN_SPEED speedset); /* init can */ - ERROR initMask(const uint8_t num, const bool ext, const uint32_t ulData); /* init Masks */ - ERROR initFilt(const RXF num, const bool ext, const uint32_t ulData); /* init filters */ - ERROR sendMessage(const uint32_t id, const bool ext, const bool rtr, const uint8_t len, const uint8_t *buf); /* send buf */ - ERROR readMessage(const RXBn rxbn, uint32_t *id, uint8_t *dlc, uint8_t buf[], bool *rtr, bool *ext); /* read can msg */ - ERROR readMessage(uint32_t *ID, uint8_t *len, uint8_t buf[], bool *rtr, bool *ext); /* read buf with object ID */ - bool checkReceive(void); /* if something received */ - bool checkError(void); /* if something error */ + ERROR begin(const CAN_SPEED speedset); + ERROR initMask(const uint8_t num, const bool ext, const uint32_t ulData); + ERROR initFilt(const RXF num, const bool ext, const uint32_t ulData); + ERROR sendMessage(const uint32_t id, const bool ext, const bool rtr, const uint8_t len, const uint8_t *buf); + ERROR readMessage(const RXBn rxbn, uint32_t *id, uint8_t *dlc, uint8_t buf[], bool *rtr, bool *ext); + ERROR readMessage(uint32_t *id, uint8_t *dlc, uint8_t buf[], bool *rtr, bool *ext); + bool checkReceive(void); + bool checkError(void); uint8_t getInterrupts(void); uint8_t getInterruptMask(void); void clearInterrupts(void); From 3fb00a093e77cf0a0b56199c8e771438a54e9146 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 16:14:38 +0300 Subject: [PATCH 08/36] rename methods, drop obsolete function --- mcp_can.cpp | 60 ++++++++++++++--------------------------------------- mcp_can.h | 6 ++---- 2 files changed, 18 insertions(+), 48 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index 2794b3c..0347830 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -22,10 +22,10 @@ void MCP_CAN::endSPI() { } /********************************************************************************************************* -** Function name: mcp2515_reset +** Function name: reset ** Descriptions: reset the device *********************************************************************************************************/ -void MCP_CAN::mcp2515_reset(void) +void MCP_CAN::reset(void) { startSPI(); SPI.transfer(INSTRUCTION_RESET); @@ -256,47 +256,12 @@ MCP_CAN::ERROR MCP_CAN::configRate(const CAN_SPEED canSpeed) } /********************************************************************************************************* -** Function name: initCANBuffers -** Descriptions: init canbuffers -*********************************************************************************************************/ -void MCP_CAN::initCANBuffers(void) -{ - //uint8_t std = 0; - //uint8_t ext = 1; - //uint32_t ulMask = 0x00, ulFilt = 0x00; - - - //write_id(MCP_RXM0SIDH, ext, ulMask); /*Set both masks to 0 */ - //write_id(MCP_RXM1SIDH, ext, ulMask); /*Mask register ignores ext bit */ - - /* Set all filters to 0 */ - //write_id(MCP_RXF0SIDH, ext, ulFilt); /* RXB0: extended */ - //write_id(MCP_RXF1SIDH, std, ulFilt); /* RXB1: standard */ - //write_id(MCP_RXF2SIDH, ext, ulFilt); /* RXB2: extended */ - //write_id(MCP_RXF3SIDH, std, ulFilt); /* RXB3: standard */ - //write_id(MCP_RXF4SIDH, ext, ulFilt); - //write_id(MCP_RXF5SIDH, std, ulFilt); - - /* Clear, deactivate the three */ - /* transmit buffers */ - /* TXBnCTRL -> TXBnD7 */ - uint8_t zeros[14]; - memset(zeros, 0, sizeof(zeros)); - setRegisterS(MCP_TXB0CTRL, zeros, 14); - setRegisterS(MCP_TXB1CTRL, zeros, 14); - setRegisterS(MCP_TXB2CTRL, zeros, 14); - - setRegister(MCP_RXB0CTRL, 0); - setRegister(MCP_RXB1CTRL, 0); -} - -/********************************************************************************************************* -** Function name: mcp2515_init +** Function name: init ** Descriptions: init the device *********************************************************************************************************/ -MCP_CAN::ERROR MCP_CAN::mcp2515_init(const CAN_SPEED canSpeed) +MCP_CAN::ERROR MCP_CAN::init(const CAN_SPEED canSpeed) { - mcp2515_reset(); + reset(); ERROR res = setCANCTRL_Mode(MODE_CONFIG); delay(10); @@ -310,7 +275,14 @@ MCP_CAN::ERROR MCP_CAN::mcp2515_init(const CAN_SPEED canSpeed) return res; } - initCANBuffers(); + uint8_t zeros[14]; + memset(zeros, 0, sizeof(zeros)); + setRegisterS(MCP_TXB0CTRL, zeros, 14); + setRegisterS(MCP_TXB1CTRL, zeros, 14); + setRegisterS(MCP_TXB2CTRL, zeros, 14); + + setRegister(MCP_RXB0CTRL, 0); + setRegister(MCP_RXB1CTRL, 0); setRegister(MCP_CANINTE, CANINTF_RX0IF | CANINTF_RX1IF); @@ -351,9 +323,9 @@ void MCP_CAN::prepareId(uint8_t *buffer, const bool ext, const uint32_t id) buffer[MCP_SIDL] = (uint8_t) (canid & 0x03); buffer[MCP_SIDL] += (uint8_t) ((canid & 0x1C) << 3); buffer[MCP_SIDL] |= TXB_EXIDE_MASK; - buffer[MCP_SIDH] = (uint8_t) (canid >> 5 ); + buffer[MCP_SIDH] = (uint8_t) (canid >> 5); } else { - buffer[MCP_SIDH] = (uint8_t) (canid >> 3 ); + buffer[MCP_SIDH] = (uint8_t) (canid >> 3); buffer[MCP_SIDL] = (uint8_t) ((canid & 0x07 ) << 5); buffer[MCP_EID0] = 0; buffer[MCP_EID8] = 0; @@ -379,7 +351,7 @@ MCP_CAN::MCP_CAN(const uint8_t _CS, const MODE mode) MCP_CAN::ERROR MCP_CAN::begin(const CAN_SPEED speedset) { SPI.begin(); - return mcp2515_init(speedset); + return init(speedset); } /********************************************************************************************************* diff --git a/mcp_can.h b/mcp_can.h index 8610723..9a22a13 100644 --- a/mcp_can.h +++ b/mcp_can.h @@ -231,7 +231,7 @@ class MCP_CAN private: - void mcp2515_reset(void); + void reset(void); uint8_t readRegister(const REGISTER reg); @@ -240,13 +240,11 @@ class MCP_CAN void setRegisterS(const REGISTER reg, const uint8_t values[], const uint8_t n); - void initCANBuffers(void); - void modifyRegister(const REGISTER reg, const uint8_t mask, const uint8_t data); ERROR setCANCTRL_Mode(const MODE newmode); ERROR configRate(const CAN_SPEED canSpeed); - ERROR mcp2515_init(const CAN_SPEED canSpeed); + ERROR init(const CAN_SPEED canSpeed); void write_id(const REGISTER reg, const bool ext, const uint32_t id); From a9cbfcbf661c45eeddd52ee4c09b3cadece54368 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 18:47:52 +0300 Subject: [PATCH 09/36] drop mcp_can_dfs.h --- mcp_can.cpp | 79 ++++++++++++++++++------------------ mcp_can.h | 108 +++++++++++++++++++++++++++++++++++++++++++------- mcp_can_dfs.h | 85 --------------------------------------- 3 files changed, 133 insertions(+), 139 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index 0347830..cc987f6 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -21,10 +21,10 @@ void MCP_CAN::endSPI() { SPI.endTransaction(); } -/********************************************************************************************************* +/***************************************************************************** ** Function name: reset ** Descriptions: reset the device -*********************************************************************************************************/ +******************************************************************************/ void MCP_CAN::reset(void) { startSPI(); @@ -33,10 +33,10 @@ void MCP_CAN::reset(void) delay(10); } -/********************************************************************************************************* +/***************************************************************************** ** Function name: readRegister ** Descriptions: read register -*********************************************************************************************************/ +******************************************************************************/ uint8_t MCP_CAN::readRegister(const REGISTER reg) { startSPI(); @@ -48,10 +48,10 @@ uint8_t MCP_CAN::readRegister(const REGISTER reg) return ret; } -/********************************************************************************************************* +/***************************************************************************** ** Function name: readRegisterS ** Descriptions: read registerS -*********************************************************************************************************/ +******************************************************************************/ void MCP_CAN::readRegisterS(const REGISTER address, uint8_t values[], const uint8_t n) { startSPI(); @@ -64,10 +64,10 @@ void MCP_CAN::readRegisterS(const REGISTER address, uint8_t values[], const uint endSPI(); } -/********************************************************************************************************* +/***************************************************************************** ** Function name: setRegister ** Descriptions: set register -*********************************************************************************************************/ +******************************************************************************/ void MCP_CAN::setRegister(const REGISTER reg, const uint8_t value) { startSPI(); @@ -77,10 +77,10 @@ void MCP_CAN::setRegister(const REGISTER reg, const uint8_t value) endSPI(); } -/********************************************************************************************************* +/***************************************************************************** ** Function name: setRegisterS ** Descriptions: set registerS -*********************************************************************************************************/ +******************************************************************************/ void MCP_CAN::setRegisterS(const REGISTER reg, const uint8_t values[], const uint8_t n) { startSPI(); @@ -92,24 +92,24 @@ void MCP_CAN::setRegisterS(const REGISTER reg, const uint8_t values[], const uin endSPI(); } -/********************************************************************************************************* +/***************************************************************************** ** Function name: modifyRegister ** Descriptions: set bit of one register -*********************************************************************************************************/ -void MCP_CAN::modifyRegister(const REGISTER address, const uint8_t mask, const uint8_t data) +******************************************************************************/ +void MCP_CAN::modifyRegister(const REGISTER reg, const uint8_t mask, const uint8_t data) { startSPI(); SPI.transfer(INSTRUCTION_BITMOD); - SPI.transfer(address); + SPI.transfer(reg); SPI.transfer(mask); SPI.transfer(data); endSPI(); } -/********************************************************************************************************* +/***************************************************************************** ** Function name: getStatus ** Descriptions: read mcp2515's Status -*********************************************************************************************************/ +******************************************************************************/ uint8_t MCP_CAN::getStatus(void) { startSPI(); @@ -120,10 +120,10 @@ uint8_t MCP_CAN::getStatus(void) return i; } -/********************************************************************************************************* +/***************************************************************************** ** Function name: setCANCTRL_Mode ** Descriptions: set control mode -*********************************************************************************************************/ +******************************************************************************/ MCP_CAN::ERROR MCP_CAN::setCANCTRL_Mode(const MODE newmode) { modifyRegister(MCP_CANCTRL, MODE_MASK, newmode); @@ -133,10 +133,10 @@ MCP_CAN::ERROR MCP_CAN::setCANCTRL_Mode(const MODE newmode) } -/********************************************************************************************************* +/***************************************************************************** ** Function name: configRate ** Descriptions: set boadrate -*********************************************************************************************************/ +******************************************************************************/ MCP_CAN::ERROR MCP_CAN::configRate(const CAN_SPEED canSpeed) { uint8_t set, cfg1, cfg2, cfg3; @@ -255,10 +255,10 @@ MCP_CAN::ERROR MCP_CAN::configRate(const CAN_SPEED canSpeed) } } -/********************************************************************************************************* +/***************************************************************************** ** Function name: init ** Descriptions: init the device -*********************************************************************************************************/ +******************************************************************************/ MCP_CAN::ERROR MCP_CAN::init(const CAN_SPEED canSpeed) { reset(); @@ -287,10 +287,9 @@ MCP_CAN::ERROR MCP_CAN::init(const CAN_SPEED canSpeed) setRegister(MCP_CANINTE, CANINTF_RX0IF | CANINTF_RX1IF); modifyRegister(MCP_RXB0CTRL, - MCP_RXB_RX_MASK | MCP_RXB_BUKT_MASK, - MCP_RXB_RX_STDEXT | MCP_RXB_BUKT_MASK ); - modifyRegister(MCP_RXB1CTRL, MCP_RXB_RX_MASK, - MCP_RXB_RX_STDEXT); + RXBnCTRL_RXM_MASK | RXB0CTRL_BUKT, + RXBnCTRL_RXM_STDEXT | RXB0CTRL_BUKT); + modifyRegister(MCP_RXB1CTRL, RXBnCTRL_RXM_MASK, RXBnCTRL_RXM_STDEXT); res = setCANCTRL_Mode(m_mode); delay(10); @@ -299,10 +298,10 @@ MCP_CAN::ERROR MCP_CAN::init(const CAN_SPEED canSpeed) } -/********************************************************************************************************* +/***************************************************************************** ** Function name: write_id ** Descriptions: write can id -*********************************************************************************************************/ +******************************************************************************/ void MCP_CAN::write_id(const REGISTER reg, const bool ext, const uint32_t id) { uint8_t tbufdata[4]; @@ -332,10 +331,10 @@ void MCP_CAN::prepareId(uint8_t *buffer, const bool ext, const uint32_t id) } } -/********************************************************************************************************* +/***************************************************************************** ** Function name: set CS ** Descriptions: init CS pin and set UNSELECTED -*********************************************************************************************************/ +******************************************************************************/ MCP_CAN::MCP_CAN(const uint8_t _CS, const MODE mode) { m_mode = mode; @@ -344,20 +343,20 @@ MCP_CAN::MCP_CAN(const uint8_t _CS, const MODE mode) endSPI(); } -/********************************************************************************************************* +/***************************************************************************** ** Function name: init ** Descriptions: init can and set speed -*********************************************************************************************************/ +******************************************************************************/ MCP_CAN::ERROR MCP_CAN::begin(const CAN_SPEED speedset) { SPI.begin(); return init(speedset); } -/********************************************************************************************************* +/***************************************************************************** ** Function name: initMask ** Descriptions: init canid Masks -*********************************************************************************************************/ +******************************************************************************/ MCP_CAN::ERROR MCP_CAN::initMask(const uint8_t num, const bool ext, const uint32_t ulData) { delay(10); @@ -381,10 +380,10 @@ MCP_CAN::ERROR MCP_CAN::initMask(const uint8_t num, const bool ext, const uint32 return res; } -/********************************************************************************************************* +/****************************************************************************** ** Function name: initFilt ** Descriptions: init canid filters -*********************************************************************************************************/ +******************************************************************************/ MCP_CAN::ERROR MCP_CAN::initFilt(const RXF num, const bool ext, const uint32_t ulData) { delay(10); @@ -524,10 +523,10 @@ MCP_CAN::ERROR MCP_CAN::readMessage(uint32_t *id, uint8_t *dlc, uint8_t buf[], b return rc; } -/********************************************************************************************************* +/***************************************************************************** ** Function name: checkReceive ** Descriptions: check if got something -*********************************************************************************************************/ +******************************************************************************/ bool MCP_CAN::checkReceive(void) { uint8_t res = getStatus(); @@ -538,10 +537,10 @@ bool MCP_CAN::checkReceive(void) } } -/********************************************************************************************************* +/***************************************************************************** ** Function name: checkError ** Descriptions: if something error -*********************************************************************************************************/ +******************************************************************************/ bool MCP_CAN::checkError(void) { uint8_t eflg = readRegister(MCP_EFLG); diff --git a/mcp_can.h b/mcp_can.h index 9a22a13..12b5029 100644 --- a/mcp_can.h +++ b/mcp_can.h @@ -3,7 +3,78 @@ #include -#include "mcp_can_dfs.h" +/* + * speed 16M + */ +#define MCP_16MHz_1000kBPS_CFG1 (0x00) +#define MCP_16MHz_1000kBPS_CFG2 (0xD0) +#define MCP_16MHz_1000kBPS_CFG3 (0x82) + +#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 (0xF1) +#define MCP_16MHz_250kBPS_CFG3 (0x85) + +#define MCP_16MHz_200kBPS_CFG1 (0x01) +#define MCP_16MHz_200kBPS_CFG2 (0xFA) +#define MCP_16MHz_200kBPS_CFG3 (0x87) + +#define MCP_16MHz_125kBPS_CFG1 (0x03) +#define MCP_16MHz_125kBPS_CFG2 (0xF0) +#define MCP_16MHz_125kBPS_CFG3 (0x86) + +#define MCP_16MHz_100kBPS_CFG1 (0x03) +#define MCP_16MHz_100kBPS_CFG2 (0xFA) +#define MCP_16MHz_100kBPS_CFG3 (0x87) + +/* +#define MCP_16MHz_100kBPS_CFG1 (0x03) +#define MCP_16MHz_100kBPS_CFG2 (0xBA) +#define MCP_16MHz_100kBPS_CFG3 (0x07) +*/ + +#define MCP_16MHz_95kBPS_CFG1 (0x03) +#define MCP_16MHz_95kBPS_CFG2 (0xAD) +#define MCP_16MHz_95kBPS_CFG3 (0x07) + +#define MCP_16MHz_83k3BPS_CFG1 (0x03) +#define MCP_16MHz_83k3BPS_CFG2 (0xBE) +#define MCP_16MHz_83k3BPS_CFG3 (0x07) + +#define MCP_16MHz_80kBPS_CFG1 (0x03) +#define MCP_16MHz_80kBPS_CFG2 (0xFF) +#define MCP_16MHz_80kBPS_CFG3 (0x87) + +#define MCP_16MHz_50kBPS_CFG1 (0x07) +#define MCP_16MHz_50kBPS_CFG2 (0xFA) +#define MCP_16MHz_50kBPS_CFG3 (0x87) + +#define MCP_16MHz_40kBPS_CFG1 (0x07) +#define MCP_16MHz_40kBPS_CFG2 (0xFF) +#define MCP_16MHz_40kBPS_CFG3 (0x87) + +#define MCP_16MHz_33kBPS_CFG1 (0x09) +#define MCP_16MHz_33kBPS_CFG2 (0xBE) +#define MCP_16MHz_33kBPS_CFG3 (0x07) + +#define MCP_16MHz_31k25BPS_CFG1 (0x0F) +#define MCP_16MHz_31k25BPS_CFG2 (0xF1) +#define MCP_16MHz_31k25BPS_CFG3 (0x85) + +#define MCP_16MHz_20kBPS_CFG1 (0x0F) +#define MCP_16MHz_20kBPS_CFG2 (0xFF) +#define MCP_16MHz_20kBPS_CFG3 (0x87) + +#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) enum CAN_SPEED { CAN_5KBPS, @@ -68,6 +139,19 @@ class MCP_CAN static const uint8_t DLC_MASK = 0x0F; static const uint8_t RTR_MASK = 0x40; + static const uint8_t RXBnCTRL_RXM_STD = 0x20; + static const uint8_t RXBnCTRL_RXM_EXT = 0x40; + static const uint8_t RXBnCTRL_RXM_STDEXT = 0x00; + static const uint8_t RXBnCTRL_RXM_MASK = 0x60; + static const uint8_t RXB0CTRL_BUKT = 0x40; + + static const uint8_t MCP_SIDH = 0; + static const uint8_t MCP_SIDL = 1; + static const uint8_t MCP_EID8 = 2; + static const uint8_t MCP_EID0 = 3; + static const uint8_t MCP_DLC = 4; + static const uint8_t MCP_DATA = 5; + enum RXF { RXF0 = 0, RXF1 = 1, @@ -232,27 +316,23 @@ class MCP_CAN private: void reset(void); - - uint8_t readRegister(const REGISTER reg); - - void readRegisterS(const REGISTER reg, uint8_t values[], const uint8_t n); - void setRegister(const REGISTER reg, const uint8_t value); - - void setRegisterS(const REGISTER reg, const uint8_t values[], const uint8_t n); - - void modifyRegister(const REGISTER reg, const uint8_t mask, const uint8_t data); - ERROR setCANCTRL_Mode(const MODE newmode); ERROR configRate(const CAN_SPEED canSpeed); ERROR init(const CAN_SPEED canSpeed); + void startSPI(); + void endSPI(); + + uint8_t readRegister(const REGISTER reg); + void readRegisterS(const REGISTER reg, uint8_t values[], const uint8_t n); + void setRegister(const REGISTER reg, const uint8_t value); + void setRegisterS(const REGISTER reg, const uint8_t values[], const uint8_t n); + void modifyRegister(const REGISTER reg, const uint8_t mask, const uint8_t data); + void write_id(const REGISTER reg, const bool ext, const uint32_t id); void prepareId(uint8_t *buffer, const bool ext, const uint32_t id); - void startSPI(); - void endSPI(); - public: MCP_CAN(const uint8_t _CS, const MODE mode); ERROR begin(const CAN_SPEED speedset); diff --git a/mcp_can_dfs.h b/mcp_can_dfs.h index 1824879..b6ca021 100644 --- a/mcp_can_dfs.h +++ b/mcp_can_dfs.h @@ -4,91 +4,6 @@ /* * Begin mt */ -#define MCP_SIDH 0 -#define MCP_SIDL 1 -#define MCP_EID8 2 -#define MCP_EID0 3 -#define MCP_DLC 4 -#define MCP_DATA 5 - -#define MCP_RXB_RX_EXT 0x40 -#define MCP_RXB_RX_STD 0x20 -#define MCP_RXB_RX_STDEXT 0x00 -#define MCP_RXB_RX_MASK 0x60 -#define MCP_RXB_BUKT_MASK (1<<2) - -/* - * speed 16M - */ -#define MCP_16MHz_1000kBPS_CFG1 (0x00) -#define MCP_16MHz_1000kBPS_CFG2 (0xD0) -#define MCP_16MHz_1000kBPS_CFG3 (0x82) - -#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 (0xF1) -#define MCP_16MHz_250kBPS_CFG3 (0x85) - -#define MCP_16MHz_200kBPS_CFG1 (0x01) -#define MCP_16MHz_200kBPS_CFG2 (0xFA) -#define MCP_16MHz_200kBPS_CFG3 (0x87) - -#define MCP_16MHz_125kBPS_CFG1 (0x03) -#define MCP_16MHz_125kBPS_CFG2 (0xF0) -#define MCP_16MHz_125kBPS_CFG3 (0x86) - -#define MCP_16MHz_100kBPS_CFG1 (0x03) -#define MCP_16MHz_100kBPS_CFG2 (0xFA) -#define MCP_16MHz_100kBPS_CFG3 (0x87) - -/* -#define MCP_16MHz_100kBPS_CFG1 (0x03) -#define MCP_16MHz_100kBPS_CFG2 (0xBA) -#define MCP_16MHz_100kBPS_CFG3 (0x07) -*/ - -#define MCP_16MHz_95kBPS_CFG1 (0x03) -#define MCP_16MHz_95kBPS_CFG2 (0xAD) -#define MCP_16MHz_95kBPS_CFG3 (0x07) - -#define MCP_16MHz_83k3BPS_CFG1 (0x03) -#define MCP_16MHz_83k3BPS_CFG2 (0xBE) -#define MCP_16MHz_83k3BPS_CFG3 (0x07) - -#define MCP_16MHz_80kBPS_CFG1 (0x03) -#define MCP_16MHz_80kBPS_CFG2 (0xFF) -#define MCP_16MHz_80kBPS_CFG3 (0x87) - -#define MCP_16MHz_50kBPS_CFG1 (0x07) -#define MCP_16MHz_50kBPS_CFG2 (0xFA) -#define MCP_16MHz_50kBPS_CFG3 (0x87) - -#define MCP_16MHz_40kBPS_CFG1 (0x07) -#define MCP_16MHz_40kBPS_CFG2 (0xFF) -#define MCP_16MHz_40kBPS_CFG3 (0x87) - -#define MCP_16MHz_33kBPS_CFG1 (0x09) -#define MCP_16MHz_33kBPS_CFG2 (0xBE) -#define MCP_16MHz_33kBPS_CFG3 (0x07) - -#define MCP_16MHz_31k25BPS_CFG1 (0x0F) -#define MCP_16MHz_31k25BPS_CFG2 (0xF1) -#define MCP_16MHz_31k25BPS_CFG3 (0x85) - -#define MCP_16MHz_20kBPS_CFG1 (0x0F) -#define MCP_16MHz_20kBPS_CFG2 (0xFF) -#define MCP_16MHz_20kBPS_CFG3 (0x87) - -#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) #endif From a250acba70827439b2632cf711877edb982cd4fd Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 19:11:40 +0300 Subject: [PATCH 10/36] Linux like CAN frame struct --- can.h | 45 ++++++++++++++++++++++++++++++++++++++++++ mcp_can.cpp | 54 +++++++++++++++++++++++++++------------------------ mcp_can.h | 8 +++++--- mcp_can_dfs.h | 9 --------- 4 files changed, 79 insertions(+), 37 deletions(-) create mode 100644 can.h delete mode 100644 mcp_can_dfs.h diff --git a/can.h b/can.h new file mode 100644 index 0000000..b66f91d --- /dev/null +++ b/can.h @@ -0,0 +1,45 @@ +#ifndef CAN_H_ +#define CAN_H_ + +#include + + +typedef unsigned char __u8; +typedef unsigned short __u16; +typedef unsigned long __u32; + + +/* special address description flags for the CAN_ID */ +#define CAN_EFF_FLAG 0x80000000UL /* EFF/SFF is set in the MSB */ +#define CAN_RTR_FLAG 0x40000000UL /* remote transmission request */ +#define CAN_ERR_FLAG 0x20000000UL /* error message frame */ + +/* valid bits in CAN ID for frame formats */ +#define CAN_SFF_MASK 0x000007FFUL /* standard frame format (SFF) */ +#define CAN_EFF_MASK 0x1FFFFFFFUL /* extended frame format (EFF) */ +#define CAN_ERR_MASK 0x1FFFFFFFUL /* omit EFF, RTR, ERR flags */ + +/* + * Controller Area Network Identifier structure + * + * bit 0-28 : CAN identifier (11/29 bit) + * bit 29 : error message frame flag (0 = data frame, 1 = error message) + * bit 30 : remote transmission request flag (1 = rtr frame) + * bit 31 : frame format flag (0 = standard 11 bit, 1 = extended 29 bit) + */ +typedef __u32 canid_t; + +#define CAN_SFF_ID_BITS 11 +#define CAN_EFF_ID_BITS 29 + +/* CAN payload length and DLC definitions according to ISO 11898-1 */ +#define CAN_MAX_DLC 8 +#define CAN_MAX_DLEN 8 + +struct can_frame { + canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ + __u8 can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */ + __u8 data[CAN_MAX_DLEN] __attribute__((aligned(8))); +}; + +#endif /* CAN_H_ */ diff --git a/mcp_can.cpp b/mcp_can.cpp index cc987f6..c485a17 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -52,11 +52,11 @@ uint8_t MCP_CAN::readRegister(const REGISTER reg) ** Function name: readRegisterS ** Descriptions: read registerS ******************************************************************************/ -void MCP_CAN::readRegisterS(const REGISTER address, uint8_t values[], const uint8_t n) +void MCP_CAN::readRegisterS(const REGISTER reg, uint8_t values[], const uint8_t n) { startSPI(); SPI.transfer(INSTRUCTION_READ); - SPI.transfer(address); + SPI.transfer(reg); // mcp2515 has auto-increment of address-pointer for (uint8_t i=0; i CAN_MAX_CHAR_IN_MESSAGE) { + if (frame->can_dlc > CAN_MAX_CHAR_IN_MESSAGE) { return ERROR_FAILTX; } @@ -449,20 +449,25 @@ MCP_CAN::ERROR MCP_CAN::sendMessage(const uint32_t id, const bool ext, const boo uint8_t data[13]; + bool ext = frame->can_id & CAN_EFF_FLAG; + bool rtr = frame->can_id & CAN_RTR_FLAG; + uint32_t id = frame->can_id & (ext ? CAN_EFF_MASK : CAN_SFF_MASK); + prepareId(data, ext, id); - data[MCP_DLC] = rtr ? len | RTR_MASK : len; + data[MCP_DLC] = rtr ? frame->can_dlc | RTR_MASK : frame->can_dlc; - memcpy(&data[MCP_DATA], buf, len); + memcpy(&data[MCP_DATA], frame->data, frame->can_dlc); - setRegisterS(txbuf->SIDH, data, 5 + len); + setRegisterS(txbuf->SIDH, data, 5 + frame->can_dlc); modifyRegister(txbuf->CTRL, TXB_TXREQ, TXB_TXREQ); return ERROR_OK; } -MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, uint32_t *id, uint8_t *dlc, uint8_t buf[], bool *rtr, bool *ext) +//MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, uint32_t *id, uint8_t *dlc, uint8_t buf[], bool *rtr, bool *ext) +MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, struct can_frame *frame) { const struct RXBn_REGS *rxb = &RXB[rxbn]; @@ -470,30 +475,29 @@ MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, uint32_t *id, uint8_t *dlc, readRegisterS(rxb->SIDH, tbufdata, 5); - *id = (tbufdata[MCP_SIDH]<<3) + (tbufdata[MCP_SIDL]>>5); + uint32_t id = (tbufdata[MCP_SIDH]<<3) + (tbufdata[MCP_SIDL]>>5); if ( (tbufdata[MCP_SIDL] & TXB_EXIDE_MASK) == TXB_EXIDE_MASK ) { - *id = (*id<<2) + (tbufdata[MCP_SIDL] & 0x03); - *id = (*id<<8) + tbufdata[MCP_EID8]; - *id = (*id<<8) + tbufdata[MCP_EID0]; - *ext = true; - } else { - *ext = false; + id = (id<<2) + (tbufdata[MCP_SIDL] & 0x03); + id = (id<<8) + tbufdata[MCP_EID8]; + id = (id<<8) + tbufdata[MCP_EID0]; + id |= CAN_EFF_FLAG; } - *dlc = tbufdata[MCP_DLC] & DLC_MASK; - if (*dlc > CAN_MAX_CHAR_IN_MESSAGE) { + uint8_t dlc = tbufdata[MCP_DLC] & DLC_MASK; + if (dlc > CAN_MAX_CHAR_IN_MESSAGE) { return ERROR_FAIL; } uint8_t ctrl = readRegister(rxb->CTRL); - if (ctrl & 0x08) { - *rtr = true; - } else { - *rtr = false; + if (ctrl & RXBnCTRL_RTR) { + id |= CAN_RTR_FLAG; } - readRegisterS(rxb->DATA, buf, *dlc); + frame->can_id = id; + frame->can_dlc = dlc; + + readRegisterS(rxb->DATA, frame->data, dlc); switch (rxbn) { case RXB0: @@ -507,15 +511,15 @@ MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, uint32_t *id, uint8_t *dlc, return ERROR_OK; } -MCP_CAN::ERROR MCP_CAN::readMessage(uint32_t *id, uint8_t *dlc, uint8_t buf[], bool *rtr, bool *ext) +MCP_CAN::ERROR MCP_CAN::readMessage(struct can_frame *frame) { ERROR rc; uint8_t stat = getStatus(); if ( stat & STAT_RX0IF ) { - rc = readMessage(RXB0, id, dlc, buf, rtr, ext); + rc = readMessage(RXB0, frame); } else if ( stat & STAT_RX1IF ) { - rc = readMessage(RXB1, id, dlc, buf, rtr, ext); + rc = readMessage(RXB1, frame); } else { rc = ERROR_NOMSG; } diff --git a/mcp_can.h b/mcp_can.h index 12b5029..1e22512 100644 --- a/mcp_can.h +++ b/mcp_can.h @@ -2,6 +2,7 @@ #define _MCP2515_H_ #include +#include "can.h" /* * speed 16M @@ -143,6 +144,7 @@ class MCP_CAN static const uint8_t RXBnCTRL_RXM_EXT = 0x40; static const uint8_t RXBnCTRL_RXM_STDEXT = 0x00; static const uint8_t RXBnCTRL_RXM_MASK = 0x60; + static const uint8_t RXBnCTRL_RTR = 0x80; static const uint8_t RXB0CTRL_BUKT = 0x40; static const uint8_t MCP_SIDH = 0; @@ -338,9 +340,9 @@ class MCP_CAN ERROR begin(const CAN_SPEED speedset); ERROR initMask(const uint8_t num, const bool ext, const uint32_t ulData); ERROR initFilt(const RXF num, const bool ext, const uint32_t ulData); - ERROR sendMessage(const uint32_t id, const bool ext, const bool rtr, const uint8_t len, const uint8_t *buf); - ERROR readMessage(const RXBn rxbn, uint32_t *id, uint8_t *dlc, uint8_t buf[], bool *rtr, bool *ext); - ERROR readMessage(uint32_t *id, uint8_t *dlc, uint8_t buf[], bool *rtr, bool *ext); + ERROR sendMessage(const struct can_frame *frame); + ERROR readMessage(const RXBn rxbn, struct can_frame *frame); + ERROR readMessage(struct can_frame *frame); bool checkReceive(void); bool checkError(void); uint8_t getInterrupts(void); diff --git a/mcp_can_dfs.h b/mcp_can_dfs.h deleted file mode 100644 index b6ca021..0000000 --- a/mcp_can_dfs.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _MCP2515DFS_H_ -#define _MCP2515DFS_H_ - -/* - * Begin mt - */ - - -#endif From e6653b01fd4deb4f896e9230f8d7b7306a47a972 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 19:27:03 +0300 Subject: [PATCH 11/36] Extract "send to buffer X" method --- mcp_can.cpp | 52 ++++++++++++++++++++++++---------------------------- mcp_can.h | 8 ++++++++ 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index c485a17..61f155e 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -7,8 +7,8 @@ const struct MCP_CAN::TXBn_REGS MCP_CAN::TXB[MCP_CAN::N_TXBUFFERS] = { }; const struct MCP_CAN::RXBn_REGS MCP_CAN::RXB[N_RXBUFFERS] = { - {MCP_RXB0CTRL, MCP_RXB0SIDH, MCP_RXB0DATA}, - {MCP_RXB1CTRL, MCP_RXB1SIDH, MCP_RXB1DATA} + {MCP_RXB0CTRL, MCP_RXB0SIDH, MCP_RXB0DATA, CANINTF_RX0IF}, + {MCP_RXB1CTRL, MCP_RXB1SIDH, MCP_RXB1DATA, CANINTF_RX1IF} }; void MCP_CAN::startSPI() { @@ -427,25 +427,9 @@ MCP_CAN::ERROR MCP_CAN::initFilt(const RXF num, const bool ext, const uint32_t u return res; } -MCP_CAN::ERROR MCP_CAN::sendMessage(const struct can_frame *frame) +MCP_CAN::ERROR MCP_CAN::sendMessage(const TXBn txbn, const struct can_frame *frame) { - if (frame->can_dlc > CAN_MAX_CHAR_IN_MESSAGE) { - return ERROR_FAILTX; - } - - const struct TXBn_REGS *txbuf = NULL; - - for (int i=0; ican_dlc > CAN_MAX_CHAR_IN_MESSAGE) { + return ERROR_FAILTX; + } + + TXBn txBuffers[N_TXBUFFERS] = {TXB0, TXB1, TXB2}; + + for (int i=0; iCTRL); + if ( (ctrlval & TXB_TXREQ) == 0 ) { + return sendMessage(txBuffers[i], frame); + } + } + + return ERROR_FAILTX; +} + //MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, uint32_t *id, uint8_t *dlc, uint8_t buf[], bool *rtr, bool *ext) MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, struct can_frame *frame) { @@ -499,14 +502,7 @@ MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, struct can_frame *frame) readRegisterS(rxb->DATA, frame->data, dlc); - switch (rxbn) { - case RXB0: - modifyRegister(MCP_CANINTF, CANINTF_RX0IF, 0); - break; - case RXB1: - modifyRegister(MCP_CANINTF, CANINTF_RX1IF, 0); - break; - } + modifyRegister(MCP_CANINTF, rxb->CANINTF_RXnIF, 0); return ERROR_OK; } diff --git a/mcp_can.h b/mcp_can.h index 1e22512..26fae3b 100644 --- a/mcp_can.h +++ b/mcp_can.h @@ -113,6 +113,12 @@ class MCP_CAN RXB1 = 1 }; + enum TXBn { + TXB0 = 0, + TXB1 = 1, + TXB2 = 2 + }; + enum /*class*/ MODE : uint8_t { MODE_NORMAL = 0x00, MODE_SLEEP = 0x20, @@ -310,6 +316,7 @@ class MCP_CAN REGISTER CTRL; REGISTER SIDH; REGISTER DATA; + CANINTF CANINTF_RXnIF; } RXB[N_RXBUFFERS]; uint8_t SPICS; @@ -340,6 +347,7 @@ class MCP_CAN ERROR begin(const CAN_SPEED speedset); ERROR initMask(const uint8_t num, const bool ext, const uint32_t ulData); ERROR initFilt(const RXF num, const bool ext, const uint32_t ulData); + ERROR sendMessage(const TXBn txbn, const struct can_frame *frame); ERROR sendMessage(const struct can_frame *frame); ERROR readMessage(const RXBn rxbn, struct can_frame *frame); ERROR readMessage(struct can_frame *frame); From 56961fce3bbe35dfefee451c8df0dcf3061c5cbb Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 19:28:17 +0300 Subject: [PATCH 12/36] Drop obsolete examples --- examples/receive_Blink/receive_Blink.ino | 78 ---------------- examples/receive_check/receive_check.ino | 62 ------------- .../receive_interrupt/receive_interrupt.ino | 74 --------------- examples/send/send.ino | 40 -------- examples/send_Blink/send_Blink.ino | 43 --------- examples/send_Blink_ROS/send_Blink_ROS.ino | 73 --------------- .../set_mask_filter_recv.ino | 91 ------------------- .../set_mask_filter_send.ino | 46 ---------- 8 files changed, 507 deletions(-) delete mode 100644 examples/receive_Blink/receive_Blink.ino delete mode 100644 examples/receive_check/receive_check.ino delete mode 100644 examples/receive_interrupt/receive_interrupt.ino delete mode 100644 examples/send/send.ino delete mode 100644 examples/send_Blink/send_Blink.ino delete mode 100644 examples/send_Blink_ROS/send_Blink_ROS.ino delete mode 100644 examples/set_mask_filter_recv/set_mask_filter_recv.ino delete mode 100644 examples/set_mask_filter_send/set_mask_filter_send.ino diff --git a/examples/receive_Blink/receive_Blink.ino b/examples/receive_Blink/receive_Blink.ino deleted file mode 100644 index 49054f9..0000000 --- a/examples/receive_Blink/receive_Blink.ino +++ /dev/null @@ -1,78 +0,0 @@ -// demo: CAN-BUS Shield, receive data with check mode -// send data coming to fast, such as less than 10ms, you can use this way -// loovee, 2014-6-13 - - -#include -#include "mcp_can.h" - - -// the cs pin of the version after v1.1 is default to D9 -// v0.9b and v1.0 is default D10 -const int SPI_CS_PIN = 9; -const int LED=8; -boolean ledON=1; -MCP_CAN CAN(SPI_CS_PIN); // Set CS pin - -void setup() -{ - Serial.begin(115200); - pinMode(LED,OUTPUT); - -START_INIT: - - if(CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k - { - Serial.println("CAN BUS Shield init ok!"); - } - else - { - Serial.println("CAN BUS Shield init fail"); - Serial.println("Init CAN BUS Shield again"); - delay(100); - goto START_INIT; - } -} - - -void loop() -{ - unsigned char len = 0; - unsigned char buf[8]; - - if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming - { - CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf - - unsigned char canId = CAN.getCanId(); - - Serial.println("-----------------------------"); - Serial.println("get data from ID: "); - Serial.println(canId); - - for(int i = 0; i -#include "mcp_can.h" - - -// the cs pin of the version after v1.1 is default to D9 -// v0.9b and v1.0 is default D10 -const int SPI_CS_PIN = 9; - -MCP_CAN CAN(SPI_CS_PIN); // Set CS pin - -void setup() -{ - Serial.begin(115200); - -START_INIT: - - if(CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k - { - Serial.println("CAN BUS Shield init ok!"); - } - else - { - Serial.println("CAN BUS Shield init fail"); - Serial.println("Init CAN BUS Shield again"); - delay(100); - goto START_INIT; - } -} - - -void loop() -{ - unsigned char len = 0; - unsigned char buf[8]; - - if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming - { - CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf - - unsigned long canId = CAN.getCanId(); - - Serial.println("-----------------------------"); - Serial.print("get data from ID: "); - Serial.println(canId, HEX); - - for(int i = 0; i20ms, or else you can use check mode -// loovee, 2014-6-13 - -#include -#include "mcp_can.h" - -// the cs pin of the version after v1.1 is default to D9 -// v0.9b and v1.0 is default D10 -const int SPI_CS_PIN = 9; - -MCP_CAN CAN(SPI_CS_PIN); // Set CS pin - - -unsigned char flagRecv = 0; -unsigned char len = 0; -unsigned char buf[8]; -char str[20]; - -void setup() -{ - Serial.begin(115200); - -START_INIT: - - if(CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k - { - Serial.println("CAN BUS Shield init ok!"); - } - else - { - Serial.println("CAN BUS Shield init fail"); - Serial.println("Init CAN BUS Shield again"); - delay(100); - goto START_INIT; - } - - attachInterrupt(0, MCP2515_ISR, FALLING); // start interrupt -} - -void MCP2515_ISR() -{ - flagRecv = 1; -} - -void loop() -{ - if(flagRecv) - { // check if get data - - flagRecv = 0; // clear flag - - // iterate over all pending messages - // If either the bus is saturated or the MCU is busy, - // both RX buffers may be in use and reading a single - // message does not clear the IRQ conditon. - while (CAN_MSGAVAIL == CAN.checkReceive()) - { - // read data, len: data length, buf: data buf - CAN.readMsgBuf(&len, buf); - - // print the data - for(int i = 0; i -#include - -// the cs pin of the version after v1.1 is default to D9 -// v0.9b and v1.0 is default D10 -const int SPI_CS_PIN = 9; - -MCP_CAN CAN(SPI_CS_PIN); // Set CS pin - -void setup() -{ - Serial.begin(115200); - -START_INIT: - - if(CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k - { - Serial.println("CAN BUS Shield init ok!"); - } - else - { - Serial.println("CAN BUS Shield init fail"); - Serial.println("Init CAN BUS Shield again"); - delay(100); - goto START_INIT; - } -} - -unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7}; -void loop() -{ - // send data: id = 0x00, standrad frame, data len = 8, stmp: data buf - CAN.sendMsgBuf(0x00, 0, 8, stmp); - delay(100); // send data per 100ms -} - -/********************************************************************************************************* - END FILE -*********************************************************************************************************/ diff --git a/examples/send_Blink/send_Blink.ino b/examples/send_Blink/send_Blink.ino deleted file mode 100644 index 22231d6..0000000 --- a/examples/send_Blink/send_Blink.ino +++ /dev/null @@ -1,43 +0,0 @@ -// demo: CAN-BUS Shield, send data -#include -#include - -// the cs pin of the version after v1.1 is default to D9 -// v0.9b and v1.0 is default D10 -const int SPI_CS_PIN = 9; -const int ledHIGH = 1; -const int ledLOW = 0; - -MCP_CAN CAN(SPI_CS_PIN); // Set CS pin - -void setup() -{ - Serial.begin(115200); - -START_INIT: - - if(CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k - { - Serial.println("CAN BUS Shield init ok!"); - } - else - { - Serial.println("CAN BUS Shield init fail"); - Serial.println("Init CAN BUS Shield again"); - delay(100); - goto START_INIT; - } -} - -unsigned char stmp[8] = {ledHIGH, 1, 2, 3, ledLOW, 5, 6, 7}; - -void loop() -{ Serial.println("In loop"); - // send data: id = 0x00, standrad frame, data len = 8, stmp: data buf - CAN.sendMsgBuf(0x70,0, 8, stmp); - delay(1000); // send data per 100ms -} - -/********************************************************************************************************* - END FILE -*********************************************************************************************************/ diff --git a/examples/send_Blink_ROS/send_Blink_ROS.ino b/examples/send_Blink_ROS/send_Blink_ROS.ino deleted file mode 100644 index 90376f5..0000000 --- a/examples/send_Blink_ROS/send_Blink_ROS.ino +++ /dev/null @@ -1,73 +0,0 @@ -// demo: CAN-BUS Shield, send data -// Hardware: TWO ArduinoMega with CAN-SHIELDS -// Run this send_Blink_ROS.ino file on one of the Arduinos -// Run receive_Blink on the other -// ***ROS commands to be followe***// -// roscore -// rosrun roial_python serial_node.py /dev/ttyACM1 _baud:=57600 -// rostopic pub toggle_led std_msgs/Empty -r 100 -// Jaghvi: jaghvim@andrew.cmu.edu - - -#include -#include - -//ROS -#include -#include - -ros::NodeHandle nh; - -const int SPI_CS_PIN = 9; -const int ledHIGH=1; -const int ledLOW=0; -unsigned char stmp[8] = {ledHIGH, 1, 2, 3, ledLOW, 5, 6, 7}; - -MCP_CAN CAN(SPI_CS_PIN); // Set CS pin - -void messageCb( const std_msgs::Empty& toggle_msg){ - //digitalWrite(13, HIGH-digitalRead(13)); // blink the led - // send data: id = 0x00, standrad frame, data len = 8, stmp: data buf - CAN.sendMsgBuf(0x70,0, 8, stmp); - delay(1000); // send data per 100ms -} - -ros::Subscriber sub("toggle_led", &messageCb ); - -// the cs pin of the version after v1.1 is default to D9 -// v0.9b and v1.0 is default D10 - - - -void setup() -{ - Serial.begin(115200); - nh.initNode(); - nh.subscribe(sub); - -START_INIT: - - if(CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k - { - Serial.println("CAN BUS Shield init ok!"); - } - else - { - Serial.println("CAN BUS Shield init fail"); - Serial.println("Init CAN BUS Shield again"); - delay(100); - goto START_INIT; - } -} - - -void loop() -{ - - nh.spinOnce(); - delay(1); -} - -/********************************************************************************************************* - END FILE -*********************************************************************************************************/ diff --git a/examples/set_mask_filter_recv/set_mask_filter_recv.ino b/examples/set_mask_filter_recv/set_mask_filter_recv.ino deleted file mode 100644 index f71e66d..0000000 --- a/examples/set_mask_filter_recv/set_mask_filter_recv.ino +++ /dev/null @@ -1,91 +0,0 @@ -// demo: CAN-BUS Shield, receive data with interrupt mode, and set mask and filter -// -// when in interrupt mode, the data coming can't be too fast, must >20ms, or else you can use check mode -// loovee, 2014-7-8 - -#include -#include "mcp_can.h" - -// the cs pin of the version after v1.1 is default to D9 -// v0.9b and v1.0 is default D10 -const int SPI_CS_PIN = 9; - -MCP_CAN CAN(SPI_CS_PIN); // Set CS pin - - -unsigned char flagRecv = 0; -unsigned char len = 0; -unsigned char buf[8]; -char str[20]; - -void setup() -{ - Serial.begin(115200); - - START_INIT: - - if(CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k - { - Serial.println("CAN BUS Shield init ok!"); - } - else - { - Serial.println("CAN BUS Shield init fail"); - Serial.println("Init CAN BUS Shield again"); - delay(100); - goto START_INIT; - } - - attachInterrupt(0, MCP2515_ISR, FALLING); // start interrupt - - - /* - * set mask, set both the mask to 0x3ff - */ - CAN.init_Mask(0, 0, 0x3ff); // there are 2 mask in mcp2515, you need to set both of them - CAN.init_Mask(1, 0, 0x3ff); - - - /* - * set filter, we can receive id from 0x04 ~ 0x09 - */ - CAN.init_Filt(0, 0, 0x04); // there are 6 filter in mcp2515 - CAN.init_Filt(1, 0, 0x05); // there are 6 filter in mcp2515 - - CAN.init_Filt(2, 0, 0x06); // there are 6 filter in mcp2515 - CAN.init_Filt(3, 0, 0x07); // there are 6 filter in mcp2515 - CAN.init_Filt(4, 0, 0x08); // there are 6 filter in mcp2515 - CAN.init_Filt(5, 0, 0x09); // there are 6 filter in mcp2515 - -} - -void MCP2515_ISR() -{ - flagRecv = 1; -} - -void loop() -{ - if(flagRecv) // check if get data - { - - flagRecv = 0; // clear flag - CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf - - Serial.println("\r\n------------------------------------------------------------------"); - Serial.print("Get Data From id: "); - Serial.println(CAN.getCanId()); - for(int i = 0; i -#include - -// the cs pin of the version after v1.1 is default to D9 -// v0.9b and v1.0 is default D10 -const int SPI_CS_PIN = 9; - -MCP_CAN CAN(SPI_CS_PIN); // Set CS pin - -void setup() -{ - Serial.begin(115200); - -START_INIT: - - if(CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k - { - Serial.println("CAN BUS Shield init ok!"); - } - else - { - Serial.println("CAN BUS Shield init fail"); - Serial.println("Init CAN BUS Shield again"); - delay(100); - goto START_INIT; - } -} - -unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7}; - -void loop() -{ - for(int id=0; id<10; id++) - { - memset(stmp, id, sizeof(stmp)); // set id to send data buff - CAN.sendMsgBuf(id, 0, sizeof(stmp), stmp); - delay(100); - } -} - -/********************************************************************************************************* - END FILE -*********************************************************************************************************/ From 6d637be6675ec03c64dd1b708366283e076db364 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 19:49:11 +0300 Subject: [PATCH 13/36] Update README.md --- README.md | 124 +++++++++++++++++++++--------------------------------- 1 file changed, 49 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index bde92ef..f033e19 100644 --- a/README.md +++ b/README.md @@ -27,22 +27,24 @@ This function is used to initialize the baudrate of the CAN Bus system. The available baudrates are listed as follws: - #define CAN_5KBPS 1 - #define CAN_10KBPS 2 - #define CAN_20KBPS 3 - #define CAN_31K25BPS 4 - #define CAN_33KBPS 5 - #define CAN_40KBPS 6 - #define CAN_50KBPS 7 - #define CAN_80KBPS 8 - #define CAN_83K3BPS 9 - #define CAN_95KBPS 10 - #define CAN_100KBPS 11 - #define CAN_125KBPS 12 - #define CAN_200KBPS 13 - #define CAN_250KBPS 14 - #define CAN_500KBPS 15 - #define CAN_1000KBPS 16 + enum CAN_SPEED { + CAN_5KBPS, + CAN_10KBPS, + CAN_20KBPS, + CAN_31K25BPS, + CAN_33KBPS, + CAN_40KBPS, + CAN_50KBPS, + CAN_80KBPS, + CAN_83K3BPS, + CAN_95KBPS, + CAN_100KBPS, + CAN_125KBPS, + CAN_200KBPS, + CAN_250KBPS, + CAN_500KBPS, + CAN_1000KBPS + };
@@ -75,62 +77,52 @@ The function will return 1 if a frame arrives, and 0 if nothing arrives.
-## 4. Get CAN ID +## 4. Send Data -When some data arrive, you can use the following function to get the CAN ID of the "send" node. + MCP_CAN::ERROR sendMessage(const MCP_CAN::TXBn txbn, const struct can_frame *frame); + MCP_CAN::ERROR sendMessage(const struct can_frame *frame); - INT32U MCP_CAN::getCanId(void); - - - -
-## 5. Send Data - - CAN.sendMsgBuf(INT8U id, INT8U ext, INT8U len, data_buf); - -This is a function to send data onto the bus. In which: - -**id** represents where the data come from. - -**ext** represents the status of the frame. '0' means standard frame. '1' means extended frame. - -**len** represents the length of this frame. - -**data_buf** is the content of this message. +This is a function to send data onto the bus. For example, In the 'send' example, we have: -
  
-unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7};
+
+struct can_frame frame;
+frame.can_id = 0x000;
+frame.can_dlc = 4;
+frame.data[0] = 0xFF;
+frame.data[1] = 0xFF;
+frame.data[2] = 0xFF;
+frame.data[3] = 0xFF;
 
-CAN.sendMsgBuf(0x00, 0, 8, stmp); //send out the message 'stmp' to the bus and tell other devices this is a standard frame from 0x00.
+CAN.sendMessage(&frame); //send out the message to the bus and tell other devices this is a standard frame from 0x00.
+
+ +
+struct can_frame frame;
+frame.can_id = 0x12345678 | CAN_EFF_MASK;
+frame.can_dlc = 2;
+frame.data[0] = 0xFF;
+frame.data[1] = 0xFF;
+
+CAN.sendMessage(MCP_CAN::TXB1, &frame); // send out the message to the bus using second TX buffer and tell other devices this is a extended frame from 0x12345678.
 
-
-## 6. Receive Data +## 5. Receive Data The following function is used to receive data on the 'receive' node: - CAN.readMsgBuf(unsigned char len, unsigned char buf); + MCP_CAN::ERROR readMessage(const MCP_CAN::RXBn rxbn, struct can_frame *frame); + MCP_CAN::ERROR readMessage(struct can_frame *frame); In conditions that masks and filters have been set. This function can only get frames that meet the requirements of masks and filters. -**len** represents the data length. - -**buf** is where you store the data. -
-## 7. Check additional flags - -When frame is received you may check whether it was remote request and whether it was an extended (29bit) frame. - - CAN.isRemoteRequest(); - CAN.isExtendedFrame(); - -**return value** is '0' for a negative response and '1' for a positive +## 6. Examples +Example implementation of CanHacker (lawicel) protocol based device: [https://github.com/autowp/can-usb](https://github.com/autowp/can-usb)
For more information, please refer to [wiki page](http://www.seeedstudio.com/wiki/CAN-BUS_Shield). @@ -138,8 +130,9 @@ For more information, please refer to [wiki page](http://www.seeedstudio.com/wik ---- -This software is written by loovee ([luweicong@seeed.cc](luweicong@seeed.cc "luweicong@seeed.cc")) for seeed studio
-and is licensed under [The MIT License](http://opensource.org/licenses/mit-license.php). Check License.txt for more information.
+This software is written by loovee ([luweicong@seeed.cc](luweicong@seeed.cc "luweicong@seeed.cc")) for seeed studio,
+Updated by Dmitry ([https://github.com/autowp](https://github.com/autowp "https://github.com/autowp"))
+and is licensed under [The MIT License](http://opensource.org/licenses/mit-license.php). Check [LICENSE.md](LICENSE.md) for more information.
Contributing to this software is warmly welcomed. You can do this basically by
[forking](https://help.github.com/articles/fork-a-repo), committing modifications and then [pulling requests](https://help.github.com/articles/using-pull-requests) (follow the links above
@@ -150,22 +143,3 @@ Seeed Studio is an open hardware facilitation company based in Shenzhen, China. Benefiting from local manufacture power and convenient global logistic system,
we integrate resources to serve new era of innovation. Seeed also works with
global distributors and partners to push open hardware movement.
- - - - - - -[![Analytics](https://ga-beacon.appspot.com/UA-46589105-3/CAN_BUS_Shield)](https://github.com/igrigorik/ga-beacon) - - - From 898e25f62fe9911fbdf7e658ef34db8b4714979b Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 19:55:05 +0300 Subject: [PATCH 14/36] Update README.md --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f033e19..8f3938d 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,11 @@ The available baudrates are listed as follws: CAN_1000KBPS }; +
+Example of inititalization + MCP_CAN mcp2551(10, MCP_CAN::MODE_LOOPBACK); + mcp2551->begin(CAN_125KBPS);
##2. Set Receive Mask and Filter @@ -70,9 +74,9 @@ We provide two functions for you to utilize these mask and filter registers. The ## 3. Check Receive The MCP2515 can operate in either a polled mode, where the software checks for a received frame, or using additional pins to signal that a frame has been received or transmit completed. Use the following function to poll for received frames. - INT8U MCP_CAN::checkReceive(void); + bool MCP_CAN::checkReceive(void); -The function will return 1 if a frame arrives, and 0 if nothing arrives. +The function will return true if a frame arrives, and false if nothing arrives. From 9357725d659b253b0794b8f487c0097e4c067ebe Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 20:12:05 +0300 Subject: [PATCH 15/36] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8f3938d..5684449 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ CAN-BUS is a common industrial bus because of its long travel distance, medium c This function is used to initialize the baudrate of the CAN Bus system. -The available baudrates are listed as follws: +The available baudrates are listed as follows: enum CAN_SPEED { CAN_5KBPS, @@ -53,6 +53,8 @@ Example of inititalization mcp2551->begin(CAN_125KBPS);
+Note: To transfer data on high speed of CAN interface via UART dont forget to update UART baudrate as necessary. + ##2. Set Receive Mask and Filter There are 2 receive mask registers and 5 filter registers on the controller chip that guarantee you get data from the target device. They are useful especially in a large network consisting of numerous nodes. From cb4a30dc37c709b4fff44651fd4b143f3d3f9f00 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 20:18:05 +0300 Subject: [PATCH 16/36] Update README.md --- README.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/README.md b/README.md index 5684449..e3c241b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ -CAN BUS Shield +Arduino MCP2515 CAN interface library --------------------------------------------------------- -[![CAN BUS Shield](http://www.seeedstudio.com/depot/images/1130300211.jpg)](http://www.seeedstudio.com/depot/CANBUS-Shield-p-2256.html?cPath=19_88) -
@@ -11,9 +9,6 @@ CAN-BUS is a common industrial bus because of its long travel distance, medium c - SPI Interface up to 10 MHz - Standard (11 bit) and extended (29 bit) data and remote frames - Two receive buffers with prioritized message storage -- Industrial standard 9 pin sub-D connector -- Two LED indicators -
From e566f1466e76f9b9aab874584203ecc67a423dcb Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 20:20:55 +0300 Subject: [PATCH 17/36] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e3c241b..3ddb612 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,10 @@ CAN-BUS is a common industrial bus because of its long travel distance, medium c -## 1. Set the BaudRate +## 1. Initializtion + +To create connection with MCP2515 provide pin number where SPI CS is connected (10 by default) and mode -This function is used to initialize the baudrate of the CAN Bus system. The available baudrates are listed as follows: From 3de31788592b3f79332bd01fd4b87bf6c2438680 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 20:23:54 +0300 Subject: [PATCH 18/36] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 3ddb612..1b0d1fe 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,13 @@ CAN-BUS is a common industrial bus because of its long travel distance, medium c To create connection with MCP2515 provide pin number where SPI CS is connected (10 by default) and mode +The available modes are listed as follows: + MCP_CAN::MODE_NORMAL, + MCP_CAN::MODE_LOOPBACK, + MCP_CAN::MODE_LISTENONLY + +To work with network set baudrate. The available baudrates are listed as follows: enum CAN_SPEED { From 5a84e4a715cf2aeaf67713f58c6dbc1680981497 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 20:35:15 +0300 Subject: [PATCH 19/36] Update README.md --- README.md | 61 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 1b0d1fe..dd6b41a 100644 --- a/README.md +++ b/README.md @@ -75,17 +75,7 @@ We provide two functions for you to utilize these mask and filter registers. The
-## 3. Check Receive -The MCP2515 can operate in either a polled mode, where the software checks for a received frame, or using additional pins to signal that a frame has been received or transmit completed. Use the following function to poll for received frames. - - bool MCP_CAN::checkReceive(void); - -The function will return true if a frame arrives, and false if nothing arrives. - - - -
-## 4. Send Data +## 3. Send Data MCP_CAN::ERROR sendMessage(const MCP_CAN::TXBn txbn, const struct can_frame *frame); MCP_CAN::ERROR sendMessage(const struct can_frame *frame); @@ -118,7 +108,7 @@ CAN.sendMessage(MCP_CAN::TXB1, &frame); // send out the message to the bus using
-## 5. Receive Data +## 4. Receive Data The following function is used to receive data on the 'receive' node: @@ -127,8 +117,53 @@ The following function is used to receive data on the 'receive' node: In conditions that masks and filters have been set. This function can only get frames that meet the requirements of masks and filters. +You can choise one of two method to receive: interrup-based and polling + +Example of poll read + + void loop() { + struct can_frame frame; + if (mcp2551.readMessage(&frame) == MCP_CAN::ERROR_OK) { + // frame contains received message + } + } + +Example of interrupt based read + + bool interrupt = false; + struct can_frame frame; + + void irqHandler() { + interrupt = true; + } + + void setup() { + ... + attachInterrupt(0, irqHandler, FALLING); + } + + void loop() { + if (interrupt) { + interrupt = false; + + uint8_t irq = mcp2551.getInterrupts(); + + if (irq & MCP_CAN::CANINTF_RX0IF) { + if (mcp2551.readMessage(MCP_CAN::RXB0, &frame) == CanHacker::ERROR_OK) { + // frame contains received from RXB0 message + } + } + + if (irq & MCP_CAN::CANINTF_RX1IF) { + if (mcp2551.readMessage(MCP_CAN::RXB1, &frame) == CanHacker::ERROR_OK) { + // frame contains received from RXB1 message + } + } + } + } +
-## 6. Examples +## 5. Examples Example implementation of CanHacker (lawicel) protocol based device: [https://github.com/autowp/can-usb](https://github.com/autowp/can-usb) From 0a91d60293361ac4a64e54800c74b07b19fd0980 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 20:39:20 +0300 Subject: [PATCH 20/36] Update README.md --- README.md | 153 +++++++++++++++++++++++++++++------------------------- 1 file changed, 81 insertions(+), 72 deletions(-) diff --git a/README.md b/README.md index dd6b41a..84ea3c1 100644 --- a/README.md +++ b/README.md @@ -21,38 +21,40 @@ CAN-BUS is a common industrial bus because of its long travel distance, medium c To create connection with MCP2515 provide pin number where SPI CS is connected (10 by default) and mode The available modes are listed as follows: - - MCP_CAN::MODE_NORMAL, - MCP_CAN::MODE_LOOPBACK, - MCP_CAN::MODE_LISTENONLY - +```C++ +MCP_CAN::MODE_NORMAL, +MCP_CAN::MODE_LOOPBACK, +MCP_CAN::MODE_LISTENONLY +``` To work with network set baudrate. The available baudrates are listed as follows: - - enum CAN_SPEED { - CAN_5KBPS, - CAN_10KBPS, - CAN_20KBPS, - CAN_31K25BPS, - CAN_33KBPS, - CAN_40KBPS, - CAN_50KBPS, - CAN_80KBPS, - CAN_83K3BPS, - CAN_95KBPS, - CAN_100KBPS, - CAN_125KBPS, - CAN_200KBPS, - CAN_250KBPS, - CAN_500KBPS, - CAN_1000KBPS - }; +```C++ +enum CAN_SPEED { + CAN_5KBPS, + CAN_10KBPS, + CAN_20KBPS, + CAN_31K25BPS, + CAN_33KBPS, + CAN_40KBPS, + CAN_50KBPS, + CAN_80KBPS, + CAN_83K3BPS, + CAN_95KBPS, + CAN_100KBPS, + CAN_125KBPS, + CAN_200KBPS, + CAN_250KBPS, + CAN_500KBPS, + CAN_1000KBPS +}; +```
Example of inititalization - - MCP_CAN mcp2551(10, MCP_CAN::MODE_LOOPBACK); - mcp2551->begin(CAN_125KBPS); +```C++ +MCP_CAN mcp2551(10, MCP_CAN::MODE_LOOPBACK); +mcp2551->begin(CAN_125KBPS); +```
Note: To transfer data on high speed of CAN interface via UART dont forget to update UART baudrate as necessary. @@ -63,8 +65,10 @@ There are 2 receive mask registers and 5 filter registers on the controller chip We provide two functions for you to utilize these mask and filter registers. They are: - init_Mask(unsigned char num, unsigned char ext, unsigned char ulData); - init_Filt(unsigned char num, unsigned char ext, unsigned char ulData); +```C++ +init_Mask(unsigned char num, unsigned char ext, unsigned char ulData); +init_Filt(unsigned char num, unsigned char ext, unsigned char ulData); +``` **num** represents which register to use. You can fill 0 or 1 for mask and 0 to 5 for filter. @@ -76,15 +80,16 @@ We provide two functions for you to utilize these mask and filter registers. The
## 3. Send Data - - MCP_CAN::ERROR sendMessage(const MCP_CAN::TXBn txbn, const struct can_frame *frame); - MCP_CAN::ERROR sendMessage(const struct can_frame *frame); +```C++ +MCP_CAN::ERROR sendMessage(const MCP_CAN::TXBn txbn, const struct can_frame *frame); +MCP_CAN::ERROR sendMessage(const struct can_frame *frame); +``` This is a function to send data onto the bus. For example, In the 'send' example, we have: -
+```C++
 struct can_frame frame;
 frame.can_id = 0x000;
 frame.can_dlc = 4;
@@ -94,9 +99,9 @@ frame.data[2] = 0xFF;
 frame.data[3] = 0xFF;
 
 CAN.sendMessage(&frame); //send out the message to the bus and tell other devices this is a standard frame from 0x00.
-
+``` -
+```C++
 struct can_frame frame;
 frame.can_id = 0x12345678 | CAN_EFF_MASK;
 frame.can_dlc = 2;
@@ -104,7 +109,7 @@ frame.data[0] = 0xFF;
 frame.data[1] = 0xFF;
 
 CAN.sendMessage(MCP_CAN::TXB1, &frame); // send out the message to the bus using second TX buffer and tell other devices this is a extended frame from 0x12345678.
-
+```
@@ -112,8 +117,10 @@ CAN.sendMessage(MCP_CAN::TXB1, &frame); // send out the message to the bus using The following function is used to receive data on the 'receive' node: - MCP_CAN::ERROR readMessage(const MCP_CAN::RXBn rxbn, struct can_frame *frame); - MCP_CAN::ERROR readMessage(struct can_frame *frame); +```C++ +MCP_CAN::ERROR readMessage(const MCP_CAN::RXBn rxbn, struct can_frame *frame); +MCP_CAN::ERROR readMessage(struct can_frame *frame); +``` In conditions that masks and filters have been set. This function can only get frames that meet the requirements of masks and filters. @@ -121,47 +128,49 @@ You can choise one of two method to receive: interrup-based and polling Example of poll read - void loop() { - struct can_frame frame; - if (mcp2551.readMessage(&frame) == MCP_CAN::ERROR_OK) { - // frame contains received message - } - } +```C++ +void loop() { + struct can_frame frame; + if (mcp2551.readMessage(&frame) == MCP_CAN::ERROR_OK) { + // frame contains received message + } +} +``` Example of interrupt based read - - bool interrupt = false; - struct can_frame frame; +```C++ +bool interrupt = false; +struct can_frame frame; - void irqHandler() { - interrupt = true; - } +void irqHandler() { + interrupt = true; +} - void setup() { - ... - attachInterrupt(0, irqHandler, FALLING); - } +void setup() { + ... + attachInterrupt(0, irqHandler, FALLING); +} - void loop() { - if (interrupt) { - interrupt = false; +void loop() { + if (interrupt) { + interrupt = false; + + uint8_t irq = mcp2551.getInterrupts(); - uint8_t irq = mcp2551.getInterrupts(); - - if (irq & MCP_CAN::CANINTF_RX0IF) { - if (mcp2551.readMessage(MCP_CAN::RXB0, &frame) == CanHacker::ERROR_OK) { - // frame contains received from RXB0 message - } - } + if (irq & MCP_CAN::CANINTF_RX0IF) { + if (mcp2551.readMessage(MCP_CAN::RXB0, &frame) == CanHacker::ERROR_OK) { + // frame contains received from RXB0 message + } + } - if (irq & MCP_CAN::CANINTF_RX1IF) { - if (mcp2551.readMessage(MCP_CAN::RXB1, &frame) == CanHacker::ERROR_OK) { - // frame contains received from RXB1 message - } - } - } - } - + if (irq & MCP_CAN::CANINTF_RX1IF) { + if (mcp2551.readMessage(MCP_CAN::RXB1, &frame) == CanHacker::ERROR_OK) { + // frame contains received from RXB1 message + } + } + } +} +```
## 5. Examples From f1102f3b3ead285a9173ca9a3ee20c70562de66c Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 20:40:55 +0300 Subject: [PATCH 21/36] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 84ea3c1..5698ae9 100644 --- a/README.md +++ b/README.md @@ -129,8 +129,9 @@ You can choise one of two method to receive: interrup-based and polling Example of poll read ```C++ +struct can_frame frame; + void loop() { - struct can_frame frame; if (mcp2551.readMessage(&frame) == MCP_CAN::ERROR_OK) { // frame contains received message } From c674e46f706da00d0a711abda006699d4287eb7a Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 20:49:51 +0300 Subject: [PATCH 22/36] Update README.md --- README.md | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5698ae9..731e4be 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ CAN-BUS is a common industrial bus because of its long travel distance, medium c -## 1. Initializtion +## 1. Initialization To create connection with MCP2515 provide pin number where SPI CS is connected (10 by default) and mode @@ -59,7 +59,19 @@ mcp2551->begin(CAN_125KBPS); Note: To transfer data on high speed of CAN interface via UART dont forget to update UART baudrate as necessary. -##2. Set Receive Mask and Filter +##2. Frame data format + +Library uses Linux-like structure to store can frames; +```C++ +struct can_frame { + uint32_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ + uint8_t can_dlc; + uint8_t data[8] +}; +``` +For additional information see [SocketCAN](https://www.kernel.org/doc/Documentation/networking/can.txt) + +##3. Set Receive Mask and Filter There are 2 receive mask registers and 5 filter registers on the controller chip that guarantee you get data from the target device. They are useful especially in a large network consisting of numerous nodes. @@ -79,7 +91,7 @@ init_Filt(unsigned char num, unsigned char ext, unsigned char ulData);
-## 3. Send Data +## 4. Send Data ```C++ MCP_CAN::ERROR sendMessage(const MCP_CAN::TXBn txbn, const struct can_frame *frame); MCP_CAN::ERROR sendMessage(const struct can_frame *frame); @@ -113,7 +125,7 @@ CAN.sendMessage(MCP_CAN::TXB1, &frame); // send out the message to the bus using
-## 4. Receive Data +## 5. Receive Data The following function is used to receive data on the 'receive' node: @@ -173,7 +185,7 @@ void loop() { } ```
-## 5. Examples +## 6. Examples Example implementation of CanHacker (lawicel) protocol based device: [https://github.com/autowp/can-usb](https://github.com/autowp/can-usb) From ae6c70aa1a41c5e1c2a79965a802c880e3ed4705 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 20:50:35 +0300 Subject: [PATCH 23/36] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 731e4be..904f24a 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ Library uses Linux-like structure to store can frames; struct can_frame { uint32_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ uint8_t can_dlc; - uint8_t data[8] + uint8_t data[8]; }; ``` For additional information see [SocketCAN](https://www.kernel.org/doc/Documentation/networking/can.txt) From 77881cbaecb0b66d124271744fbe65b6bb0a44b7 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 20:51:40 +0300 Subject: [PATCH 24/36] Update README.md --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 904f24a..b3054df 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,9 @@ frame.data[1] = 0xFF; frame.data[2] = 0xFF; frame.data[3] = 0xFF; -CAN.sendMessage(&frame); //send out the message to the bus and tell other devices this is a standard frame from 0x00. +/* send out the message to the bus and +tell other devices this is a standard frame from 0x00. */ +CAN.sendMessage(&frame); ``` ```C++ @@ -120,7 +122,9 @@ frame.can_dlc = 2; frame.data[0] = 0xFF; frame.data[1] = 0xFF; -CAN.sendMessage(MCP_CAN::TXB1, &frame); // send out the message to the bus using second TX buffer and tell other devices this is a extended frame from 0x12345678. +/* send out the message to the bus using second TX buffer and +tell other devices this is a extended frame from 0x12345678. */ +CAN.sendMessage(MCP_CAN::TXB1, &frame); ``` From e1d8e2341a27f307efc9f0d38eac35e4847c6124 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 20:52:34 +0300 Subject: [PATCH 25/36] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b3054df..3e33dfd 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ frame.data[3] = 0xFF; /* send out the message to the bus and tell other devices this is a standard frame from 0x00. */ -CAN.sendMessage(&frame); +mcp2551.sendMessage(&frame); ``` ```C++ @@ -124,7 +124,7 @@ frame.data[1] = 0xFF; /* send out the message to the bus using second TX buffer and tell other devices this is a extended frame from 0x12345678. */ -CAN.sendMessage(MCP_CAN::TXB1, &frame); +mcp2551.sendMessage(MCP_CAN::TXB1, &frame); ``` From ad4c963c9e1c36e295699679cc5e7b114cdb0d2b Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 20:54:38 +0300 Subject: [PATCH 26/36] Drop obsolete constant CAN_MAX_CHAR_IN_MESSAGE --- mcp_can.cpp | 4 ++-- mcp_can.h | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/mcp_can.cpp b/mcp_can.cpp index 61f155e..1b37490 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -452,7 +452,7 @@ MCP_CAN::ERROR MCP_CAN::sendMessage(const TXBn txbn, const struct can_frame *fra MCP_CAN::ERROR MCP_CAN::sendMessage(const struct can_frame *frame) { - if (frame->can_dlc > CAN_MAX_CHAR_IN_MESSAGE) { + if (frame->can_dlc > CAN_MAX_DLEN) { return ERROR_FAILTX; } @@ -488,7 +488,7 @@ MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, struct can_frame *frame) } uint8_t dlc = tbufdata[MCP_DLC] & DLC_MASK; - if (dlc > CAN_MAX_CHAR_IN_MESSAGE) { + if (dlc > CAN_MAX_DLEN) { return ERROR_FAIL; } diff --git a/mcp_can.h b/mcp_can.h index 26fae3b..f7042e6 100644 --- a/mcp_can.h +++ b/mcp_can.h @@ -300,7 +300,6 @@ class MCP_CAN MCP_RXB1DATA = 0x76 }; - static const int CAN_MAX_CHAR_IN_MESSAGE = 8; static const uint32_t SPI_CLOCK = 10000000; // 10MHz static const int N_TXBUFFERS = 3; From 06d04d0ec8b5a6b0164572324dc052396d336170 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 20:57:21 +0300 Subject: [PATCH 27/36] Create LICENSE.md --- LICENSE.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..168474e --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2013 Seeed Technology Inc. +Copyright (c) 2016 Dmitry + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 26b5f00eb925381039690ef3af29617f4c142c04 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 6 Jan 2016 20:58:10 +0300 Subject: [PATCH 28/36] Drop licencse.txt --- License.txt | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 License.txt diff --git a/License.txt b/License.txt deleted file mode 100644 index baf484b..0000000 --- a/License.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Seeed Technology Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file From 8a5b03e3659fa75ab29e5981e3194a7ac70bcce2 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 13 Jan 2016 13:24:25 +0300 Subject: [PATCH 29/36] Readme error fix --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3e33dfd..b28dcac 100644 --- a/README.md +++ b/README.md @@ -175,13 +175,13 @@ void loop() { uint8_t irq = mcp2551.getInterrupts(); if (irq & MCP_CAN::CANINTF_RX0IF) { - if (mcp2551.readMessage(MCP_CAN::RXB0, &frame) == CanHacker::ERROR_OK) { + if (mcp2551.readMessage(MCP_CAN::RXB0, &frame) == MCP_CAN::ERROR_OK) { // frame contains received from RXB0 message } } if (irq & MCP_CAN::CANINTF_RX1IF) { - if (mcp2551.readMessage(MCP_CAN::RXB1, &frame) == CanHacker::ERROR_OK) { + if (mcp2551.readMessage(MCP_CAN::RXB1, &frame) == MCP_CAN::ERROR_OK) { // frame contains received from RXB1 message } } From 4bbbc1ddfb189d6e3fe41ae090882f4daa5a937b Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 13 Jan 2016 13:49:52 +0300 Subject: [PATCH 30/36] Typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b28dcac..a6ff676 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ enum CAN_SPEED { ```
-Example of inititalization +Example of initialization ```C++ MCP_CAN mcp2551(10, MCP_CAN::MODE_LOOPBACK); mcp2551->begin(CAN_125KBPS); From 28380c49ac6ba8daaf3cbd575bb00d02c376e3ad Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 13 Jan 2016 14:19:04 +0300 Subject: [PATCH 31/36] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a6ff676..dac9264 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ enum CAN_SPEED { Example of initialization ```C++ MCP_CAN mcp2551(10, MCP_CAN::MODE_LOOPBACK); -mcp2551->begin(CAN_125KBPS); +mcp2551.begin(CAN_125KBPS); ```
From b61080b2ea1df4572e1abbb0584a5890914b1b97 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 13 Jan 2016 14:40:39 +0300 Subject: [PATCH 32/36] mcp2551 -> mcp2515 --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index dac9264..71c55c9 100644 --- a/README.md +++ b/README.md @@ -52,8 +52,8 @@ enum CAN_SPEED {
Example of initialization ```C++ -MCP_CAN mcp2551(10, MCP_CAN::MODE_LOOPBACK); -mcp2551.begin(CAN_125KBPS); +MCP_CAN mcp2515(10, MCP_CAN::MODE_LOOPBACK); +mcp2515.begin(CAN_125KBPS); ```
@@ -112,7 +112,7 @@ frame.data[3] = 0xFF; /* send out the message to the bus and tell other devices this is a standard frame from 0x00. */ -mcp2551.sendMessage(&frame); +mcp2515.sendMessage(&frame); ``` ```C++ @@ -124,7 +124,7 @@ frame.data[1] = 0xFF; /* send out the message to the bus using second TX buffer and tell other devices this is a extended frame from 0x12345678. */ -mcp2551.sendMessage(MCP_CAN::TXB1, &frame); +mcp2515.sendMessage(MCP_CAN::TXB1, &frame); ``` @@ -148,7 +148,7 @@ Example of poll read struct can_frame frame; void loop() { - if (mcp2551.readMessage(&frame) == MCP_CAN::ERROR_OK) { + if (mcp2515.readMessage(&frame) == MCP_CAN::ERROR_OK) { // frame contains received message } } @@ -172,16 +172,16 @@ void loop() { if (interrupt) { interrupt = false; - uint8_t irq = mcp2551.getInterrupts(); + uint8_t irq = mcp2515.getInterrupts(); if (irq & MCP_CAN::CANINTF_RX0IF) { - if (mcp2551.readMessage(MCP_CAN::RXB0, &frame) == MCP_CAN::ERROR_OK) { + if (mcp2515.readMessage(MCP_CAN::RXB0, &frame) == MCP_CAN::ERROR_OK) { // frame contains received from RXB0 message } } if (irq & MCP_CAN::CANINTF_RX1IF) { - if (mcp2551.readMessage(MCP_CAN::RXB1, &frame) == MCP_CAN::ERROR_OK) { + if (mcp2515.readMessage(MCP_CAN::RXB1, &frame) == MCP_CAN::ERROR_OK) { // frame contains received from RXB1 message } } From cb0b7c5f70af00fb40f0b1e062340420c1e253a1 Mon Sep 17 00:00:00 2001 From: TheRo0T Date: Wed, 13 Jan 2016 16:13:38 +0400 Subject: [PATCH 33/36] Add Example CAN Read --- examples/CAN_read/CAN_read.ino | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 examples/CAN_read/CAN_read.ino diff --git a/examples/CAN_read/CAN_read.ino b/examples/CAN_read/CAN_read.ino new file mode 100644 index 0000000..8767340 --- /dev/null +++ b/examples/CAN_read/CAN_read.ino @@ -0,0 +1,35 @@ +#include +#include + +struct can_frame canMsg; +MCP_CAN mcp2551(10, MCP_CAN::MODE_NORMAL); + + +void setup() { + Serial.begin(115200); + mcp2551.begin(CAN_125KBPS); + Serial.println("------- CAN Read ----------"); + Serial.println("ID DLC DATA"); + +} + +void loop() { + + if (mcp2551.readMessage(&canMsg) == MCP_CAN::ERROR_OK) { + + Serial.print(canMsg.can_id); // print ID + + Serial.print(canMsg.can_dlc); // print DLC + + for(int i = 0; i Date: Wed, 13 Jan 2016 15:18:58 +0300 Subject: [PATCH 34/36] Whitespaces --- examples/CAN_read/CAN_read.ino | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/examples/CAN_read/CAN_read.ino b/examples/CAN_read/CAN_read.ino index 8767340..e0bc45a 100644 --- a/examples/CAN_read/CAN_read.ino +++ b/examples/CAN_read/CAN_read.ino @@ -10,25 +10,23 @@ void setup() { mcp2551.begin(CAN_125KBPS); Serial.println("------- CAN Read ----------"); Serial.println("ID DLC DATA"); - } void loop() { if (mcp2551.readMessage(&canMsg) == MCP_CAN::ERROR_OK) { - + Serial.print(canMsg.can_id); // print ID Serial.print(canMsg.can_dlc); // print DLC - for(int i = 0; i Date: Wed, 13 Jan 2016 15:24:46 +0300 Subject: [PATCH 35/36] mcp2551 -> mcp2515 --- examples/CAN_read/CAN_read.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/CAN_read/CAN_read.ino b/examples/CAN_read/CAN_read.ino index e0bc45a..74b8c9a 100644 --- a/examples/CAN_read/CAN_read.ino +++ b/examples/CAN_read/CAN_read.ino @@ -2,19 +2,19 @@ #include struct can_frame canMsg; -MCP_CAN mcp2551(10, MCP_CAN::MODE_NORMAL); +MCP_CAN mcp2515(10, MCP_CAN::MODE_NORMAL); void setup() { Serial.begin(115200); - mcp2551.begin(CAN_125KBPS); + mcp2515.begin(CAN_125KBPS); Serial.println("------- CAN Read ----------"); Serial.println("ID DLC DATA"); } void loop() { - if (mcp2551.readMessage(&canMsg) == MCP_CAN::ERROR_OK) { + if (mcp2515.readMessage(&canMsg) == MCP_CAN::ERROR_OK) { Serial.print(canMsg.can_id); // print ID From 880343e7f1442fc3cac0d2b0b0d4704c91882a0b Mon Sep 17 00:00:00 2001 From: TheRo0T Date: Wed, 13 Jan 2016 21:56:03 +0400 Subject: [PATCH 36/36] fix example --- examples/CAN_read/CAN_read.ino | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/CAN_read/CAN_read.ino b/examples/CAN_read/CAN_read.ino index 74b8c9a..dca3218 100644 --- a/examples/CAN_read/CAN_read.ino +++ b/examples/CAN_read/CAN_read.ino @@ -16,13 +16,14 @@ void loop() { if (mcp2515.readMessage(&canMsg) == MCP_CAN::ERROR_OK) { - Serial.print(canMsg.can_id); // print ID - - Serial.print(canMsg.can_dlc); // print DLC - + Serial.print(canMsg.can_id, HEX); // print ID + Serial.print(" "); + Serial.print(canMsg.can_dlc,HEX); // print DLC + Serial.print(" "); + for (int i = 0; i