HF-MAX22200 Driver 0.1.0-dev
HF-MAX22200 C++ Driver
Loading...
Searching...
No Matches
max22200.hpp
Go to the documentation of this file.
1
71#pragma once
73#include "max22200_types.hpp"
75#include "max22200_version.h"
76#include <cstdint>
77
78namespace max22200 {
79
133template <typename SpiType> class MAX22200 {
134public:
145 explicit MAX22200(SpiType &spi_interface);
146
157
161 ~MAX22200();
162
163 // Disable copy
164 MAX22200(const MAX22200 &) = delete;
165 MAX22200 &operator=(const MAX22200 &) = delete;
166 MAX22200(MAX22200 &&) = default;
168
169 // =========================================================================
170 // Initialization
171 // =========================================================================
172
202
219
223 bool IsInitialized() const;
224
225 // =========================================================================
226 // STATUS Register Operations
227 // =========================================================================
228
233
238
239 // =========================================================================
240 // Channel Configuration (CFG_CHx)
241 // =========================================================================
242
265
272
277
282
283 // =========================================================================
284 // Channel Enable/Disable (ONCH bits in STATUS register)
285 // =========================================================================
286
300
308
316
322
328
335
352
368
369 // =========================================================================
370 // Fault Operations
371 // =========================================================================
372
386
396
409
429 FaultStatus &faults) const;
430
435
440
441 // =========================================================================
442 // DPM Configuration (CFG_DPM, 0x0A)
443 // =========================================================================
444
461 float debounce_ms);
462
474
484
502
503 // =========================================================================
504 // Device Control
505 // =========================================================================
506
511
516
523
528
529 // =========================================================================
530 // Raw Register Access (for debug)
531 // =========================================================================
532
537
542
547
552
574
575 // =========================================================================
576 // Statistics
577 // =========================================================================
578
580 void ResetStatistics();
581
582 // =========================================================================
583 // Callbacks
584 // =========================================================================
585
588
589 // =========================================================================
590 // Board/Scale Configuration (for unit-based APIs)
591 // =========================================================================
592
605 void SetBoardConfig(const BoardConfig &config);
606
611
612 // =========================================================================
613 // Convenience APIs: Current in Real Units (CDR Mode)
614 // =========================================================================
615
628
633
640
645
654
659
666
671
676
681
682 // =========================================================================
683 // Convenience APIs: Duty Cycle in Percent (VDR Mode)
684 // =========================================================================
685
698
703
710
715
728 static DriverStatus GetDutyLimits(bool master_clock_80khz, ChopFreq chop_freq,
729 bool slew_rate_control_enabled, DutyLimits &limits);
730
742
743 // =========================================================================
744 // Convenience APIs: HIT Time in Milliseconds
745 // =========================================================================
746
758
765
766 // =========================================================================
767 // Convenience APIs: One-Shot Channel Configuration
768 // =========================================================================
769
790 uint32_t hold_ma, float hit_time_ms,
791 SideMode side_mode = SideMode::LOW_SIDE,
792 ChopFreq chop_freq = ChopFreq::FMAIN_DIV4,
793 bool slew_rate_control_enabled = false,
794 bool open_load_detection_enabled = false,
795 bool plunger_movement_detection_enabled = false,
796 bool hit_current_check_enabled = false);
797
816 DriverStatus ConfigureChannelVdr(uint8_t channel, float hit_duty_percent,
817 float hold_duty_percent, float hit_time_ms,
818 SideMode side_mode = SideMode::LOW_SIDE,
819 ChopFreq chop_freq = ChopFreq::FMAIN_DIV4,
820 bool slew_rate_control_enabled = false,
821 bool open_load_detection_enabled = false,
822 bool plunger_movement_detection_enabled = false,
823 bool hit_current_check_enabled = false);
824
825 // =========================================================================
826 // Validation
827 // =========================================================================
828
830
831 // ===========================================================================
832 // Driver Version
833 // ===========================================================================
834
836 static constexpr const char* GetDriverVersion() noexcept {
838 }
839
843 }
844
848 }
849
853 }
854
855private:
856 SpiType &spi_interface_;
857 bool initialized_;
858 mutable DriverStatistics statistics_;
859 mutable uint8_t last_fault_byte_;
860 mutable StatusConfig cached_status_;
861 BoardConfig board_config_;
862
863 FaultCallback fault_callback_;
864 void *fault_user_data_;
865 StateChangeCallback state_callback_;
866 void *state_user_data_;
867
868 // ── Core SPI protocol (two-phase) ──────────────────────────────────────
869
898 DriverStatus writeCommandRegister(uint8_t bank, bool is_write,
899 bool mode8 = false) const;
900
904 DriverStatus writeData32(uint32_t value) const;
905
909 DriverStatus readData32(uint32_t &value) const;
910
915 DriverStatus readData32WithTx(const uint8_t tx[4], uint32_t &value) const;
916
920 DriverStatus writeData8(uint8_t value) const;
921
925 DriverStatus readData8(uint8_t &value) const;
926
927 // ── Convenience wrappers ───────────────────────────────────────────────
928
932 DriverStatus writeReg32(uint8_t bank, uint32_t value) const;
933
937 DriverStatus readReg32(uint8_t bank, uint32_t &value) const;
938
942 DriverStatus writeReg8(uint8_t bank, uint8_t value) const;
943
947 DriverStatus readReg8(uint8_t bank, uint8_t &value) const;
948
949 void updateStatistics(bool success) const;
950};
951
952// Public API: Get driver version string
953inline const char* GetDriverVersion() noexcept {
955}
956
957} // namespace max22200
958
959// Include implementation
960#include "../src/max22200.ipp"
Definition max22200.hpp:133
DriverStatus ReadRegister8(uint8_t bank, uint8_t &value) const
Read 8-bit MSB of a register (fast 8-bit mode)
Definition max22200.ipp:526
DriverStatus SetChannelEnabled(uint8_t channel, bool enable)
Set a channel on or off (convenience when toggling from a variable)
Definition max22200.ipp:273
DriverStatus DisableDevice()
Disable device (ENABLE pin low); low-power state.
Definition max22200.ipp:485
DriverStatus SetDeviceEnable(bool enable)
Set ENABLE pin state (true = on, false = off)
Definition max22200.ipp:490
MAX22200(const MAX22200 &)=delete
~MAX22200()
Destructor — calls Deinitialize() if initialized.
Definition max22200.ipp:36
DriverStatus WriteRegister8(uint8_t bank, uint8_t value)
Write 8-bit MSB of a register (fast 8-bit mode)
Definition max22200.ipp:532
DriverStatistics GetStatistics() const
Definition max22200.ipp:546
void SetBoardConfig(const BoardConfig &config)
Set board configuration (IFS, max current, max duty)
Definition max22200.ipp:745
bool IsInitialized() const
Check if driver is initialized.
Definition max22200.ipp:154
DriverStatus GetFaultPinState(bool &fault_active) const
Read nFAULT pin state (true = fault active, false = no fault)
Definition max22200.ipp:501
DriverStatus EnableDevice()
Enable device (ENABLE pin high); SPI and channels can be used.
Definition max22200.ipp:480
MAX22200 & operator=(MAX22200 &&)=delete
DriverStatus SetFullBridgeState(uint8_t pair_index, FullBridgeState state)
Set full-bridge state for a channel pair (datasheet Table 7)
Definition max22200.ipp:311
DriverStatus SetHoldDutyPercent(uint8_t channel, float percent)
Set HOLD duty cycle in percent (VDR mode)
Definition max22200.ipp:962
MAX22200 & operator=(const MAX22200 &)=delete
static DriverStatus GetDutyLimits(bool master_clock_80khz, ChopFreq chop_freq, bool slew_rate_control_enabled, DutyLimits &limits)
Get duty cycle limits (δMIN, δMAX) for a configuration.
Definition max22200.ipp:1046
DriverStatus ReadRegister32(uint8_t bank, uint32_t &value) const
Read a 32-bit register by bank address.
Definition max22200.ipp:515
DriverStatus ClearChannelFaults(uint8_t channel_mask, FaultStatus *out_faults=nullptr) const
Clear fault flags for selected channels only (MAX22200A)
Definition max22200.ipp:363
void SetFaultCallback(FaultCallback callback, void *user_data)
Definition max22200.ipp:560
DriverStatus ReadFaultFlags(StatusConfig &status) const
Read fault flags from STATUS register.
Definition max22200.ipp:394
DriverStatus Deinitialize()
Deinitialize — disable channels, ACTIVE=0, ENABLE low.
Definition max22200.ipp:132
DriverStatus ClearAllFaults()
Clear all fault flags (read FAULT register and discard)
Definition max22200.ipp:357
DriverStatus SetHoldCurrentA(uint8_t channel, float amps)
Set HOLD current in Amps (CDR mode)
Definition max22200.ipp:807
DriverStatus GetHitCurrentMa(uint8_t channel, uint32_t &ma) const
Get HIT current in milliamps (CDR mode)
Definition max22200.ipp:842
DriverStatus GetChannelConfig(uint8_t channel, ChannelConfig &config) const
Read a channel's configuration.
Definition max22200.ipp:215
DriverStatus WriteDpmConfig(const DpmConfig &config)
Write DPM algorithm configuration (CFG_DPM register)
Definition max22200.ipp:421
MAX22200(MAX22200 &&)=default
DriverStatus ConfigureAllChannels(const ChannelConfigArray &configs)
Configure all channels.
Definition max22200.ipp:233
DriverStatus GetAllChannelConfigs(ChannelConfigArray &configs) const
Get all channel configurations.
Definition max22200.ipp:246
static bool IsValidChannel(uint8_t channel)
Definition max22200.hpp:829
DriverStatus DisableAllChannels()
Turn off all channels.
Definition max22200.ipp:292
DriverStatus WriteStatus(const StatusConfig &status)
Write the STATUS register (writable bits only)
Definition max22200.ipp:174
static constexpr uint8_t GetDriverVersionPatch() noexcept
Get the compiled driver patch version number.
Definition max22200.hpp:851
DriverStatus SetHoldCurrentPercent(uint8_t channel, float percent)
Set HOLD current as percentage of IFS (CDR mode)
Definition max22200.ipp:828
DriverStatus GetHoldDutyPercent(uint8_t channel, float &percent) const
Get HOLD duty cycle in percent (VDR mode)
Definition max22200.ipp:1013
DriverStatus ConfigureDpm(float start_current_ma, float dip_threshold_ma, float debounce_ms)
Configure DPM in real units (easy API)
Definition max22200.ipp:448
DriverStatus SetHitCurrentA(uint8_t channel, float amps)
Set HIT current in Amps (CDR mode)
Definition max22200.ipp:802
DriverStatus ReadDpmConfig(DpmConfig &config) const
Read DPM algorithm configuration (CFG_DPM register)
Definition max22200.ipp:410
static constexpr uint8_t GetDriverVersionMinor() noexcept
Get the compiled driver minor version number.
Definition max22200.hpp:846
DriverStatus DisableChannel(uint8_t channel)
Turn off a channel (set ONCHx = 0)
Definition max22200.ipp:268
void ResetStatistics()
Definition max22200.ipp:551
DriverStatus SetHitCurrentMa(uint8_t channel, uint32_t ma)
Set HIT current in milliamps (CDR mode)
Definition max22200.ipp:759
DriverStatus SetChannelsOn(uint8_t channel_mask)
Definition max22200.ipp:303
BoardConfig GetBoardConfig() const
Get current board configuration.
Definition max22200.ipp:750
DriverStatus WriteRegister32(uint8_t bank, uint32_t value)
Write a 32-bit register by bank address.
Definition max22200.ipp:521
DriverStatus SetHitDutyPercent(uint8_t channel, float percent)
Set HIT duty cycle in percent (VDR mode)
Definition max22200.ipp:926
MAX22200(SpiType &spi_interface)
Constructor (SPI only; set board config later with SetBoardConfig())
Definition max22200.ipp:22
static constexpr const char * GetDriverVersion() noexcept
Get the compiled driver version string.
Definition max22200.hpp:836
DriverStatus ReadFaultRegisterSelectiveClear(uint8_t ocp_mask, uint8_t hhf_mask, uint8_t olf_mask, uint8_t dpm_mask, FaultStatus &faults) const
[Advanced] Read FAULT register with per-type selective clear (MAX22200A)
Definition max22200.ipp:375
DriverStatus ConfigureChannelCdr(uint8_t channel, uint32_t hit_ma, uint32_t hold_ma, float hit_time_ms, SideMode side_mode=SideMode::LOW_SIDE, ChopFreq chop_freq=ChopFreq::FMAIN_DIV4, bool slew_rate_control_enabled=false, bool open_load_detection_enabled=false, bool plunger_movement_detection_enabled=false, bool hit_current_check_enabled=false)
Configure channel in real units (CDR mode)
Definition max22200.ipp:1150
DriverStatus SetDpmEnabledChannels(uint8_t channel_mask)
Definition max22200.ipp:428
DriverStatus GetHoldCurrentMa(uint8_t channel, uint32_t &ma) const
Get HOLD current in milliamps (CDR mode)
Definition max22200.ipp:860
DriverStatus GetHitDutyPercent(uint8_t channel, float &percent) const
Get HIT duty cycle in percent (VDR mode)
Definition max22200.ipp:994
DriverStatus EnableChannel(uint8_t channel)
Turn on a channel (set ONCHx = 1)
Definition max22200.ipp:263
DriverStatus GetHoldCurrentPercent(uint8_t channel, float &percent) const
Get HOLD current as percentage of IFS (CDR mode)
Definition max22200.ipp:900
DriverStatus SetHoldCurrentMa(uint8_t channel, uint32_t ma)
Set HOLD current in milliamps (CDR mode)
Definition max22200.ipp:781
DriverStatus ConfigureChannel(uint8_t channel, const ChannelConfig &config)
Configure a channel (write full 32-bit CFG_CHx register)
Definition max22200.ipp:188
static constexpr uint8_t GetDriverVersionMajor() noexcept
Get the compiled driver major version number.
Definition max22200.hpp:841
DriverStatus GetHitTimeMs(uint8_t channel, float &ms) const
Get HIT time in milliseconds.
Definition max22200.ipp:1128
void SetStateChangeCallback(StateChangeCallback callback, void *user_data)
Definition max22200.ipp:567
DriverStatus GetHitCurrentPercent(uint8_t channel, float &percent) const
Get HIT current as percentage of IFS (CDR mode)
Definition max22200.ipp:878
DriverStatus SetHitCurrentPercent(uint8_t channel, float percent)
Set HIT current as percentage of IFS (CDR mode)
Definition max22200.ipp:812
DriverStatus SetHitTimeMs(uint8_t channel, float ms)
Set HIT time in milliseconds.
Definition max22200.ipp:1100
DriverStatus Initialize()
Initialize the driver per datasheet flowchart (Figure 6)
Definition max22200.ipp:47
DriverStatus ReadFaultRegister(FaultStatus &faults) const
Read per-channel fault register (FAULT)
Definition max22200.ipp:346
DriverStatus ClearFaultFlags()
Clear fault flags by reading STATUS register.
Definition max22200.ipp:399
DriverStatus SetAllChannelsEnabled(bool enable)
Set all channels on or off at once (convenience when toggling from a variable)
Definition max22200.ipp:297
DriverStatus ConfigureChannelVdr(uint8_t channel, float hit_duty_percent, float hold_duty_percent, float hit_time_ms, SideMode side_mode=SideMode::LOW_SIDE, ChopFreq chop_freq=ChopFreq::FMAIN_DIV4, bool slew_rate_control_enabled=false, bool open_load_detection_enabled=false, bool plunger_movement_detection_enabled=false, bool hit_current_check_enabled=false)
Configure channel in real units (VDR mode)
Definition max22200.ipp:1186
uint8_t GetLastFaultByte() const
Definition max22200.ipp:537
DriverStatus EnableAllChannels()
Turn on all channels.
Definition max22200.ipp:287
DriverStatus ReadStatus(StatusConfig &status) const
Read the full 32-bit STATUS register.
Definition max22200.ipp:163
Template implementation for MAX22200 driver.
Register definitions and constants for MAX22200 IC.
CRTP-based template interface for SPI communication.
Type definitions and structures for MAX22200 driver.
Definition max22200.ipp:15
std::array< ChannelConfig, NUM_CHANNELS_ > ChannelConfigArray
Array type for channel configurations.
Definition max22200_types.hpp:970
SideMode
High-side / Low-side selection (HSnLS bit in CFG_CHx[6])
Definition max22200_types.hpp:123
@ LOW_SIDE
Low-side driver (HSnLS = 0) — supports CDR and VDR.
DriverStatus
Driver status enumeration.
Definition max22200_types.hpp:923
FullBridgeState
Full-bridge state for a channel pair (datasheet Table 7)
Definition max22200_types.hpp:913
const char * GetDriverVersion() noexcept
Definition max22200.hpp:953
ChopFreq
Chopping frequency setting (FREQ_CFG bits in CFG_CHx[5:4])
Definition max22200_types.hpp:211
@ FMAIN_DIV4
FreqMain / 4 (fCHOP = 25kHz if FREQM=0, 20kHz if FREQM=1). Valid with SRC=1.
void(*)(uint8_t channel, ChannelState old_state, ChannelState new_state, void *user_data) StateChangeCallback
Callback function type for channel state changes.
Definition max22200_types.hpp:981
constexpr uint8_t NUM_CHANNELS_
Number of channels on the MAX22200.
Definition max22200_registers.hpp:60
void(*)(uint8_t channel, FaultType fault_type, void *user_data) FaultCallback
Callback function type for fault events.
Definition max22200_types.hpp:975
Board/scale configuration for unit-based APIs.
Definition max22200_types.hpp:1010
Channel configuration structure.
Definition max22200_types.hpp:360
DPM (Detection of Plunger Movement) algorithm configuration.
Definition max22200_types.hpp:882
Driver statistics structure.
Definition max22200_types.hpp:1082
Duty cycle limits (δMIN, δMAX) for a given configuration.
Definition max22200_types.hpp:1057
Per-channel fault information from FAULT register (0x09)
Definition max22200_types.hpp:805
STATUS register structure.
Definition max22200_types.hpp:634