CAN CoreX 2.3.1
Table-driven CAN, CAN FD, ISO-TP, network simulation, and bus monitoring library
Loading...
Searching...
No Matches
can_corex_bus.h
Go to the documentation of this file.
1/*
2 * This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 *
6 * Author: Adrian Pietrzak
7 * GitHub: https://github.com/AdrianPietrzak1998
8 * Created: Apr 24, 2026
9 */
10
11#ifndef CAN_COREX_CAN_COREX_BUS_H_
12#define CAN_COREX_CAN_COREX_BUS_H_
13
14#if !defined(CAN_COREX_CAN_COREX_H_) && !defined(DOXYGEN)
15#error "Include can_corex.h instead of can_corex_bus.h directly."
16#endif
17
18#ifdef __cplusplus
19extern "C"
20{
21#endif
22
32
33 typedef struct
34 {
35 CCX_HR_TIME_t HighResDelay;
36 CCX_TIME_t BaseDelay;
37 uint8_t UsesHighRes;
39
40#ifdef CCX_DISABLE_HIGH_RES_TIMEBASE
41#define CCX_BUS_RECOVERY_MS(ms) \
42 ((CCX_BusRecoveryDelay_t){.HighResDelay = 0U, .BaseDelay = (CCX_TIME_t)(ms), .UsesHighRes = 0U})
43#define CCX_BUS_RECOVERY_US(us) \
44 ((CCX_BusRecoveryDelay_t){ \
45 .HighResDelay = 0U, .BaseDelay = (CCX_TIME_t)CCX_INTERNAL_MS_FROM_US_CEIL(us), .UsesHighRes = 0U})
46#else
47#define CCX_BUS_RECOVERY_MS(ms) \
48 ((CCX_BusRecoveryDelay_t){.HighResDelay = 0U, .BaseDelay = (CCX_TIME_t)(ms), .UsesHighRes = 0U})
49#define CCX_BUS_RECOVERY_US(us) \
50 ((CCX_BusRecoveryDelay_t){.HighResDelay = ((us) <= 3000U) ? CCX_HR_TIME(us) : 0U, \
51 .BaseDelay = (CCX_TIME_t)CCX_INTERNAL_MS_FROM_US_CEIL(us), \
52 .UsesHighRes = (uint8_t)((us) <= 3000U)})
53#endif
54
55 /* ============================================================
56 * ISO 11898-1 BUS-OFF recovery timing
57 *
58 * Condition:
59 * 128 x 11 recessive bits = 1408 bits
60 *
61 * Classic CAN constants are expressed directly in milliseconds because they
62 * do not benefit from the HR domain. Short recovery delays can still be
63 * expressed through CCX_BUS_RECOVERY_US(us). Values up to 3 ms use the HR
64 * timebase when available; longer values are tracked in the base time domain.
65 * The _MS suffix is kept for API stability.
66 * ============================================================ */
67
68#define CAN_COREX_BUS_OFF_RECOVERY_10KBPS_MS CCX_BUS_RECOVERY_MS(141U)
69#define CAN_COREX_BUS_OFF_RECOVERY_20KBPS_MS CCX_BUS_RECOVERY_MS(71U)
70#define CAN_COREX_BUS_OFF_RECOVERY_50KBPS_MS CCX_BUS_RECOVERY_MS(29U)
71#define CAN_COREX_BUS_OFF_RECOVERY_83K3BPS_MS CCX_BUS_RECOVERY_MS(17U)
72#define CAN_COREX_BUS_OFF_RECOVERY_100KBPS_MS CCX_BUS_RECOVERY_MS(15U)
73#define CAN_COREX_BUS_OFF_RECOVERY_125KBPS_MS CCX_BUS_RECOVERY_MS(12U)
74#define CAN_COREX_BUS_OFF_RECOVERY_250KBPS_MS CCX_BUS_RECOVERY_MS(6U)
75#define CAN_COREX_BUS_OFF_RECOVERY_500KBPS_MS CCX_BUS_RECOVERY_US(2816U)
76#define CAN_COREX_BUS_OFF_RECOVERY_800KBPS_MS CCX_BUS_RECOVERY_US(1760U)
77#define CAN_COREX_BUS_OFF_RECOVERY_1000KBPS_MS CCX_BUS_RECOVERY_US(1408U)
78
79#if CCX_ENABLE_CANFD
80#define CAN_COREX_BUS_OFF_RECOVERY_FD_2M_MS CCX_BUS_RECOVERY_US(704U)
81#define CAN_COREX_BUS_OFF_RECOVERY_FD_5M_MS CCX_BUS_RECOVERY_US(282U)
82#define CAN_COREX_BUS_OFF_RECOVERY_FD_8M_MS CCX_BUS_RECOVERY_US(176U)
83#endif
84
97 typedef enum
98 {
99 CCX_BUS_STATE_ACTIVE = 0,
100 CCX_BUS_STATE_WARNING,
101 CCX_BUS_STATE_PASSIVE,
102 CCX_BUS_STATE_OFF
104
118 typedef struct
119 {
120 uint8_t TEC;
121 uint8_t REC;
123
140
149 typedef struct
150 {
153
154 /* Recovery parameters */
161
162 /* Internal state */
164 CCX_HR_TIME_t
170
171 /* Hardware interface - user implements these */
173 void (*GetErrorCounters)(const CCX_instance_t *Instance,
174 CCX_ErrorCounters_t *Counters);
175 void (*RequestRecovery)(const CCX_instance_t *Instance);
176
177 /* User callbacks */
178 void (*OnBusStateChange)(CCX_instance_t *Instance, CCX_BusState_t OldState, CCX_BusState_t NewState,
179 void *UserData);
180 void (*OnRecoveryAttempt)(CCX_instance_t *Instance, uint8_t AttemptNumber,
181 void *UserData);
182 void (*OnRecoveryFailed)(CCX_instance_t *Instance, void *UserData);
183 void (*OnErrorCountersUpdate)(CCX_instance_t *Instance, const CCX_ErrorCounters_t *Counters,
184 void *UserData);
185 void *UserData;
187
188 /* ========================================================================
189 * BUS MONITORING API (v1.3.0)
190 * ======================================================================== */
191
192 CCX_Status_t CCX_BusMonitor_Init(CCX_instance_t *Instance, CCX_BusMonitor_t *Monitor,
193 CCX_BusState_t (*GetBusState)(const CCX_instance_t *),
194 void (*GetErrorCounters)(const CCX_instance_t *, CCX_ErrorCounters_t *),
195 void (*RequestRecovery)(const CCX_instance_t *),
196 CCX_BusRecoveryDelay_t recovery_delay, CCX_TIME_t successful_run_time,
197 uint8_t auto_recovery_enabled, uint8_t max_recovery_attempts);
198
199 CCX_Status_t CCX_BusMonitor_TriggerRecovery(CCX_instance_t *Instance);
200 CCX_BusState_t CCX_BusMonitor_GetState(const CCX_instance_t *Instance);
201 void CCX_BusMonitor_ResetStats(CCX_instance_t *Instance);
202
204
205#ifdef __cplusplus
206}
207#endif
208
209#endif /* CAN_COREX_CAN_COREX_BUS_H_ */
CCX_BusState_t
CAN bus state according to ISO 11898-1.
Definition can_corex_bus.h:98
Bus monitor configuration and state.
Definition can_corex_bus.h:150
void(* OnErrorCountersUpdate)(CCX_instance_t *Instance, const CCX_ErrorCounters_t *Counters, void *UserData)
Called when TEC/REC updated.
Definition can_corex_bus.h:183
void(* OnRecoveryAttempt)(CCX_instance_t *Instance, uint8_t AttemptNumber, void *UserData)
Called before each recovery attempt.
Definition can_corex_bus.h:180
CCX_TIME_t recovery_start_time
Base-domain timestamp for current recovery cycle.
Definition can_corex_bus.h:163
void * UserData
User context pointer for callbacks.
Definition can_corex_bus.h:185
uint8_t max_recovery_attempts
Max attempts before grace period (0 = unlimited).
Definition can_corex_bus.h:159
uint8_t in_grace_period
1 = waiting in grace period after max attempts
Definition can_corex_bus.h:168
CCX_TIME_t grace_period_start
When grace period started.
Definition can_corex_bus.h:169
CCX_TIME_t bus_off_entry_time
When bus-off state was entered.
Definition can_corex_bus.h:167
void(* OnBusStateChange)(CCX_instance_t *Instance, CCX_BusState_t OldState, CCX_BusState_t NewState, void *UserData)
Called on state transition.
Definition can_corex_bus.h:178
CCX_BusState_t current_state
Current bus state.
Definition can_corex_bus.h:151
CCX_TIME_t successful_run_time
Time to run successfully before resetting counter, in base ticks.
Definition can_corex_bus.h:157
CCX_BusState_t(* GetBusState)(const CCX_instance_t *Instance)
Read bus state from hardware.
Definition can_corex_bus.h:172
void(* OnRecoveryFailed)(CCX_instance_t *Instance, void *UserData)
Called when max attempts reached.
Definition can_corex_bus.h:182
void(* RequestRecovery)(const CCX_instance_t *Instance)
Trigger recovery in hardware.
Definition can_corex_bus.h:175
void(* GetErrorCounters)(const CCX_instance_t *Instance, CCX_ErrorCounters_t *Counters)
Read TEC/REC (can be NULL).
Definition can_corex_bus.h:173
CCX_TIME_t last_successful_recovery
When last recovery succeeded.
Definition can_corex_bus.h:166
CCX_HR_TIME_t recovery_start_time_hr
HR-domain timestamp for current recovery cycle when sub-ms recovery is used.
Definition can_corex_bus.h:165
uint8_t recovery_attempts
Current recovery attempt counter.
Definition can_corex_bus.h:160
CCX_BusRecoveryDelay_t recovery_delay
Delay between recovery attempts, in base or HR ticks depending on macro used.
Definition can_corex_bus.h:156
CCX_BusStats_t stats
Accumulated statistics.
Definition can_corex_bus.h:152
uint8_t auto_recovery_enabled
Enable automatic bus-off recovery.
Definition can_corex_bus.h:158
Definition can_corex_bus.h:34
Bus monitoring statistics.
Definition can_corex_bus.h:131
CCX_ErrorCounters_t error_counters
Current TEC/REC values from hardware.
Definition can_corex_bus.h:137
CCX_TIME_t last_bus_off_time
Timestamp of last bus-off occurrence in base ticks.
Definition can_corex_bus.h:135
CCX_ErrorCounters_t peak_error_counters
Peak TEC/REC values since initialization.
Definition can_corex_bus.h:138
CCX_TIME_t total_bus_off_duration
Cumulative time spent in bus-off state in base ticks.
Definition can_corex_bus.h:136
uint32_t error_passive_count
Number of error passive events (TEC/REC > 127).
Definition can_corex_bus.h:134
uint32_t bus_off_count
Number of bus-off events.
Definition can_corex_bus.h:132
uint32_t error_warning_count
Number of error warning events (TEC/REC > 96).
Definition can_corex_bus.h:133
CAN error counters from hardware controller.
Definition can_corex_bus.h:119
uint8_t REC
Receive Error Counter (0-255).
Definition can_corex_bus.h:121
uint8_t TEC
Transmit Error Counter (0-255).
Definition can_corex_bus.h:120
Definition can_corex.h:460