@@ -184,6 +184,11 @@ MCP2515::ERROR MCP2515::setMode(const CANCTRL_REQOP_MODE mode)
184184}
185185
186186MCP2515::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