mirror of
https://github.com/Seeed-Studio/Seeed_Arduino_CAN.git
synced 2026-09-14 18:42:56 +00:00
Minor rework; Bug fix for transmission of 8 bytes packets
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
+34
-35
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
+13
-12
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user