Skip to content

Commit ec0a2de

Browse files
committed
This works for Santiago.
Former-commit-id: e6f13ca
1 parent a3d14b2 commit ec0a2de

File tree

4 files changed

+103
-100
lines changed

4 files changed

+103
-100
lines changed

libraries/CAN/extras/test/src/test_calc_can_bit_timinig.cpp

Lines changed: 73 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -24,119 +24,115 @@ SCENARIO("calc_can_bit_timing", "[calc_can_bit_timing]")
2424
{
2525
GIVEN("Santiago")
2626
{
27-
static uint32_t const F_CAN_CLK_Hz = 20*1000*1000UL;
28-
static uint32_t const CAN_TIME_QUANTA_per_Bit = 32; /* TQ */
27+
static uint32_t const F_CAN_CLK_Hz = 20*1000*1000UL;
28+
static uint32_t const TQ_MIN = 8;
29+
static uint32_t const TQ_MAX = 25;
30+
static uint32_t const SYNC_JUMP_WIDTH = 4;
2931

30-
WHEN("CanBitRate::BR_125k")
31-
{
32-
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2, synchronization_jump_width] =
33-
util::calc_can_bit_timing(CanBitRate::BR_125k, F_CAN_CLK_Hz, CAN_TIME_QUANTA_per_Bit);
34-
THEN("")
32+
WHEN("CanBitRate::BR_125k")
3533
{
36-
REQUIRE(is_valid_baudrate == true);
37-
REQUIRE(baud_rate_prescaler == 5);
38-
REQUIRE(time_segment_1 == 23);
39-
REQUIRE(time_segment_2 == 8);
40-
REQUIRE(synchronization_jump_width == 1);
41-
};
42-
}
43-
WHEN("CanBitRate::BR_250k")
44-
{
45-
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2, synchronization_jump_width] =
46-
util::calc_can_bit_timing(CanBitRate::BR_250k, F_CAN_CLK_Hz, CAN_TIME_QUANTA_per_Bit);
47-
THEN("")
34+
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2] =
35+
util::calc_can_bit_timing(CanBitRate::BR_125k, F_CAN_CLK_Hz, TQ_MIN, TQ_MAX, SYNC_JUMP_WIDTH);
36+
THEN("")
37+
{
38+
REQUIRE(is_valid_baudrate == true);
39+
REQUIRE(baud_rate_prescaler == 8);
40+
REQUIRE(time_segment_1 == 11);
41+
REQUIRE(time_segment_2 == 4);
42+
}
43+
}
44+
WHEN("CanBitRate::BR_250k")
4845
{
49-
REQUIRE(is_valid_baudrate == true);
50-
REQUIRE(baud_rate_prescaler == 4);
51-
REQUIRE(time_segment_1 == 14);
52-
REQUIRE(time_segment_2 == 5);
53-
REQUIRE(synchronization_jump_width == 1);
54-
};
55-
}
56-
WHEN("CanBitRate::BR_500k")
57-
{
58-
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2, synchronization_jump_width] =
59-
util::calc_can_bit_timing(CanBitRate::BR_500k, F_CAN_CLK_Hz, CAN_TIME_QUANTA_per_Bit);
60-
THEN("")
46+
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2] =
47+
util::calc_can_bit_timing(CanBitRate::BR_250k, F_CAN_CLK_Hz, TQ_MIN, TQ_MAX, SYNC_JUMP_WIDTH);
48+
THEN("")
49+
{
50+
REQUIRE(is_valid_baudrate == true);
51+
REQUIRE(baud_rate_prescaler == 4);
52+
REQUIRE(time_segment_1 == 11);
53+
REQUIRE(time_segment_2 == 4);
54+
}
55+
}
56+
WHEN("CanBitRate::BR_500k")
6157
{
62-
REQUIRE(is_valid_baudrate == true);
63-
REQUIRE(baud_rate_prescaler == 2);
64-
REQUIRE(time_segment_1 == 14);
65-
REQUIRE(time_segment_2 == 5);
66-
REQUIRE(synchronization_jump_width == 1);
67-
};
68-
}
69-
WHEN("CanBitRate::BR_1000k")
70-
{
71-
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2, synchronization_jump_width] =
72-
util::calc_can_bit_timing(CanBitRate::BR_1000k, F_CAN_CLK_Hz, CAN_TIME_QUANTA_per_Bit);
73-
THEN("")
58+
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2] =
59+
util::calc_can_bit_timing(CanBitRate::BR_500k, F_CAN_CLK_Hz, TQ_MIN, TQ_MAX, SYNC_JUMP_WIDTH);
60+
THEN("")
61+
{
62+
REQUIRE(is_valid_baudrate == true);
63+
REQUIRE(baud_rate_prescaler == 2);
64+
REQUIRE(time_segment_1 == 11);
65+
REQUIRE(time_segment_2 == 4);
66+
}
67+
}
68+
WHEN("CanBitRate::BR_1000k")
7469
{
75-
REQUIRE(is_valid_baudrate == true);
76-
REQUIRE(baud_rate_prescaler == 1);
77-
REQUIRE(time_segment_1 == 14);
78-
REQUIRE(time_segment_2 == 5);
79-
REQUIRE(synchronization_jump_width == 1);
80-
};
70+
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2] =
71+
util::calc_can_bit_timing(CanBitRate::BR_1000k, F_CAN_CLK_Hz, TQ_MIN, TQ_MAX, SYNC_JUMP_WIDTH);
72+
THEN("")
73+
{
74+
REQUIRE(is_valid_baudrate == true);
75+
REQUIRE(baud_rate_prescaler == 1);
76+
REQUIRE(time_segment_1 == 11);
77+
REQUIRE(time_segment_2 == 4);
78+
}
8179
}
8280
}
8381

