#pragma once #include #include #include "common.h" // ==== Board-Pin ==== // Falls nicht bereits global definiert: #ifndef GPIO_CS_CAN #define GPIO_CS_CAN 5 #endif // ==== Öffentliche, einzige Instanz ==== extern MCP_CAN CAN0; // ==== Init-Config ==== struct CanHalConfig { uint8_t baud = CAN_500KBPS; // laut Lib uint8_t clock = MCP_16MHZ; // 8/16 MHz je nach Quarz uint16_t listenOnlyProbeMs = 0; // optionaler kurzer Hörtest uint16_t modeSettleMs = 10; // Wartezeit für Mode-Set (Retry-Fenster) }; // ==== Universeller Filter-Descriptor ==== struct CanFilter { uint32_t id; // 11-bit oder 29-bit Roh-ID bool ext; // false = STD(11-bit), true = EXT(29-bit) }; // ===================== // Trace / Logging Types // ===================== struct CanLogFrame { uint32_t ts_ms; uint32_t id; bool ext; bool rx; // true = RX, false = TX uint8_t dlc; uint8_t data[8]; }; using CanTraceSink = void (*)(const CanLogFrame& f); // ==== API ==== // 1) Einmalige Hardware-Initialisierung + integrierter Loopback-Selftest. // - begin() // - LOOPBACK senden/echo prüfen (ohne Bus) // - optional: ListenOnly-Probe (nur Heuristik) // - Default: Filter/Masks weit offen, NORMAL-Mode // Rückgabe: true = bereit; false = Fehler (kein CAN verwenden) bool CAN_HAL_Init(const CanHalConfig& cfg); // Ist die HAL bereit (nach Init)? bool CAN_HAL_IsReady(); // Bestätigter Moduswechsel (CONFIG/NORMAL/LISTENONLY/LOOPBACK) // true = erfolgreich; setzt bei Misserfolg DTC_CAN_TRANSCEIVER_FAILED bool CAN_HAL_SetMode(uint8_t mode); // Masken/Filter bool CAN_HAL_SetMask(uint8_t bank, bool ext, uint32_t rawMask); bool CAN_HAL_SetStdMask11(uint8_t bank, uint16_t mask11); void CAN_HAL_ClearFilters(); bool CAN_HAL_AddFilter(const CanFilter& f); bool CAN_HAL_SetFilters(const CanFilter* list, size_t count); // Non-blocking IO bool CAN_HAL_Read(unsigned long& id, uint8_t& len, uint8_t data[8]); // true = Frame gelesen uint8_t CAN_HAL_Send(unsigned long id, bool ext, uint8_t len, const uint8_t* data); // CAN_OK bei Erfolg // Diagnose/Utilities uint8_t CAN_HAL_GetErrorFlags(); // Intern: getError() void CAN_HAL_GetErrorCounters(uint8_t& tec, uint8_t& rec); // TX/RX Error Counter // Trace / Sniffer void CAN_HAL_SetTraceSink(CanTraceSink sink); void CAN_HAL_EnableRawSniffer(bool enable); bool CAN_HAL_IsRawSnifferEnabled();