diff --git a/README.md b/README.md
index 31041cb..f8fbbb2 100644
--- a/README.md
+++ b/README.md
@@ -64,6 +64,23 @@ mcp2515.setLoopbackMode();
```
+
+You can also set oscillator frequency for module when setting bitrate:
+```C++
+mcp2515.setBitrate(CAN_125KBPS, MCP_8MHZ);
+```
+
+The available clock speeds are listed as follows:
+```C++
+enum CAN_CLOCK {
+ MCP_20MHZ,
+ MCP_16MHZ,
+ MCP_8MHZ
+};
+```
+Default value is MCP_16MHZ
+
+
Note: To transfer data on high speed of CAN interface via UART dont forget to update UART baudrate as necessary.
##2. Frame data format
diff --git a/mcp2515.cpp b/mcp2515.cpp
index 5285045..efa7c79 100644
--- a/mcp2515.cpp
+++ b/mcp2515.cpp
@@ -184,6 +184,11 @@ MCP2515::ERROR MCP2515::setMode(const CANCTRL_REQOP_MODE mode)
}
MCP2515::ERROR MCP2515::setBitrate(const CAN_SPEED canSpeed)
+{
+ return setBitrate(canSpeed, MCP_16MHZ);
+}
+
+MCP2515::ERROR MCP2515::setBitrate(const CAN_SPEED canSpeed, CAN_CLOCK canClock)
{
ERROR error = setConfigMode();
if (error != ERROR_OK) {
@@ -192,109 +197,256 @@ MCP2515::ERROR MCP2515::setBitrate(const CAN_SPEED canSpeed)
uint8_t set, cfg1, cfg2, cfg3;
set = 1;
- switch (canSpeed)
+ switch (canClock)
{
- case (CAN_5KBPS):
- cfg1 = MCP_16MHz_5kBPS_CFG1;
- cfg2 = MCP_16MHz_5kBPS_CFG2;
- cfg3 = MCP_16MHz_5kBPS_CFG3;
- break;
+ case (MCP_8MHZ):
+ switch (canSpeed)
+ {
+ case (CAN_5KBPS): // 5KBPS
+ cfg1 = MCP_8MHz_5kBPS_CFG1;
+ cfg2 = MCP_8MHz_5kBPS_CFG2;
+ cfg3 = MCP_8MHz_5kBPS_CFG3;
+ break;
- case (CAN_10KBPS):
- cfg1 = MCP_16MHz_10kBPS_CFG1;
- cfg2 = MCP_16MHz_10kBPS_CFG2;
- cfg3 = MCP_16MHz_10kBPS_CFG3;
- break;
+ case (CAN_10KBPS): // 10KBPS
+ cfg1 = MCP_8MHz_10kBPS_CFG1;
+ cfg2 = MCP_8MHz_10kBPS_CFG2;
+ cfg3 = MCP_8MHz_10kBPS_CFG3;
+ break;
- case (CAN_20KBPS):
- cfg1 = MCP_16MHz_20kBPS_CFG1;
- cfg2 = MCP_16MHz_20kBPS_CFG2;
- cfg3 = MCP_16MHz_20kBPS_CFG3;
- break;
-
- case (CAN_31K25BPS):
- cfg1 = MCP_16MHz_31k25BPS_CFG1;
- cfg2 = MCP_16MHz_31k25BPS_CFG2;
- cfg3 = MCP_16MHz_31k25BPS_CFG3;
- break;
+ case (CAN_20KBPS): // 20KBPS
+ cfg1 = MCP_8MHz_20kBPS_CFG1;
+ cfg2 = MCP_8MHz_20kBPS_CFG2;
+ cfg3 = MCP_8MHz_20kBPS_CFG3;
+ break;
- case (CAN_33KBPS):
- cfg1 = MCP_16MHz_33kBPS_CFG1;
- cfg2 = MCP_16MHz_33kBPS_CFG2;
- cfg3 = MCP_16MHz_33kBPS_CFG3;
- break;
+ case (CAN_31K25BPS): // 31.25KBPS
+ cfg1 = MCP_8MHz_31k25BPS_CFG1;
+ cfg2 = MCP_8MHz_31k25BPS_CFG2;
+ cfg3 = MCP_8MHz_31k25BPS_CFG3;
+ break;
- case (CAN_40KBPS):
- cfg1 = MCP_16MHz_40kBPS_CFG1;
- cfg2 = MCP_16MHz_40kBPS_CFG2;
- cfg3 = MCP_16MHz_40kBPS_CFG3;
- break;
+ case (CAN_33KBPS): // 33.33KBPS
+ cfg1 = MCP_8MHz_33k3BPS_CFG1;
+ cfg2 = MCP_8MHz_33k3BPS_CFG2;
+ cfg3 = MCP_8MHz_33k3BPS_CFG3;
+ break;
- case (CAN_50KBPS):
- cfg1 = MCP_16MHz_50kBPS_CFG1;
- cfg2 = MCP_16MHz_50kBPS_CFG2;
- cfg3 = MCP_16MHz_50kBPS_CFG3;
- break;
+ case (CAN_40KBPS): // 40Kbps
+ cfg1 = MCP_8MHz_40kBPS_CFG1;
+ cfg2 = MCP_8MHz_40kBPS_CFG2;
+ cfg3 = MCP_8MHz_40kBPS_CFG3;
+ break;
- case (CAN_80KBPS):
- cfg1 = MCP_16MHz_80kBPS_CFG1;
- cfg2 = MCP_16MHz_80kBPS_CFG2;
- cfg3 = MCP_16MHz_80kBPS_CFG3;
- break;
+ case (CAN_50KBPS): // 50Kbps
+ cfg1 = MCP_8MHz_50kBPS_CFG1;
+ cfg2 = MCP_8MHz_50kBPS_CFG2;
+ cfg3 = MCP_8MHz_50kBPS_CFG3;
+ break;
- case (CAN_83K3BPS):
- cfg1 = MCP_16MHz_83k3BPS_CFG1;
- cfg2 = MCP_16MHz_83k3BPS_CFG2;
- cfg3 = MCP_16MHz_83k3BPS_CFG3;
- break;
+ case (CAN_80KBPS): // 80Kbps
+ cfg1 = MCP_8MHz_80kBPS_CFG1;
+ cfg2 = MCP_8MHz_80kBPS_CFG2;
+ cfg3 = MCP_8MHz_80kBPS_CFG3;
+ break;
- case (CAN_95KBPS):
- cfg1 = MCP_16MHz_95kBPS_CFG1;
- cfg2 = MCP_16MHz_95kBPS_CFG2;
- cfg3 = MCP_16MHz_95kBPS_CFG3;
- break;
+ case (CAN_100KBPS): // 100Kbps
+ cfg1 = MCP_8MHz_100kBPS_CFG1;
+ cfg2 = MCP_8MHz_100kBPS_CFG2;
+ cfg3 = MCP_8MHz_100kBPS_CFG3;
+ break;
- case (CAN_100KBPS):
- cfg1 = MCP_16MHz_100kBPS_CFG1;
- cfg2 = MCP_16MHz_100kBPS_CFG2;
- cfg3 = MCP_16MHz_100kBPS_CFG3;
- break;
+ case (CAN_125KBPS): // 125Kbps
+ cfg1 = MCP_8MHz_125kBPS_CFG1;
+ cfg2 = MCP_8MHz_125kBPS_CFG2;
+ cfg3 = MCP_8MHz_125kBPS_CFG3;
+ break;
- case (CAN_125KBPS):
- cfg1 = MCP_16MHz_125kBPS_CFG1;
- cfg2 = MCP_16MHz_125kBPS_CFG2;
- cfg3 = MCP_16MHz_125kBPS_CFG3;
- break;
+ case (CAN_200KBPS): // 200Kbps
+ cfg1 = MCP_8MHz_200kBPS_CFG1;
+ cfg2 = MCP_8MHz_200kBPS_CFG2;
+ cfg3 = MCP_8MHz_200kBPS_CFG3;
+ break;
+
+ case (CAN_250KBPS): // 250Kbps
+ cfg1 = MCP_8MHz_250kBPS_CFG1;
+ cfg2 = MCP_8MHz_250kBPS_CFG2;
+ cfg3 = MCP_8MHz_250kBPS_CFG3;
+ break;
+
+ case (CAN_500KBPS): // 500Kbps
+ cfg1 = MCP_8MHz_500kBPS_CFG1;
+ cfg2 = MCP_8MHz_500kBPS_CFG2;
+ cfg3 = MCP_8MHz_500kBPS_CFG3;
+ break;
+
+ case (CAN_1000KBPS): // 1Mbps
+ cfg1 = MCP_8MHz_1000kBPS_CFG1;
+ cfg2 = MCP_8MHz_1000kBPS_CFG2;
+ cfg3 = MCP_8MHz_1000kBPS_CFG3;
+ break;
- case (CAN_200KBPS):
- cfg1 = MCP_16MHz_200kBPS_CFG1;
- cfg2 = MCP_16MHz_200kBPS_CFG2;
- cfg3 = MCP_16MHz_200kBPS_CFG3;
+ default:
+ set = 0;
+ break;
+ }
break;
- case (CAN_250KBPS):
- cfg1 = MCP_16MHz_250kBPS_CFG1;
- cfg2 = MCP_16MHz_250kBPS_CFG2;
- cfg3 = MCP_16MHz_250kBPS_CFG3;
+ case (MCP_16MHZ):
+ switch (canSpeed)
+ {
+ case (CAN_5KBPS): // 5Kbps
+ cfg1 = MCP_16MHz_5kBPS_CFG1;
+ cfg2 = MCP_16MHz_5kBPS_CFG2;
+ cfg3 = MCP_16MHz_5kBPS_CFG3;
+ break;
+
+ case (CAN_10KBPS): // 10Kbps
+ cfg1 = MCP_16MHz_10kBPS_CFG1;
+ cfg2 = MCP_16MHz_10kBPS_CFG2;
+ cfg3 = MCP_16MHz_10kBPS_CFG3;
+ break;
+
+ case (CAN_20KBPS): // 20Kbps
+ cfg1 = MCP_16MHz_20kBPS_CFG1;
+ cfg2 = MCP_16MHz_20kBPS_CFG2;
+ cfg3 = MCP_16MHz_20kBPS_CFG3;
+ break;
+
+ case (CAN_33KBPS): // 20Kbps
+ cfg1 = MCP_16MHz_33k3BPS_CFG1;
+ cfg2 = MCP_16MHz_33k3BPS_CFG2;
+ cfg3 = MCP_16MHz_33k3BPS_CFG3;
+ break;
+
+ case (CAN_40KBPS): // 40Kbps
+ cfg1 = MCP_16MHz_40kBPS_CFG1;
+ cfg2 = MCP_16MHz_40kBPS_CFG2;
+ cfg3 = MCP_16MHz_40kBPS_CFG3;
+ break;
+
+ case (CAN_50KBPS): // 50Kbps
+ cfg2 = MCP_16MHz_50kBPS_CFG2;
+ cfg3 = MCP_16MHz_50kBPS_CFG3;
+ break;
+
+ case (CAN_80KBPS): // 80Kbps
+ cfg1 = MCP_16MHz_80kBPS_CFG1;
+ cfg2 = MCP_16MHz_80kBPS_CFG2;
+ cfg3 = MCP_16MHz_80kBPS_CFG3;
+ break;
+
+ case (CAN_100KBPS): // 100Kbps
+ cfg1 = MCP_16MHz_100kBPS_CFG1;
+ cfg2 = MCP_16MHz_100kBPS_CFG2;
+ cfg3 = MCP_16MHz_100kBPS_CFG3;
+ break;
+
+ case (CAN_125KBPS): // 125Kbps
+ cfg1 = MCP_16MHz_125kBPS_CFG1;
+ cfg2 = MCP_16MHz_125kBPS_CFG2;
+ cfg3 = MCP_16MHz_125kBPS_CFG3;
+ break;
+
+ case (CAN_200KBPS): // 200Kbps
+ cfg1 = MCP_16MHz_200kBPS_CFG1;
+ cfg2 = MCP_16MHz_200kBPS_CFG2;
+ cfg3 = MCP_16MHz_200kBPS_CFG3;
+ break;
+
+ case (CAN_250KBPS): // 250Kbps
+ cfg1 = MCP_16MHz_250kBPS_CFG1;
+ cfg2 = MCP_16MHz_250kBPS_CFG2;
+ cfg3 = MCP_16MHz_250kBPS_CFG3;
+ break;
+
+ case (CAN_500KBPS): // 500Kbps
+ cfg1 = MCP_16MHz_500kBPS_CFG1;
+ cfg2 = MCP_16MHz_500kBPS_CFG2;
+ cfg3 = MCP_16MHz_500kBPS_CFG3;
+ break;
+
+ case (CAN_1000KBPS): // 1Mbps
+ cfg1 = MCP_16MHz_1000kBPS_CFG1;
+ cfg2 = MCP_16MHz_1000kBPS_CFG2;
+ cfg3 = MCP_16MHz_1000kBPS_CFG3;
+ break;
+
+ default:
+ set = 0;
+ break;
+ }
break;
- case (CAN_500KBPS):
- cfg1 = MCP_16MHz_500kBPS_CFG1;
- cfg2 = MCP_16MHz_500kBPS_CFG2;
- cfg3 = MCP_16MHz_500kBPS_CFG3;
+ case (MCP_20MHZ):
+ switch (canSpeed)
+ {
+ case (CAN_40KBPS): // 40Kbps
+ cfg1 = MCP_20MHz_40kBPS_CFG1;
+ cfg2 = MCP_20MHz_40kBPS_CFG2;
+ cfg3 = MCP_20MHz_40kBPS_CFG3;
+ break;
+
+ case (CAN_50KBPS): // 50Kbps
+ cfg1 = MCP_20MHz_50kBPS_CFG1;
+ cfg2 = MCP_20MHz_50kBPS_CFG2;
+ cfg3 = MCP_20MHz_50kBPS_CFG3;
+ break;
+
+ case (CAN_80KBPS): // 80Kbps
+ cfg1 = MCP_20MHz_80kBPS_CFG1;
+ cfg2 = MCP_20MHz_80kBPS_CFG2;
+ cfg3 = MCP_20MHz_80kBPS_CFG3;
+ break;
+
+ case (CAN_100KBPS): // 100Kbps
+ cfg1 = MCP_20MHz_100kBPS_CFG1;
+ cfg2 = MCP_20MHz_100kBPS_CFG2;
+ cfg3 = MCP_20MHz_100kBPS_CFG3;
+ break;
+
+ case (CAN_125KBPS): // 125Kbps
+ cfg1 = MCP_20MHz_125kBPS_CFG1;
+ cfg2 = MCP_20MHz_125kBPS_CFG2;
+ cfg3 = MCP_20MHz_125kBPS_CFG3;
+ break;
+
+ case (CAN_200KBPS): // 200Kbps
+ cfg1 = MCP_20MHz_200kBPS_CFG1;
+ cfg2 = MCP_20MHz_200kBPS_CFG2;
+ cfg3 = MCP_20MHz_200kBPS_CFG3;
+ break;
+
+ case (CAN_250KBPS): // 250Kbps
+ cfg1 = MCP_20MHz_250kBPS_CFG1;
+ cfg2 = MCP_20MHz_250kBPS_CFG2;
+ cfg3 = MCP_20MHz_250kBPS_CFG3;
+ break;
+
+ case (CAN_500KBPS): // 500Kbps
+ cfg1 = MCP_20MHz_500kBPS_CFG1;
+ cfg2 = MCP_20MHz_500kBPS_CFG2;
+ cfg3 = MCP_20MHz_500kBPS_CFG3;
+ break;
+
+ case (CAN_1000KBPS): // 1Mbps
+ cfg1 = MCP_20MHz_1000kBPS_CFG1;
+ cfg2 = MCP_20MHz_1000kBPS_CFG2;
+ cfg3 = MCP_20MHz_1000kBPS_CFG3;
+ break;
+
+ default:
+ set = 0;
+ break;
+ }
break;
-
- case (CAN_1000KBPS):
- cfg1 = MCP_16MHz_1000kBPS_CFG1;
- cfg2 = MCP_16MHz_1000kBPS_CFG2;
- cfg3 = MCP_16MHz_1000kBPS_CFG3;
- break;
default:
set = 0;
break;
}
+
if (set) {
setRegister(MCP_CNF1, cfg1);
setRegister(MCP_CNF2, cfg2);
diff --git a/mcp2515.h b/mcp2515.h
index 3fc04fa..a73d150 100644
--- a/mcp2515.h
+++ b/mcp2515.h
@@ -4,6 +4,65 @@
#include
#include "can.h"
+/*
+ * Speed 8M
+ */
+#define MCP_8MHz_1000kBPS_CFG1 (0x00)
+#define MCP_8MHz_1000kBPS_CFG2 (0x80)
+#define MCP_8MHz_1000kBPS_CFG3 (0x80)
+
+#define MCP_8MHz_500kBPS_CFG1 (0x00)
+#define MCP_8MHz_500kBPS_CFG2 (0x90)
+#define MCP_8MHz_500kBPS_CFG3 (0x82)
+
+#define MCP_8MHz_250kBPS_CFG1 (0x00)
+#define MCP_8MHz_250kBPS_CFG2 (0xB1)
+#define MCP_8MHz_250kBPS_CFG3 (0x85)
+
+#define MCP_8MHz_200kBPS_CFG1 (0x00)
+#define MCP_8MHz_200kBPS_CFG2 (0xB4)
+#define MCP_8MHz_200kBPS_CFG3 (0x86)
+
+#define MCP_8MHz_125kBPS_CFG1 (0x01)
+#define MCP_8MHz_125kBPS_CFG2 (0xB1)
+#define MCP_8MHz_125kBPS_CFG3 (0x85)
+
+#define MCP_8MHz_100kBPS_CFG1 (0x01)
+#define MCP_8MHz_100kBPS_CFG2 (0xB4)
+#define MCP_8MHz_100kBPS_CFG3 (0x86)
+
+#define MCP_8MHz_80kBPS_CFG1 (0x01)
+#define MCP_8MHz_80kBPS_CFG2 (0xBF)
+#define MCP_8MHz_80kBPS_CFG3 (0x87)
+
+#define MCP_8MHz_50kBPS_CFG1 (0x03)
+#define MCP_8MHz_50kBPS_CFG2 (0xB4)
+#define MCP_8MHz_50kBPS_CFG3 (0x86)
+
+#define MCP_8MHz_40kBPS_CFG1 (0x03)
+#define MCP_8MHz_40kBPS_CFG2 (0xBF)
+#define MCP_8MHz_40kBPS_CFG3 (0x87)
+
+#define MCP_8MHz_33k3BPS_CFG1 (0x47)
+#define MCP_8MHz_33k3BPS_CFG2 (0xE2)
+#define MCP_8MHz_33k3BPS_CFG3 (0x85)
+
+#define MCP_8MHz_31k25BPS_CFG1 (0x07)
+#define MCP_8MHz_31k25BPS_CFG2 (0xA4)
+#define MCP_8MHz_31k25BPS_CFG3 (0x84)
+
+#define MCP_8MHz_20kBPS_CFG1 (0x07)
+#define MCP_8MHz_20kBPS_CFG2 (0xBF)
+#define MCP_8MHz_20kBPS_CFG3 (0x87)
+
+#define MCP_8MHz_10kBPS_CFG1 (0x0F)
+#define MCP_8MHz_10kBPS_CFG2 (0xBF)
+#define MCP_8MHz_10kBPS_CFG3 (0x87)
+
+#define MCP_8MHz_5kBPS_CFG1 (0x1F)
+#define MCP_8MHz_5kBPS_CFG2 (0xBF)
+#define MCP_8MHz_5kBPS_CFG3 (0x87)
+
/*
* speed 16M
*/
@@ -31,20 +90,6 @@
#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)
@@ -57,13 +102,9 @@
#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_33k3BPS_CFG1 (0x4E)
+#define MCP_16MHz_33k3BPS_CFG2 (0xF1)
+#define MCP_16MHz_33k3BPS_CFG3 (0x85)
#define MCP_16MHz_20kBPS_CFG1 (0x0F)
#define MCP_16MHz_20kBPS_CFG2 (0xFF)
@@ -77,6 +118,51 @@
#define MCP_16MHz_5kBPS_CFG2 (0xFF)
#define MCP_16MHz_5kBPS_CFG3 (0x87)
+/*
+ * speed 20M
+ */
+#define MCP_20MHz_1000kBPS_CFG1 (0x00)
+#define MCP_20MHz_1000kBPS_CFG2 (0xD9)
+#define MCP_20MHz_1000kBPS_CFG3 (0x82)
+
+#define MCP_20MHz_500kBPS_CFG1 (0x00)
+#define MCP_20MHz_500kBPS_CFG2 (0xFA)
+#define MCP_20MHz_500kBPS_CFG3 (0x87)
+
+#define MCP_20MHz_250kBPS_CFG1 (0x41)
+#define MCP_20MHz_250kBPS_CFG2 (0xFB)
+#define MCP_20MHz_250kBPS_CFG3 (0x86)
+
+#define MCP_20MHz_200kBPS_CFG1 (0x01)
+#define MCP_20MHz_200kBPS_CFG2 (0xFF)
+#define MCP_20MHz_200kBPS_CFG3 (0x87)
+
+#define MCP_20MHz_125kBPS_CFG1 (0x03)
+#define MCP_20MHz_125kBPS_CFG2 (0xFA)
+#define MCP_20MHz_125kBPS_CFG3 (0x87)
+
+#define MCP_20MHz_100kBPS_CFG1 (0x04)
+#define MCP_20MHz_100kBPS_CFG2 (0xFA)
+#define MCP_20MHz_100kBPS_CFG3 (0x87)
+
+#define MCP_20MHz_80kBPS_CFG1 (0x04)
+#define MCP_20MHz_80kBPS_CFG2 (0xFF)
+#define MCP_20MHz_80kBPS_CFG3 (0x87)
+
+#define MCP_20MHz_50kBPS_CFG1 (0x09)
+#define MCP_20MHz_50kBPS_CFG2 (0xFA)
+#define MCP_20MHz_50kBPS_CFG3 (0x87)
+
+#define MCP_20MHz_40kBPS_CFG1 (0x09)
+#define MCP_20MHz_40kBPS_CFG2 (0xFF)
+#define MCP_20MHz_40kBPS_CFG3 (0x87)
+
+enum CAN_CLOCK {
+ MCP_20MHZ,
+ MCP_16MHZ,
+ MCP_8MHZ
+};
+
enum CAN_SPEED {
CAN_5KBPS,
CAN_10KBPS,
@@ -356,6 +442,7 @@ class MCP2515
ERROR setLoopbackMode();
ERROR setNormalMode();
ERROR setBitrate(const CAN_SPEED canSpeed);
+ ERROR setBitrate(const CAN_SPEED canSpeed, const CAN_CLOCK canClock);
ERROR setFilterMask(const MASK num, const bool ext, const uint32_t ulData);
ERROR setFilter(const RXF num, const bool ext, const uint32_t ulData);
ERROR sendMessage(const TXBn txbn, const struct can_frame *frame);