8482
GIVEN("Portenta H33")
8583
{
8684
static uint32_t const F_CAN_CLK_Hz = 24*1000*1000UL;
87-
static uint32_t const CAN_TIME_QUANTA_per_Bit = 32; /* TQ */
85+
static uint32_t const TQ_MIN = 5;
86+
static uint32_t const TQ_MAX = 49;
87+
static uint32_t const SYNC_JUMP_WIDTH = 1;
8888

8989
WHEN("CanBitRate::BR_125k")
9090
{
91-
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2, synchronization_jump_width] =
92-
util::calc_can_bit_timing(CanBitRate::BR_125k, F_CAN_CLK_Hz, CAN_TIME_QUANTA_per_Bit);
91+
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2] =
92+
util::calc_can_bit_timing(CanBitRate::BR_125k, F_CAN_CLK_Hz, TQ_MIN, TQ_MAX, SYNC_JUMP_WIDTH);
9393
THEN("")
9494
{
95-
REQUIRE(is_valid_baudrate == true);
96-
REQUIRE(baud_rate_prescaler == 6);
97-
REQUIRE(time_segment_1 == 23);
98-
REQUIRE(time_segment_2 == 8);
99-
REQUIRE(synchronization_jump_width == 1);
100-
};
95+
REQUIRE(is_valid_baudrate == true);
96+
REQUIRE(baud_rate_prescaler == 4);
97+
REQUIRE(time_segment_1 == 35);
98+
REQUIRE(time_segment_2 == 11);
99+
}
101100
}
102101
WHEN("CanBitRate::BR_250k")
103102
{
104-
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2, synchronization_jump_width] =
105-
util::calc_can_bit_timing(CanBitRate::BR_250k, F_CAN_CLK_Hz, CAN_TIME_QUANTA_per_Bit);
103+
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2] =
104+
util::calc_can_bit_timing(CanBitRate::BR_250k, F_CAN_CLK_Hz, TQ_MIN, TQ_MAX, SYNC_JUMP_WIDTH);
106105
THEN("")
107106
{
108107
REQUIRE(is_valid_baudrate == true);
109-
REQUIRE(baud_rate_prescaler == 3);
110-
REQUIRE(time_segment_1 == 23);
111-
REQUIRE(time_segment_2 == 8);
112-
REQUIRE(synchronization_jump_width == 1);
113-
};
108+
REQUIRE(baud_rate_prescaler == 2);
109+
REQUIRE(time_segment_1 == 35);
110+
REQUIRE(time_segment_2 == 11);
111+
}
114112
}
115113
WHEN("CanBitRate::BR_500k")
116114
{
117-
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2, synchronization_jump_width] =
118-
util::calc_can_bit_timing(CanBitRate::BR_500k, F_CAN_CLK_Hz, CAN_TIME_QUANTA_per_Bit);
115+
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2] =
116+
util::calc_can_bit_timing(CanBitRate::BR_500k, F_CAN_CLK_Hz, TQ_MIN, TQ_MAX, SYNC_JUMP_WIDTH);
119117
THEN("")
120118
{
121119
REQUIRE(is_valid_baudrate == true);
122-
REQUIRE(baud_rate_prescaler == 2);
123-
REQUIRE(time_segment_1 == 17);
124-
REQUIRE(time_segment_2 == 6);
125-
REQUIRE(synchronization_jump_width == 1);
126-
};
120+
REQUIRE(baud_rate_prescaler == 1);
121+
REQUIRE(time_segment_1 == 35);
122+
REQUIRE(time_segment_2 == 11);
123+
}
127124
}
128125
WHEN("CanBitRate::BR_1000k")
129126
{
130-
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2, synchronization_jump_width] =
131-
util::calc_can_bit_timing(CanBitRate::BR_1000k, F_CAN_CLK_Hz, CAN_TIME_QUANTA_per_Bit);
127+
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2] =
128+
util::calc_can_bit_timing(CanBitRate::BR_1000k, F_CAN_CLK_Hz, TQ_MIN, TQ_MAX, SYNC_JUMP_WIDTH);
132129
THEN("")
133130
{
134131
REQUIRE(is_valid_baudrate == true);
135132
REQUIRE(baud_rate_prescaler == 1);
136133
REQUIRE(time_segment_1 == 17);
137-
REQUIRE(time_segment_2 == 6);
138-
REQUIRE(synchronization_jump_width == 1);
139-
};
134+
REQUIRE(time_segment_2 == 5);
140135
}
136+
}
141137
}
142138
}

