Skip to content

Commit b9aed7f

Browse files
authored
Merge pull request #19 from leres/master
Add MCP2515::setClkOut() to allow use of the CLKOUT prescaler
2 parents 5372600 + e19547d commit b9aed7f

File tree

2 files changed

+59
-5
lines changed

2 files changed

+59
-5
lines changed

mcp2515.cpp

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ MCP2515::ERROR MCP2515::setBitrate(const CAN_SPEED canSpeed, CAN_CLOCK canClock)
226226
cfg3 = MCP_8MHz_31k25BPS_CFG3;
227227
break;
228228

229-
case (CAN_33KBPS): // 33.33KBPS
229+
case (CAN_33KBPS): // 33.333KBPS
230230
cfg1 = MCP_8MHz_33k3BPS_CFG1;
231231
cfg2 = MCP_8MHz_33k3BPS_CFG2;
232232
cfg3 = MCP_8MHz_33k3BPS_CFG3;
@@ -313,7 +313,7 @@ MCP2515::ERROR MCP2515::setBitrate(const CAN_SPEED canSpeed, CAN_CLOCK canClock)
313313
cfg3 = MCP_16MHz_20kBPS_CFG3;
314314
break;
315315

316-
case (CAN_33KBPS): // 20Kbps
316+
case (CAN_33KBPS): // 33.333Kbps
317317
cfg1 = MCP_16MHz_33k3BPS_CFG1;
318318
cfg2 = MCP_16MHz_33k3BPS_CFG2;
319319
cfg3 = MCP_16MHz_33k3BPS_CFG3;
@@ -336,7 +336,7 @@ MCP2515::ERROR MCP2515::setBitrate(const CAN_SPEED canSpeed, CAN_CLOCK canClock)
336336
cfg3 = MCP_16MHz_80kBPS_CFG3;
337337
break;
338338

339-
case (CAN_83K3BPS): // 83.3333Kbps
339+
case (CAN_83K3BPS): // 83.333Kbps
340340
cfg1 = MCP_16MHz_83k3BPS_CFG1;
341341
cfg2 = MCP_16MHz_83k3BPS_CFG2;
342342
cfg3 = MCP_16MHz_83k3BPS_CFG3;
@@ -387,6 +387,12 @@ MCP2515::ERROR MCP2515::setBitrate(const CAN_SPEED canSpeed, CAN_CLOCK canClock)
387387
case (MCP_20MHZ):
388388
switch (canSpeed)
389389
{
390+
case (CAN_33KBPS): // 33.333Kbps
391+
cfg1 = MCP_20MHz_33k3BPS_CFG1;
392+
cfg2 = MCP_20MHz_33k3BPS_CFG2;
393+
cfg3 = MCP_20MHz_33k3BPS_CFG3;
394+
break;
395+
390396
case (CAN_40KBPS): // 40Kbps
391397
cfg1 = MCP_20MHz_40kBPS_CFG1;
392398
cfg2 = MCP_20MHz_40kBPS_CFG2;
@@ -405,6 +411,12 @@ MCP2515::ERROR MCP2515::setBitrate(const CAN_SPEED canSpeed, CAN_CLOCK canClock)
405411
cfg3 = MCP_20MHz_80kBPS_CFG3;
406412
break;
407413

414+
case (CAN_83K3BPS): // 83.333Kbps
415+
cfg1 = MCP_20MHz_83k3BPS_CFG1;
416+
cfg2 = MCP_20MHz_83k3BPS_CFG2;
417+
cfg3 = MCP_20MHz_83k3BPS_CFG3;
418+
break;
419+
408420
case (CAN_100KBPS): // 100Kbps
409421
cfg1 = MCP_20MHz_100kBPS_CFG1;
410422
cfg2 = MCP_20MHz_100kBPS_CFG2;
@@ -452,7 +464,6 @@ MCP2515::ERROR MCP2515::setBitrate(const CAN_SPEED canSpeed, CAN_CLOCK canClock)
452464
break;
453465
}
454466

455-
456467
if (set) {
457468
setRegister(MCP_CNF1, cfg1);
458469
setRegister(MCP_CNF2, cfg2);
@@ -464,6 +475,31 @@ MCP2515::ERROR MCP2515::setBitrate(const CAN_SPEED canSpeed, CAN_CLOCK canClock)
464475
}
465476
}
466477

