Skip to content

Commit 7d28c94

Browse files
authored
Merge pull request #1 from orenergy/MCP_8MHZ
Allow to set crystall clock other than 16MHZ
2 parents fd638a1 + 668977b commit 7d28c94

File tree

3 files changed

+357
-101
lines changed

3 files changed

+357
-101
lines changed

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,23 @@ mcp2515.setLoopbackMode();
6464
```
6565
<br>
6666
67+
<br>
68+
You can also set oscillator frequency for module when setting bitrate:
69+
```C++
70+
mcp2515.setBitrate(CAN_125KBPS, MCP_8MHZ);
71+
```
72+
<br>
73+
The available clock speeds are listed as follows:
74+
```C++
75+
enum CAN_CLOCK {
76+
MCP_20MHZ,
77+
MCP_16MHZ,
78+
MCP_8MHZ
79+
};
80+
```
81+
Default value is MCP_16MHZ
82+
<br>
83+
6784
Note: To transfer data on high speed of CAN interface via UART dont forget to update UART baudrate as necessary.
6885

6986
##2. Frame data format

mcp2515.cpp

Lines changed: 232 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,11 @@ MCP2515::ERROR MCP2515::setMode(const CANCTRL_REQOP_MODE mode)
184184
}
185185

186186
MCP2515::ERROR MCP2515::setBitrate(const CAN_SPEED canSpeed)
187+
{
188+
return setBitrate(canSpeed, MCP_16MHZ);
189+
}
190+
191+
MCP2515::ERROR MCP2515::setBitrate(const CAN_SPEED canSpeed, CAN_CLOCK canClock)
187192
{
188193
ERROR error = setConfigMode();
189194
if (error != ERROR_OK) {
@@ -192,109 +197,256 @@ MCP2515::ERROR MCP2515::setBitrate(const CAN_SPEED canSpeed)
192197

193198
uint8_t set, cfg1, cfg2, cfg3;
194199
set = 1;
195-
switch (canSpeed)
200+
switch (canClock)
196201
{
197-
case (CAN_5KBPS):
198-
cfg1 = MCP_16MHz_5kBPS_CFG1;
199-
cfg2 = MCP_16MHz_5kBPS_CFG2;
200-
cfg3 = MCP_16MHz_5kBPS_CFG3;
201-
break;
202+
case (MCP_8MHZ):
203+
switch (canSpeed)
204+
{
205+
case (CAN_5KBPS): // 5KBPS
206+
cfg1 = MCP_8MHz_5kBPS_CFG1;
207+
cfg2 = MCP_8MHz_5kBPS_CFG2;
208+
cfg3 = MCP_8MHz_5kBPS_CFG3;
209+
break;
202210

203-
case (CAN_10KBPS):
204-
cfg1 = MCP_16MHz_10kBPS_CFG1;
205-
cfg2 = MCP_16MHz_10kBPS_CFG2;
206-
cfg3 = MCP_16MHz_10kBPS_CFG3;
207-
break;
211+
case (CAN_10KBPS): // 10KBPS
212+
cfg1 = MCP_8MHz_10kBPS_CFG1;
213+
cfg2 = MCP_8MHz_10kBPS_CFG2;
214+
cfg3 = MCP_8MHz_10kBPS_CFG3;
215+
break;
208216

209-
case (CAN_20KBPS):
210-
cfg1 = MCP_16MHz_20kBPS_CFG1;
211-
cfg2 = MCP_16MHz_20kBPS_CFG2;
212-
cfg3 = MCP_16MHz_20kBPS_CFG3;
213-
break;
214-
215-
case (CAN_31K25BPS):
216-
cfg1 = MCP_16MHz_31k25BPS_CFG1;
217-
cfg2 = MCP_16MHz_31k25BPS_CFG2;
218-
cfg3 = MCP_16MHz_31k25BPS_CFG3;
219-
break;
217+
case (CAN_20KBPS): // 20KBPS
218+
cfg1 = MCP_8MHz_20kBPS_CFG1;
219+
cfg2 = MCP_8MHz_20kBPS_CFG2;
220+
cfg3 = MCP_8MHz_20kBPS_CFG3;
221+
break;
220222

221-
case (CAN_33KBPS):
222-
cfg1 = MCP_16MHz_33kBPS_CFG1;
223-
cfg2 = MCP_16MHz_33kBPS_CFG2;
224-
cfg3 = MCP_16MHz_33kBPS_CFG3;
225-
break;
223+
case (CAN_31K25BPS): // 31.25KBPS
224+
cfg1 = MCP_8MHz_31k25BPS_CFG1;
225+
cfg2 = MCP_8MHz_31k25BPS_CFG2;
226+
cfg3 = MCP_8MHz_31k25BPS_CFG3;
227+
break;
226228

227-
case (CAN_40KBPS):
228-
cfg1 = MCP_16MHz_40kBPS_CFG1;
229-
cfg2 = MCP_16MHz_40kBPS_CFG2;
230-
cfg3 = MCP_16MHz_40kBPS_CFG3;
231-
break;
229+
case (CAN_33KBPS): // 33.33KBPS
230+
cfg1 = MCP_8MHz_33k3BPS_CFG1;
231+
cfg2 = MCP_8MHz_33k3BPS_CFG2;
232+
cfg3 = MCP_8MHz_33k3BPS_CFG3;
233+
break;
232234

233-
case (CAN_50KBPS):
234-
cfg1 = MCP_16MHz_50kBPS_CFG1;
235-
cfg2 = MCP_16MHz_50kBPS_CFG2;
236-
cfg3 = MCP_16MHz_50kBPS_CFG3;
237-
break;
235+
case (CAN_40KBPS): // 40Kbps
236+
cfg1 = MCP_8MHz_40kBPS_CFG1;
237+
cfg2 = MCP_8MHz_40kBPS_CFG2;
238+
cfg3 = MCP_8MHz_40kBPS_CFG3;
239+
break;
238240

239-
case (CAN_80KBPS):
240-
cfg1 = MCP_16MHz_80kBPS_CFG1;
241-
cfg2 = MCP_16MHz_80kBPS_CFG2;
242-
cfg3 = MCP_16MHz_80kBPS_CFG3;
243-
break;
241+
case (CAN_50KBPS): // 50Kbps
242+
cfg1 = MCP_8MHz_50kBPS_CFG1;
243+
cfg2 = MCP_8MHz_50kBPS_CFG2;
244+
cfg3 = MCP_8MHz_50kBPS_CFG3;
245+
break;
244246

245-
case (CAN_83K3BPS):
246-
cfg1 = MCP_16MHz_83k3BPS_CFG1;
247-
cfg2 = MCP_16MHz_83k3BPS_CFG2;
248-
cfg3 = MCP_16MHz_83k3BPS_CFG3;
249-
break;
247+
case (CAN_80KBPS): // 80Kbps
248+
cfg1 = MCP_8MHz_80kBPS_CFG1;
249+
cfg2 = MCP_8MHz_80kBPS_CFG2;
250+
cfg3 = MCP_8MHz_80kBPS_CFG3;
251+
break;
250252

251-
case (CAN_95KBPS):
252-
cfg1 = MCP_16MHz_95kBPS_CFG1;
253-
cfg2 = MCP_16MHz_95kBPS_CFG2;
254-
cfg3 = MCP_16MHz_95kBPS_CFG3;
255-
break;
253+
case (CAN_100KBPS): // 100Kbps
254+
cfg1 = MCP_8MHz_100kBPS_CFG1;
255+
cfg2 = MCP_8MHz_100kBPS_CFG2;
256+
cfg3 = MCP_8MHz_100kBPS_CFG3;
257+
break;
256258

257-
case (CAN_100KBPS):
258-
cfg1 = MCP_16MHz_100kBPS_CFG1;
259-
cfg2 = MCP_16MHz_100kBPS_CFG2;
260-
cfg3 = MCP_16MHz_100kBPS_CFG3;
261-
break;
259+
case (CAN_125KBPS): // 125Kbps
260+
cfg1 = MCP_8MHz_125kBPS_CFG1;
261+
cfg2 = MCP_8MHz_125kBPS_CFG2;
262+
cfg3 = MCP_8MHz_125kBPS_CFG3;
263+
break;
262264

263-
case (CAN_125KBPS):
264-
cfg1 = MCP_16MHz_125kBPS_CFG1;
265-
cfg2 = MCP_16MHz_125kBPS_CFG2;
266-
cfg3 = MCP_16MHz_125kBPS_CFG3;
267-
break;
265+
case (CAN_200KBPS): // 200Kbps
266+
cfg1 = MCP_8MHz_200kBPS_CFG1;
267+
cfg2 = MCP_8MHz_200kBPS_CFG2;
268+
cfg3 = MCP_8MHz_200kBPS_CFG3;
269+
break;
270+
271+
case (CAN_250KBPS): // 250Kbps
272+
cfg1 = MCP_8MHz_250kBPS_CFG1;
273+
cfg2 = MCP_8MHz_250kBPS_CFG2;
274+
cfg3 = MCP_8MHz_250kBPS_CFG3;
275+
break;
276+
277+
case (CAN_500KBPS): // 500Kbps
278+
cfg1 = MCP_8MHz_500kBPS_CFG1;
279+
cfg2 = MCP_8MHz_500kBPS_CFG2;
280+
cfg3 = MCP_8MHz_500kBPS_CFG3;
281+
break;
282+
283+
case (CAN_1000KBPS): // 1Mbps
284+
cfg1 = MCP_8MHz_1000kBPS_CFG1;
285+
cfg2 = MCP_8MHz_1000kBPS_CFG2;
286+
cfg3 = MCP_8MHz_1000kBPS_CFG3;
287+
break;
268288

269-
case (CAN_200KBPS):
270-
cfg1 = MCP_16MHz_200kBPS_CFG1;
271-
cfg2 = MCP_16MHz_200kBPS_CFG2;
272-
cfg3 = MCP_16MHz_200kBPS_CFG3;
289+
default:
290+
set = 0;
291+
break;
292+
}
273293
break;
274294

275-
case (CAN_250KBPS):
276-
cfg1 = MCP_16MHz_250kBPS_CFG1;
277-
cfg2 = MCP_16MHz_250kBPS_CFG2;
278-
cfg3 = MCP_16MHz_250kBPS_CFG3;
295+
case (MCP_16MHZ):
296+
switch (canSpeed)
297+
{
298+
case (CAN_5KBPS): // 5Kbps
299+
cfg1 = MCP_16MHz_5kBPS_CFG1;
300+
cfg2 = MCP_16MHz_5kBPS_CFG2;
301+
cfg3 = MCP_16MHz_5kBPS_CFG3;
302+
break;
303+
304+
case (CAN_10KBPS): // 10Kbps
305+
cfg1 = MCP_16MHz_10kBPS_CFG1;
306+
cfg2 = MCP_16MHz_10kBPS_CFG2;
307+
cfg3 = MCP_16MHz_10kBPS_CFG3;
308+
break;
309+
310+
case (CAN_20KBPS): // 20Kbps
311+
cfg1 = MCP_16MHz_20kBPS_CFG1;
312+
cfg2 = MCP_16MHz_20kBPS_CFG2;
313+
cfg3 = MCP_16MHz_20kBPS_CFG3;
314+
break;
315+
316+
case (CAN_33KBPS): // 20Kbps
317+
cfg1 = MCP_16MHz_33k3BPS_CFG1;
318+
cfg2 = MCP_16MHz_33k3BPS_CFG2;
319+
cfg3 = MCP_16MHz_33k3BPS_CFG3;
320+
break;
321+
322+
case (CAN_40KBPS): // 40Kbps
323+
cfg1 = MCP_16MHz_40kBPS_CFG1;
324+
cfg2 = MCP_16MHz_40kBPS_CFG2;
325+
cfg3 = MCP_16MHz_40kBPS_CFG3;
326+
break;
327+
328+
case (CAN_50KBPS): // 50Kbps
329+
cfg2 = MCP_16MHz_50kBPS_CFG2;
330+
cfg3 = MCP_16MHz_50kBPS_CFG3;
331+
break;
332+
333+
case (CAN_80KBPS): // 80Kbps
334+
cfg1 = MCP_16MHz_80kBPS_CFG1;
335+
cfg2 = MCP_16MHz_80kBPS_CFG2;
336+
cfg3 = MCP_16MHz_80kBPS_CFG3;
337+
break;
338+
339+
case (CAN_100KBPS): // 100Kbps
340+
cfg1 = MCP_16MHz_100kBPS_CFG1;
341+
cfg2 = MCP_16MHz_100kBPS_CFG2;
342+
cfg3 = MCP_16MHz_100kBPS_CFG3;
343+
break;
344+
345+
case (CAN_125KBPS): // 125Kbps
346+
cfg1 = MCP_16MHz_125kBPS_CFG1;
347+
cfg2 = MCP_16MHz_125kBPS_CFG2;
348+
cfg3 = MCP_16MHz_125kBPS_CFG3;
349+
break;
350+
351+
case (CAN_200KBPS): // 200Kbps
352+
cfg1 = MCP_16MHz_200kBPS_CFG1;
353+
cfg2 = MCP_16MHz_200kBPS_CFG2;
354+
cfg3 = MCP_16MHz_200kBPS_CFG3;
355+
break;
356+
357+
case (CAN_250KBPS): // 250Kbps
358+
cfg1 = MCP_16MHz_250kBPS_CFG1;
359+
cfg2 = MCP_16MHz_250kBPS_CFG2;
360+
cfg3 = MCP_16MHz_250kBPS_CFG3;
361+
break;
362+
363+
case (CAN_500KBPS): // 500Kbps
364+
cfg1 = MCP_16MHz_500kBPS_CFG1;
365+
cfg2 = MCP_16MHz_500kBPS_CFG2;
366+
cfg3 = MCP_16MHz_500kBPS_CFG3;
367+
break;
368+
369+
case (CAN_1000KBPS): // 1Mbps
370+
cfg1 = MCP_16MHz_1000kBPS_CFG1;
371+
cfg2 = MCP_16MHz_1000kBPS_CFG2;
372+
cfg3 = MCP_16MHz_1000kBPS_CFG3;
373+
break;
374+
375+
default:
376+
set = 0;
377+
break;
378+
}
279379
break;
280380

281-
case (CAN_500KBPS):
282-
cfg1 = MCP_16MHz_500kBPS_CFG1;
283-
cfg2 = MCP_16MHz_500kBPS_CFG2;
284-
cfg3 = MCP_16MHz_500kBPS_CFG3;
381+
case (MCP_20MHZ):
382+
switch (canSpeed)
383+
{
384+
case (CAN_40KBPS): // 40Kbps
385+
cfg1 = MCP_20MHz_40kBPS_CFG1;
386+
cfg2 = MCP_20MHz_40kBPS_CFG2;
387+
cfg3 = MCP_20MHz_40kBPS_CFG3;
388+
break;
389+
390+
case (CAN_50KBPS): // 50Kbps
391+
cfg1 = MCP_20MHz_50kBPS_CFG1;
392+
cfg2 = MCP_20MHz_50kBPS_CFG2;
393+
cfg3 = MCP_20MHz_50kBPS_CFG3;
394+
break;
395+
396+
case (CAN_80KBPS): // 80Kbps
397+
cfg1 = MCP_20MHz_80kBPS_CFG1;
398+
cfg2 = MCP_20MHz_80kBPS_CFG2;
399+
cfg3 = MCP_20MHz_80kBPS_CFG3;
400+
break;
401+
402+
case (CAN_100KBPS): // 100Kbps
403+
cfg1 = MCP_20MHz_100kBPS_CFG1;
404+
cfg2 = MCP_20MHz_100kBPS_CFG2;
405+
cfg3 = MCP_20MHz_100kBPS_CFG3;
406+
break;
407+
408+
case (CAN_125KBPS): // 125Kbps
409+
cfg1 = MCP_20MHz_125kBPS_CFG1;
410+
cfg2 = MCP_20MHz_125kBPS_CFG2;
411+
cfg3 = MCP_20MHz_125kBPS_CFG3;
412+
break;
413+
414+
case (CAN_200KBPS): // 200Kbps
415+
cfg1 = MCP_20MHz_200kBPS_CFG1;
416+
cfg2 = MCP_20MHz_200kBPS_CFG2;
417+
cfg3 = MCP_20MHz_200kBPS_CFG3;
418+
break;
419+
420+
case (CAN_250KBPS): // 250Kbps
421+
cfg1 = MCP_20MHz_250kBPS_CFG1;
422+
cfg2 = MCP_20MHz_250kBPS_CFG2;
423+
cfg3 = MCP_20MHz_250kBPS_CFG3;
424+
break;
425+
426+
case (CAN_500KBPS): // 500Kbps
427+
cfg1 = MCP_20MHz_500kBPS_CFG1;
428+
cfg2 = MCP_20MHz_500kBPS_CFG2;
429+
cfg3 = MCP_20MHz_500kBPS_CFG3;
430+
break;
431+
432+
case (CAN_1000KBPS): // 1Mbps
433+
cfg1 = MCP_20MHz_1000kBPS_CFG1;
434+
cfg2 = MCP_20MHz_1000kBPS_CFG2;
435+
cfg3 = MCP_20MHz_1000kBPS_CFG3;
436+
break;
437+
438+
default:
439+
set = 0;
440+
break;
441+
}
285442
break;
286-
287-
case (CAN_1000KBPS):
288-
cfg1 = MCP_16MHz_1000kBPS_CFG1;
289-
cfg2 = MCP_16MHz_1000kBPS_CFG2;
290-
cfg3 = MCP_16MHz_1000kBPS_CFG3;
291-
break;
292443

293444
default:
294445
set = 0;
295446
break;
296447
}
297448

449+
298450
if (set) {
299451
setRegister(MCP_CNF1, cfg1);
300452
setRegister(MCP_CNF2, cfg2);

0 commit comments

Comments
 (0)