diff --git a/arduino-canbus-monitor.ino b/arduino-canbus-monitor.ino index 3fc4936..59ec041 100644 --- a/arduino-canbus-monitor.ino +++ b/arduino-canbus-monitor.ino @@ -16,16 +16,23 @@ #include "can-232.h" #include "SoftwareSerial.h" +#define DEBUG_MODE void setup() { Serial.begin(LW232_DEFAULT_BAUD_RATE); // default COM baud rate is 115200. - Can232::init(CAN_125KBPS); // set default rate you need here and clock frequency of CAN shield. Typically it is 16MHz, but on some MCP2515 + TJA1080 it is 8Mhz - // Rates: CAN_10KBPS, CAN_20KBPS, CAN_50KBPS, CAN_100KBPS, CAN_125KBPS, CAN_250KBPS, CAN_500KBPS, CAN_500KBPS, CAN_1000KBPS, CAN_83K3BPS - // Freq: MCP_16MHz or MCP_8MHz. Default is MCP_16MHz. Please note, not all CAN speeds supported. check big switch in mcp_can.cpp -// Can232::init(CAN_125KBPS, MCP_8MHz); // set default rate you need here and clock frequency of CAN shield. Typically it is 16MHz, but on some MCP2515 + TJA1080 it is 8Mhz + // Can232::init (RATE, CLOCK) + // Rates: CAN_10KBPS, CAN_20KBPS, CAN_50KBPS, CAN_100KBPS, CAN_125KBPS, CAN_250KBPS, CAN_500KBPS, CAN_500KBPS, CAN_1000KBPS, CAN_83K3BPS + // Default is CAN_83K3BPS ;))))))))) + // Clock: MCP_16MHz or MCP_8MHz. + // Default is MCP_16MHz. Please note, not all CAN speeds supported. check big switch in mcp_can.cpp + // defaults can be changed in mcp_can.h + +// Can232::init(); // rate and clock = LW232_DEFAULT_CAN_RATE and LW232_DEFAULT_CLOCK_FREQ +// Can232::init(CAN_125KBPS); // rate = 125, clock = LW232_DEFAULT_CLOCK_FREQ + Can232::init(CAN_125KBPS, MCP_16MHz); // set default rate you need here and clock frequency of CAN shield. Typically it is 16MHz, but on some MCP2515 + TJA1050 it is 8Mhz + - // optional custom packet filter to reduce number of messages comingh through to canhacker // Can232::setFilter(myCustomAddressFilter); } diff --git a/can-232.cpp b/can-232.cpp index 52dcfd7..4fde67f 100644 --- a/can-232.cpp +++ b/can-232.cpp @@ -33,36 +33,29 @@ #define dbgH(x) #endif -//#define LOGGING_ENABLED -//#ifdef LOGGING_ENABLED +#ifdef LOGGING_ENABLED // software serial #2: TX = digital pin 8, RX = digital pin 9 // on the Mega, use other pins instead, since 8 and 9 don't work on the Mega - SoftwareSerial debug(DEBUG_RX_PIN, DEBUG_TX_PIN); -//#endif + + SoftwareSerial debug(DEBUG_RX_PIN, DEBUG_TX_PIN); + //#define debug Serial +#endif Can232* Can232::_instance = 0; -Can232* const & Can232::instance() { +Can232* Can232::instance() { if (_instance == 0) _instance = new Can232(); return _instance; } -void Can232::init() { +void Can232::init(INT8U defaultCanSpeed, const INT8U clock) { dbg_begin(LW232_DEFAULT_BAUD_RATE); // logging through software serial dbg1("CAN ASCII. Welcome to debug"); - - instance()->initFunc(); -} -void Can232::init(INT8U defaultCanSpeed) { - init(); instance()->lw232CanSpeedSelection = defaultCanSpeed; -} - -void Can232::init(INT8U defaultCanSpeed, const INT8U clock) { - init(defaultCanSpeed); instance()->lw232McpModuleClock = clock; + instance()->initFunc(); } void Can232::setFilter(INT8U (*userFunc)(INT32U)) { @@ -79,13 +72,15 @@ void Can232::serialEvent() { void Can232::initFunc() { inputString.reserve(200); - // lw232AutoStart = true; //todo: read from eeprom - // lw232AutoPoll = false; //todo: read from eeprom + // lw232AutoStart = true; //todo: read from eeprom + // lw232AutoPoll = false; //todo: read from eeprom // lw232TimeStamp = //read from eeprom // lw232Message[0] = 'Z'; lw232Message[1] = '1'; exec(); - // if (lw232AutoStart) { - lw232Message[0] = 'O'; exec(); - // } + //if (lw232AutoStart) { + inputString = "O\0x0D"; + stringComplete = true; + loopFunc(); + //} } void Can232::setFilterFunc(INT8U (*userFunc)(INT32U)) { @@ -95,7 +90,7 @@ void Can232::setFilterFunc(INT8U (*userFunc)(INT32U)) { void Can232::loopFunc() { if (stringComplete) { int len = inputString.length(); - if (len > 1 && len < 29) { + if (len > 0 && len < 29) { strcpy((char*)lw232Message, inputString.c_str()); exec(); } @@ -125,9 +120,8 @@ void Can232::serialEventFunc() { } INT8U Can232::exec() { - dbg2("Command received:", inputString); + dbg2("Command received:", inputString); lw232LastErr = parseAndRunCommand(); - switch (lw232LastErr) { case LW232_OK: Serial.write(LW232_RET_ASCII_OK); @@ -151,7 +145,6 @@ INT8U Can232::exec() { return 0; } - INT8U Can232::parseAndRunCommand() { INT8U ret = LW232_OK; INT8U idx = 0; @@ -164,7 +157,7 @@ INT8U Can232::parseAndRunCommand() { // Sn[CR] Setup with standard CAN bit-rates where n is 0-9. if (lw232CanChannelMode == LW232_STATUS_CAN_CLOSED) { idx = HexHelper::parseNibbleWithLimit(lw232Message[1], LW232_CAN_BAUD_NUM); - lw232CanSpeedSelection = lw232CanBaudRates[idx]; + lw232CanSpeedSelection = lw232CanBaudRates[idx]; } else { ret = LW232_ERR; @@ -176,8 +169,10 @@ INT8U Can232::parseAndRunCommand() { case LW232_CMD_OPEN: // O[CR] Open the CAN channel in normal mode (sending & receiving). if (lw232CanChannelMode == LW232_STATUS_CAN_CLOSED) { - lw232CanChannelMode = LW232_STATUS_CAN_OPEN_NORMAL; ret = openCanBus(); + if (ret == LW232_OK) { + lw232CanChannelMode = LW232_STATUS_CAN_OPEN_NORMAL; + } } else { ret = LW232_ERR; @@ -186,8 +181,10 @@ INT8U Can232::parseAndRunCommand() { case LW232_CMD_LISTEN: // L[CR] Open the CAN channel in listen only mode (receiving). if (lw232CanChannelMode == LW232_STATUS_CAN_CLOSED) { - lw232CanChannelMode = LW232_STATUS_CAN_OPEN_LISTEN; ret = openCanBus(); + if (ret == LW232_OK) { + lw232CanChannelMode = LW232_STATUS_CAN_OPEN_LISTEN; + } } else { ret = LW232_ERR; @@ -206,16 +203,16 @@ INT8U Can232::parseAndRunCommand() { // tiiildd...[CR] Transmit a standard (11bit) CAN frame. if (lw232CanChannelMode == LW232_STATUS_CAN_OPEN_NORMAL) { parseCanStdId(); - lw232PacketLen = HexHelper::parseNibbleWithLimit(lw232Message[LW232_OFFSET_STD_PKT_LEN], LW232_FRAME_MAX_LENGTH); + lw232PacketLen = HexHelper::parseNibbleWithLimit(lw232Message[LW232_OFFSET_STD_PKT_LEN], LW232_FRAME_MAX_LENGTH + 1); for (; idx < lw232PacketLen; idx++) { lw232Buffer[idx] = HexHelper::parseFullByte(lw232Message[LW232_OFFSET_STD_PKT_DATA + idx * 2], lw232Message[LW232_OFFSET_STD_PKT_DATA + idx * 2 + 1]); } - if (CAN_OK != sendMsgBuf(lw232CanId, 0, 0, lw232PacketLen, lw232Buffer)) { + INT8U mcpErr = sendMsgBuf(lw232CanId, 0, 0, lw232PacketLen, lw232Buffer); + if (mcpErr != CAN_OK) { ret = LW232_ERR; - } - else if (lw232AutoPoll) { + } else if (lw232AutoPoll) { ret = LW232_OK_SMALL; - } + } } else { ret = LW232_ERR; @@ -225,7 +222,7 @@ INT8U Can232::parseAndRunCommand() { // Tiiiiiiiildd...[CR] Transmit an extended (29bit) CAN frame if (lw232CanChannelMode == LW232_STATUS_CAN_OPEN_NORMAL) { parseCanExtId(); - lw232PacketLen = HexHelper::parseNibbleWithLimit(lw232Message[LW232_OFFSET_EXT_PKT_LEN], LW232_FRAME_MAX_LENGTH); + lw232PacketLen = HexHelper::parseNibbleWithLimit(lw232Message[LW232_OFFSET_EXT_PKT_LEN], LW232_FRAME_MAX_LENGTH + 1); for (; idx < lw232PacketLen; idx++) { lw232Buffer[idx] = HexHelper::parseFullByte(lw232Message[LW232_OFFSET_EXT_PKT_DATA + idx * 2], lw232Message[LW232_OFFSET_EXT_PKT_DATA + idx * 2 + 1]); } @@ -233,6 +230,8 @@ INT8U Can232::parseAndRunCommand() { ret = LW232_ERR; } else if (lw232AutoPoll) { ret = LW232_OK_BIG; + } else { + ret = LW232_OK; } } break; @@ -240,7 +239,7 @@ INT8U Can232::parseAndRunCommand() { // riiil[CR] Transmit an standard RTR (11bit) CAN frame. if (lw232CanChannelMode == LW232_STATUS_CAN_OPEN_NORMAL) { parseCanStdId(); - lw232PacketLen = HexHelper::parseNibbleWithLimit(lw232Message[LW232_OFFSET_STD_PKT_LEN], LW232_FRAME_MAX_LENGTH); + lw232PacketLen = HexHelper::parseNibbleWithLimit(lw232Message[LW232_OFFSET_STD_PKT_LEN], LW232_FRAME_MAX_LENGTH + 1); if (CAN_OK != sendMsgBuf(lw232CanId, 0, 1, lw232PacketLen, lw232Buffer)) { ret = LW232_ERR; } @@ -256,7 +255,7 @@ INT8U Can232::parseAndRunCommand() { // Riiiiiiiil[CR] Transmit an extended RTR (29bit) CAN frame. if (lw232CanChannelMode == LW232_STATUS_CAN_OPEN_NORMAL) { parseCanExtId(); - lw232PacketLen = HexHelper::parseNibbleWithLimit(lw232Message[LW232_OFFSET_EXT_PKT_LEN], LW232_FRAME_MAX_LENGTH); + lw232PacketLen = HexHelper::parseNibbleWithLimit(lw232Message[LW232_OFFSET_EXT_PKT_LEN], LW232_FRAME_MAX_LENGTH + 1); if (CAN_OK != sendMsgBuf(lw232CanId, 1, 1, lw232PacketLen, lw232Buffer)) { ret = LW232_ERR; } diff --git a/can-232.h b/can-232.h index c482489..0b87db2 100644 --- a/can-232.h +++ b/can-232.h @@ -139,9 +139,13 @@ #define LW232_DEFAULT_BAUD_RATE 115200 +#define LW232_DEFAULT_CAN_RATE CAN_500KBPS +#define LW232_DEFAULT_CLOCK_FREQ MCP_16MHz + #define LW232_CAN_BAUD_NUM 0x0a #define LW232_UART_BAUD_NUM 0x07 + const INT32U lw232SerialBaudRates[] //PROGMEM = { 230400, 115200, 57600, 38400, 19200, 9600, 2400 }; @@ -151,16 +155,14 @@ const INT32U lw232CanBaudRates[] //PROGMEM class Can232 { public: - static void init(); - static void init(INT8U defaultCanSpeed); - static void init(INT8U defaultCanSpeed, const INT8U clock); + static void init(INT8U defaultCanSpeed = LW232_DEFAULT_CAN_RATE, const INT8U clock = LW232_DEFAULT_CLOCK_FREQ); static void setFilter(INT8U (*userFunc)(INT32U)); static void loop(); static void serialEvent(); private: static Can232* _instance; - static Can232* const& instance(); + static Can232* instance(); void initFunc(); void setFilterFunc(INT8U (*userFunc)(INT32U)); diff --git a/mcp_can.cpp b/mcp_can.cpp index 9231ee0..eaa7905 100644 --- a/mcp_can.cpp +++ b/mcp_can.cpp @@ -22,6 +22,8 @@ */ #include "mcp_can.h" +//#define DEBUG_MODE + #define spi_readwrite SPI.transfer #define spi_read() spi_readwrite(0x00) @@ -138,7 +140,6 @@ INT8U MCP_CAN::mcp2515_readStatus(void) INT8U MCP_CAN::mcp2515_setCANCTRL_Mode(const INT8U newmode) { INT8U i; - mcp2515_modifyRegister(MCP_CANCTRL, MODE_MASK, newmode); i = mcp2515_readRegister(MCP_CANCTRL); @@ -384,16 +385,16 @@ void MCP_CAN::mcp2515_initCANBuffers(void) INT32U ulMask = 0x00, ulFilt = 0x00; - //mcp2515_write_id(MCP_RXM0SIDH, ext, ulMask); /*Set both masks to 0 */ - //mcp2515_write_id(MCP_RXM1SIDH, ext, ulMask); /*Mask register ignores ext bit */ - - /* Set all filters to 0 */ - //mcp2515_write_id(MCP_RXF0SIDH, ext, ulFilt); /* RXB0: extended */ - //mcp2515_write_id(MCP_RXF1SIDH, std, ulFilt); /* RXB1: standard */ - //mcp2515_write_id(MCP_RXF2SIDH, ext, ulFilt); /* RXB2: extended */ - //mcp2515_write_id(MCP_RXF3SIDH, std, ulFilt); /* RXB3: standard */ - //mcp2515_write_id(MCP_RXF4SIDH, ext, ulFilt); - //mcp2515_write_id(MCP_RXF5SIDH, std, ulFilt); +// mcp2515_write_id(MCP_RXM0SIDH, ext, ulMask); /*Set both masks to 0 */ +// mcp2515_write_id(MCP_RXM1SIDH, ext, ulMask); /*Mask register ignores ext bit */ +// +// /* Set all filters to 0 */ +// mcp2515_write_id(MCP_RXF0SIDH, ext, ulFilt); /* RXB0: extended */ +// mcp2515_write_id(MCP_RXF1SIDH, std, ulFilt); /* RXB1: standard */ +// mcp2515_write_id(MCP_RXF2SIDH, ext, ulFilt); /* RXB2: extended */ +// mcp2515_write_id(MCP_RXF3SIDH, std, ulFilt); /* RXB3: standard */ +// mcp2515_write_id(MCP_RXF4SIDH, ext, ulFilt); +// mcp2515_write_id(MCP_RXF5SIDH, std, ulFilt); /* Clear, deactivate the three */ /* transmit buffers */ @@ -660,7 +661,7 @@ MCP_CAN::MCP_CAN(INT8U _CS) *********************************************************************************************************/ INT8U MCP_CAN::begin(INT8U speedset, const INT8U clockset) { - INT8U res; + INT8U res = MCP2515_OK; SPI.begin(); res = mcp2515_init(speedset, clockset);