478+
MCP2515::ERROR MCP2515::setClkOut(const CAN_CLKOUT divisor)
479+
{
480+
ERROR res;
481+
uint8_t cfg3;
482+
483+
if (divisor == CLKOUT_DISABLE) {
484+
/* Turn off CLKEN */
485+
modifyRegister(MCP_CANCTRL, CANCTRL_CLKEN, 0x00);
486+
487+
/* Turn on CLKOUT for SOF */
488+
modifyRegister(MCP_CNF3, CNF3_SOF, CNF3_SOF);
489+
return ERROR_OK;
490+
}
491+
492+
/* Set the prescaler (CLKPRE) */
493+
modifyRegister(MCP_CANCTRL, CANCTRL_CLKPRE, divisor);
494+
495+
/* Turn on CLKEN */
496+
modifyRegister(MCP_CANCTRL, CANCTRL_CLKEN, CANCTRL_CLKEN);
497+
498+
/* Turn off CLKOUT for SOF */
499+
modifyRegister(MCP_CNF3, CNF3_SOF, 0x00);
500+
return ERROR_OK;
501+
}
502+
467503
void MCP2515::prepareId(uint8_t *buffer, const bool ext, const uint32_t id)
468504
{
469505
uint16_t canid = (uint16_t)(id & 0x0FFFF);

mcp2515.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@
149149
#define MCP_20MHz_100kBPS_CFG2 (0xFA)
150150
#define MCP_20MHz_100kBPS_CFG3 (0x87)
151151

152+
#define MCP_20MHz_83k3BPS_CFG1 (0x04)
153+
#define MCP_20MHz_83k3BPS_CFG2 (0xFE)
154+
#define MCP_20MHz_83k3BPS_CFG3 (0x87)
155+
152156
#define MCP_20MHz_80kBPS_CFG1 (0x04)
153157
#define MCP_20MHz_80kBPS_CFG2 (0xFF)
154158
#define MCP_20MHz_80kBPS_CFG3 (0x87)
@@ -161,6 +165,10 @@
161165
#define MCP_20MHz_40kBPS_CFG2 (0xFF)
162166
#define MCP_20MHz_40kBPS_CFG3 (0x87)
163167

168+
#define MCP_20MHz_33k3BPS_CFG1 (0x0B)
169+
#define MCP_20MHz_33k3BPS_CFG2 (0xFF)
170+
#define MCP_20MHz_33k3BPS_CFG3 (0x87)
171+
164172
enum CAN_CLOCK {
165173
MCP_20MHZ,
166174
MCP_16MHZ,
@@ -186,6 +194,14 @@ enum CAN_SPEED {
186194
CAN_1000KBPS
187195
};
188196

197+
enum CAN_CLKOUT {
198+
CLKOUT_DISABLE = -1,
199+
CLKOUT_DIV1 = 0x0,
200+
CLKOUT_DIV2 = 0x1,
201+
CLKOUT_DIV4 = 0x2,
202+
CLKOUT_DIV8 = 0x3,
203+
};
204+
189205
class MCP2515
190206
{
191207
public:
@@ -264,6 +280,8 @@ class MCP2515
264280
static const uint8_t CANSTAT_OPMOD = 0xE0;
265281
static const uint8_t CANSTAT_ICOD = 0x0E;
266282

283+
static const uint8_t CNF3_SOF = 0x80;
284+
267285
static const uint8_t TXB_EXIDE_MASK = 0x08;
268286
static const uint8_t DLC_MASK = 0x0F;
269287
static const uint8_t RTR_MASK = 0x40;
@@ -298,7 +316,6 @@ class MCP2515
298316
TXB_TXP = 0x03
299317
};
300318

301-
302319
static const uint8_t EFLG_ERRORMASK = EFLG_RX1OVR
303320
| EFLG_RX0OVR
304321
| EFLG_TXBO
@@ -446,6 +463,7 @@ class MCP2515
446463
ERROR setSleepMode();
447464
ERROR setLoopbackMode();
448465
ERROR setNormalMode();
466+
ERROR setClkOut(const CAN_CLKOUT divisor);
449467
ERROR setBitrate(const CAN_SPEED canSpeed);
450468
ERROR setBitrate(const CAN_SPEED canSpeed, const CAN_CLOCK canClock);
451469
ERROR setFilterMask(const MASK num, const bool ext, const uint32_t ulData);

0 commit comments

Comments
 (0)