From a0e4be53f4e30ee02d6d0c9221d613d18c72f426 Mon Sep 17 00:00:00 2001 From: Jan Sommer Date: Tue, 3 Dec 2024 09:10:02 +0100 Subject: [PATCH] grlib/occan: Fix baud rate calculation Fixes #5205 --- bsps/shared/grlib/can/canbtrs.c | 5 +++-- bsps/shared/grlib/can/occan.c | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/bsps/shared/grlib/can/canbtrs.c b/bsps/shared/grlib/can/canbtrs.c index 289f13a2f0..909828040c 100644 --- a/bsps/shared/grlib/can/canbtrs.c +++ b/bsps/shared/grlib/can/canbtrs.c @@ -62,7 +62,8 @@ int grlib_canbtrs_calc_timing( tseg++) { /* calculate scaler */ tmp = ((br->divfactor + tseg) * baud); - sc = (core_hz * 2)/ tmp - core_hz / tmp; + /* Core frequency is always divided by 2 before scaler */ + sc = core_hz / (2 * tmp); if (sc <= 0 || sc > br->max_scaler) continue; if (br->has_bpr && @@ -71,7 +72,7 @@ int grlib_canbtrs_calc_timing( ((sc > 256 * 4) && (sc <= 256 * 8) && (sc & 0x7)))) continue; - error = baud - core_hz / (sc * (br->divfactor + tseg)); + error = baud - core_hz / (2 * sc * (br->divfactor + tseg)); #ifdef GRLIB_CANBTRS_DEBUG printf(" baud=%d, tseg=%d, sc=%d, error=%d\n", baud, tseg, sc, error); diff --git a/bsps/shared/grlib/can/occan.c b/bsps/shared/grlib/can/occan.c index a6b37ec74c..544958a3d2 100644 --- a/bsps/shared/grlib/can/occan.c +++ b/bsps/shared/grlib/can/occan.c @@ -1019,7 +1019,9 @@ static void convert_timing_to_btrs( { btrs->btr0 = (t->rsj << OCCAN_BUSTIM_SJW_BIT) | (t->scaler & OCCAN_BUSTIM_BRP); - btrs->btr1 = (0<<7) | (t->ps2 << OCCAN_BUSTIM_TSEG2_BIT) | t->ps1; + + /* Core adds +1 to the register values, so compensate here by decrementing */ + btrs->btr1 = (0<<7) | ((t->ps2-1) << OCCAN_BUSTIM_TSEG2_BIT) | (t->ps1-1); } static int occan_set_speedregs(occan_priv *priv, occan_speed_regs *timing)