libraries/CAN/src/CanUtil.cpp

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#include "CanUtil.h"
1616

1717
#include <math.h> /* modf */
18-
18+
#include <iostream>
1919
/**************************************************************************************
2020
* NAMESPACE
2121
**************************************************************************************/
@@ -27,44 +27,50 @@ namespace util
2727
* FUNCTION DEFINITION
2828
**************************************************************************************/
2929

30-
std::tuple<bool, uint32_t, uint32_t, uint32_t, uint32_t> calc_can_bit_timing(CanBitRate const can_bitrate, uint32_t const can_clock_Hz, uint32_t const tq_max)
30+
std::tuple<bool, uint32_t, uint32_t, uint32_t> calc_can_bit_timing(CanBitRate const can_bitrate, uint32_t const can_clock_Hz, uint32_t const tq_min, uint32_t const tq_max, uint32_t const sync_jump_width)
3131
{
3232
/* Calculate the CAN bitrate based on the value of this functions parameter.
3333
*
3434
* Note: Concerning the calculation of
3535
* - _canfd_bit_timing_cfg.baud_rate_prescaler
3636
* - time_segment_1 (TSEG1)
3737
* - time_segment_2 (TSEG2)
38-
* - synchronization_jump_width (SJW)
3938
* also compare with Table 32.14, RA6M5 Group User Manual, Rev. 1.10.
4039
*/
41-
for (uint32_t tq = tq_max; tq > 0; tq--)
40+
for (uint32_t tq = tq_max; tq >= tq_min; tq--)
4241
{
43-
/* If it has come this far we've failed to find a valid prescaler. */
44-
if (tq == 0)
45-
return std::make_tuple(false, 0, 0, 0, 0);
46-
4742
/* Determine the CAN baud rate prescaler. */
4843
double const brp = static_cast<double>(can_clock_Hz) / (tq * static_cast<double>(can_bitrate));
4944
/* Extract the sub-comma part of the baud rate prescaler. */
50-
double brp_ipart;
45+
double brp_ipart = 0.0f;
5146
double const brp_fract = modf(brp, &brp_ipart);
5247
/* If the fractional part is sufficiently close to zero, we have
5348
* found a valid prescaler configuration.
5449
*/
55-
if (brp_fract < 0.01)
50+
std::cout << "can_bitrate = " << (int)can_bitrate << std::endl;
51+
std::cout << "tq = " << tq << std::endl;
52+
std::cout << "brp_fract = " << brp_fract << std::endl;
53+
if (brp_fract < 0.1)
5654
{
57-
uint32_t const baud_rate_prescaler = static_cast<uint32_t>(brp);
55+
std::cout << "HELL YEAH" << std::endl;
56+
uint32_t const baud_rate_prescaler = static_cast<uint32_t>(brp_ipart);
5857
/* Assign TSEG1 and TSEG2 to set the sample point at 75%. */
59-
uint32_t const synchronization_jump_width = 1; /* Is always 1. */
60-
uint32_t const time_segment_1 = static_cast<uint32_t>(static_cast<float>(tq) * 0.75) - 1;
61-
uint32_t const time_segment_2 = tq - time_segment_1 - synchronization_jump_width;
58+
uint32_t const time_segment_1 = static_cast<int>(static_cast<float>(tq) * 0.75f) - sync_jump_width;
59+
/*
60+
if (time_segment_1 < 4 || time_segment_1 > 16)
61+
continue;
62+
*/
63+
uint32_t const time_segment_2 = tq - time_segment_1 - sync_jump_width - 1;
64+
//uint32_t const time_segment_2 = static_cast<int>(round(static_cast<float>(tq) * 0.25f)) - 1;
65+
std::cout << "time_segment_1 = " << time_segment_1 << std::endl;
66+
std::cout << "time_segment_2 = " << time_segment_2 << std::endl;
67+
6268
/* We've found a valid configuration, exit here. */
63-
return std::make_tuple(true, baud_rate_prescaler, time_segment_1, time_segment_2, synchronization_jump_width);
69+
return std::make_tuple(true, baud_rate_prescaler, time_segment_1, time_segment_2);
6470
}
6571
}
6672

67-
return std::make_tuple(false, 0, 0, 0, 0);
73+
return std::make_tuple(false, 0, 0, 0);
6874
}
6975

7076
/**************************************************************************************

libraries/CAN/src/CanUtil.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@ namespace util
3535
std::tuple<bool, /* valid result found */
3636
uint32_t, /* baud_rate_prescaler */
3737
uint32_t, /* time_segment_1 */
38-
uint32_t, /* time_segment_2 */
39-
uint32_t> /* synchronization_jump_width */
40-
calc_can_bit_timing(CanBitRate const can_bitrate, uint32_t const can_clock_Hz, uint32_t const tq_max);
38+
uint32_t> /* time_segment_2 */
39+
calc_can_bit_timing(CanBitRate const can_bitrate, uint32_t const can_clock_Hz, uint32_t const tq_min, uint32_t const tq_max, uint32_t const sync_jump_width);
4140

4241
/**************************************************************************************
4342
* NAMESPACE

libraries/CAN/src/R7FA4M1_CAN.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,17 +164,19 @@ bool R7FA4M1_CAN::begin(CanBitRate const can_bitrate)
164164
/* Calculate the CAN bitrate based on the value of this functions parameter.
165165
*/
166166
static uint32_t const F_CAN_CLK_Hz = 20*1000*1000UL; /* CANMCLK */
167-
static uint32_t const CAN_TIME_QUANTA_per_Bit = 32; /* TQ */
167+
static uint32_t const TQ_MIN = 8;
168+
static uint32_t const TQ_MAX = 25;
169+
static uint32_t const SYNC_JUMP_WIDTH = 4;
168170

169-
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2, synchronization_jump_width] =
170-
util::calc_can_bit_timing(can_bitrate, F_CAN_CLK_Hz, CAN_TIME_QUANTA_per_Bit);
171+
auto [is_valid_baudrate, baud_rate_prescaler, time_segment_1, time_segment_2] =
172+
util::calc_can_bit_timing(can_bitrate, F_CAN_CLK_Hz, TQ_MIN, TQ_MAX, SYNC_JUMP_WIDTH);
171173
init_ok &= is_valid_baudrate;
172174

173175
if (is_valid_baudrate) {
174176
_can_bit_timing_cfg.baud_rate_prescaler = baud_rate_prescaler;
175177
_can_bit_timing_cfg.time_segment_1 = time_segment_1;
176178
_can_bit_timing_cfg.time_segment_2 = time_segment_2;
177-
_can_bit_timing_cfg.synchronization_jump_width = synchronization_jump_width;
179+
_can_bit_timing_cfg.synchronization_jump_width = SYNC_JUMP_WIDTH;
178180
}
179181

180182
/* Initialize the peripheral's FSP driver. */

0 commit comments

Comments
 (0)