MAX22200 Driver
API reference
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
156 MAX22200(SpiType &spi_interface, const BoardConfig &board_config);
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
204
221
227 bool IsInitialized() const;
228
229 // =========================================================================
230 // STATUS Register Operations
231 // =========================================================================
232
244 DriverStatus ReadStatus(StatusConfig &status) const;
245
257
258 // =========================================================================
259 // Channel Configuration (CFG_CHx)
260 // =========================================================================
261
283 DriverStatus ConfigureChannel(uint8_t channel, const ChannelConfig &config);
284
290 DriverStatus GetChannelConfig(uint8_t channel, ChannelConfig &config) const;
291
302
310
311 // =========================================================================
312 // Channel Enable/Disable (ONCH bits in STATUS register)
313 // =========================================================================
314
327 DriverStatus EnableChannel(uint8_t channel);
328
335 DriverStatus DisableChannel(uint8_t channel);
336
343 DriverStatus SetChannelEnabled(uint8_t channel, bool enable);
344
350
356
363
379 DriverStatus SetChannelsOn(uint8_t channel_mask);
380
395 DriverStatus SetFullBridgeState(uint8_t pair_index, FullBridgeState state);
396
397 // =========================================================================
398 // Fault Operations
399 // =========================================================================
400
414
424
436 DriverStatus ClearChannelFaults(uint8_t channel_mask, FaultStatus *out_faults = nullptr) const;
437
454 uint8_t hhf_mask,
455 uint8_t olf_mask,
456 uint8_t dpm_mask,
457 FaultStatus &faults) const;
458
469
479
480 // =========================================================================
481 // DPM Configuration (CFG_DPM, 0x0A)
482 // =========================================================================
483
501 DriverStatus ConfigureDpm(float start_current_ma, float dip_threshold_ma,
502 float debounce_ms);
503
517 DriverStatus ConfigureDpm(float start_current_ma, float dip_threshold_ma,
518 float debounce_ms, ChopFreq chop_freq);
519
530 DriverStatus ReadDpmConfig(DpmConfig &config) const;
531
541
558 DriverStatus SetDpmEnabledChannels(uint8_t channel_mask);
559
560 // =========================================================================
561 // Device Control
562 // =========================================================================
563
568
573
579 DriverStatus SetDeviceEnable(bool enable);
580
584 DriverStatus GetFaultPinState(bool &fault_active) const;
585
586 // =========================================================================
587 // Raw Register Access (for debug)
588 // =========================================================================
589
600 DriverStatus ReadRegister32(uint8_t bank, uint32_t &value) const;
601
612 DriverStatus WriteRegister32(uint8_t bank, uint32_t value);
613
624 DriverStatus ReadRegister8(uint8_t bank, uint8_t &value) const;
625
636 DriverStatus WriteRegister8(uint8_t bank, uint8_t value);
637
658 uint8_t GetLastFaultByte() const;
659
660 // =========================================================================
661 // Statistics
662 // =========================================================================
663
673
677 void ResetStatistics();
678
679 // =========================================================================
680 // Callbacks
681 // =========================================================================
682
698 void SetFaultCallback(FaultCallback callback, void *user_data);
699
709 void SetStateChangeCallback(StateChangeCallback callback, void *user_data);
710
711 // =========================================================================
712 // Board/Scale Configuration (for unit-based APIs)
713 // =========================================================================
714
727 void SetBoardConfig(const BoardConfig &config);
728
733
734 // =========================================================================
735 // Convenience APIs: Current in Real Units (CDR Mode)
736 // =========================================================================
737
755 DriverStatus SetHitCurrentMa(uint8_t channel, uint32_t ma);
756
762 DriverStatus SetHoldCurrentMa(uint8_t channel, uint32_t ma);
763
769 DriverStatus SetHitCurrentA(uint8_t channel, float amps);
770
774 DriverStatus SetHoldCurrentA(uint8_t channel, float amps);
775
783 DriverStatus SetHitCurrentPercent(uint8_t channel, float percent);
784
788 DriverStatus SetHoldCurrentPercent(uint8_t channel, float percent);
789
795 DriverStatus GetHitCurrentMa(uint8_t channel, uint32_t &ma) const;
796
800 DriverStatus GetHoldCurrentMa(uint8_t channel, uint32_t &ma) const;
801
805 DriverStatus GetHitCurrentPercent(uint8_t channel, float &percent) const;
806
810 DriverStatus GetHoldCurrentPercent(uint8_t channel, float &percent) const;
811
812 // =========================================================================
813 // Convenience APIs: Duty Cycle in Percent (VDR Mode)
814 // =========================================================================
815
829 DriverStatus SetHitDutyPercent(uint8_t channel, float percent);
830
836 DriverStatus SetHoldDutyPercent(uint8_t channel, float percent);
837
843 DriverStatus GetHitDutyPercent(uint8_t channel, float &percent) const;
844
848 DriverStatus GetHoldDutyPercent(uint8_t channel, float &percent) const;
849
862 static DriverStatus GetDutyLimits(bool master_clock_80khz, ChopFreq chop_freq,
863 bool slew_rate_control_enabled, DutyLimits &limits);
864
875 DriverStatus GetDutyLimits(uint8_t channel, DutyLimits &limits) const;
876
877 // =========================================================================
878 // Convenience APIs: HIT Time in Milliseconds
879 // =========================================================================
880
891 DriverStatus SetHitTimeMs(uint8_t channel, float ms);
892
898 DriverStatus GetHitTimeMs(uint8_t channel, float &ms) const;
899
900 // =========================================================================
901 // Convenience APIs: One-Shot Channel Configuration
902 // =========================================================================
903
923 DriverStatus ConfigureChannelCdr(uint8_t channel, uint32_t hit_ma,
924 uint32_t hold_ma, float hit_time_ms,
925 SideMode side_mode = SideMode::LOW_SIDE,
926 ChopFreq chop_freq = ChopFreq::FMAIN_DIV4,
927 bool slew_rate_control_enabled = false,
928 bool open_load_detection_enabled = false,
929 bool plunger_movement_detection_enabled = false,
930 bool hit_current_check_enabled = false);
931
950 DriverStatus ConfigureChannelVdr(uint8_t channel, float hit_duty_percent,
951 float hold_duty_percent, float hit_time_ms,
952 SideMode side_mode = SideMode::LOW_SIDE,
953 ChopFreq chop_freq = ChopFreq::FMAIN_DIV4,
954 bool slew_rate_control_enabled = false,
955 bool open_load_detection_enabled = false,
956 bool plunger_movement_detection_enabled = false,
957 bool hit_current_check_enabled = false);
958
959 // =========================================================================
960 // Validation
961 // =========================================================================
962
968 static bool IsValidChannel(uint8_t channel) { return channel < NUM_CHANNELS_; }
969
970 // ===========================================================================
971 // Driver Version
972 // ===========================================================================
973
975 static constexpr const char* GetDriverVersion() noexcept {
976 return HF_MAX22200_VERSION_STRING;
977 }
978
980 static constexpr uint8_t GetDriverVersionMajor() noexcept {
981 return HF_MAX22200_VERSION_MAJOR;
982 }
983
985 static constexpr uint8_t GetDriverVersionMinor() noexcept {
986 return HF_MAX22200_VERSION_MINOR;
987 }
988
990 static constexpr uint8_t GetDriverVersionPatch() noexcept {
991 return HF_MAX22200_VERSION_PATCH;
992 }
993
994private:
995 SpiType &spi_interface_;
996 bool initialized_;
997 mutable DriverStatistics statistics_;
998 mutable uint8_t last_fault_byte_;
999 mutable StatusConfig cached_status_;
1000 BoardConfig board_config_;
1001
1002 FaultCallback fault_callback_;
1003 void *fault_user_data_;
1004 StateChangeCallback state_callback_;
1005 void *state_user_data_;
1006
1008 void notifyFaults(const FaultStatus &faults) const;
1010 void notifyStatusFaults(const StatusConfig &status) const;
1011
1012 // ── Core SPI protocol (two-phase) ──────────────────────────────────────
1013
1042 DriverStatus writeCommandRegister(uint8_t bank, bool is_write,
1043 bool mode8 = false) const;
1044
1050 DriverStatus writeData32(uint32_t value) const;
1051
1057 DriverStatus readData32(uint32_t &value) const;
1058
1063 DriverStatus readData32WithTx(const uint8_t tx[4], uint32_t &value) const;
1064
1068 DriverStatus writeData8(uint8_t value) const;
1069
1073 DriverStatus readData8(uint8_t &value) const;
1074
1075 // ── Convenience wrappers ───────────────────────────────────────────────
1076
1080 DriverStatus writeReg32(uint8_t bank, uint32_t value) const;
1081
1085 DriverStatus readReg32(uint8_t bank, uint32_t &value) const;
1086
1090 DriverStatus writeReg8(uint8_t bank, uint8_t value) const;
1091
1095 DriverStatus readReg8(uint8_t bank, uint8_t &value) const;
1096
1098 void updateStatistics(bool success) const;
1099};
1100
1105inline const char* GetDriverVersion() noexcept {
1106 return HF_MAX22200_VERSION_STRING;
1107}
1108
1109} // namespace max22200
1110
1111// Include implementation: from the source tree (inc/ next to src/), or from an installed tree where
1112// `cmake --install` puts max22200.ipp next to this header.
1113#if __has_include("../src/max22200.ipp")
1114#include "../src/max22200.ipp"
1115#else
1116#include "max22200.ipp"
1117#endif
Main driver class for MAX22200 IC.
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:569
DriverStatus SetChannelEnabled(uint8_t channel, bool enable)
Set a channel on or off (convenience when toggling from a variable)
Definition max22200.ipp:281
DriverStatus DisableDevice()
Disable device (ENABLE pin low); low-power state.
Definition max22200.ipp:528
DriverStatus SetDeviceEnable(bool enable)
Set ENABLE pin state (true = on, false = off)
Definition max22200.ipp:533
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:575
DriverStatistics GetStatistics() const
Get accumulated driver transfer statistics.
Definition max22200.ipp:589
void SetBoardConfig(const BoardConfig &config)
Set board configuration (IFS, max current, max duty)
Definition max22200.ipp:816
bool IsInitialized() const
Check if driver completed Initialize() successfully.
Definition max22200.ipp:158
DriverStatus GetFaultPinState(bool &fault_active) const
Read nFAULT pin state (true = fault active, false = no fault)
Definition max22200.ipp:544
DriverStatus EnableDevice()
Enable device (ENABLE pin high); SPI and channels can be used.
Definition max22200.ipp:523
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:319
DriverStatus SetHoldDutyPercent(uint8_t channel, float percent)
Set HOLD duty cycle in percent (VDR mode)
Definition max22200.ipp:1046
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:1133
DriverStatus ReadRegister32(uint8_t bank, uint32_t &value) const
Read a 32-bit register by bank address (debug/advanced)
Definition max22200.ipp:558
DriverStatus ClearChannelFaults(uint8_t channel_mask, FaultStatus *out_faults=nullptr) const
Clear fault flags for selected channels only (MAX22200A)
Definition max22200.ipp:372
void SetFaultCallback(FaultCallback callback, void *user_data)
Register a fault event callback.
Definition max22200.ipp:631
DriverStatus ReadFaultFlags(StatusConfig &status) const
Read fault flags from STATUS register (byte 0, bits 7:1)
Definition max22200.ipp:404
DriverStatus Deinitialize()
Deinitialize — disable channels, ACTIVE=0, ENABLE low.
Definition max22200.ipp:136
DriverStatus ClearAllFaults()
Clear all fault flags (read FAULT register and discard)
Definition max22200.ipp:366
DriverStatus SetHoldCurrentA(uint8_t channel, float amps)
Set HOLD current in Amps (CDR mode)
Definition max22200.ipp:888
DriverStatus GetHitCurrentMa(uint8_t channel, uint32_t &ma) const
Get HIT current in milliamps (CDR mode)
Definition max22200.ipp:923
DriverStatus GetChannelConfig(uint8_t channel, ChannelConfig &config) const
Read a channel's configuration.
Definition max22200.ipp:223
DriverStatus WriteDpmConfig(const DpmConfig &config)
Write DPM algorithm configuration (CFG_DPM register)
Definition max22200.ipp:431
MAX22200(MAX22200 &&)=default
DriverStatus ConfigureAllChannels(const ChannelConfigArray &configs)
Configure all eight channels (CFG_CH0 through CFG_CH7)
Definition max22200.ipp:241
DriverStatus GetAllChannelConfigs(ChannelConfigArray &configs) const
Read configuration for all eight channels.
Definition max22200.ipp:254
static bool IsValidChannel(uint8_t channel)
Check whether channel is a valid MAX22200 channel index.
Definition max22200.hpp:968
DriverStatus DisableAllChannels()
Turn off all channels.
Definition max22200.ipp:300
DriverStatus WriteStatus(const StatusConfig &status)
Write the STATUS register (writable bits only)
Definition max22200.ipp:182
static constexpr uint8_t GetDriverVersionPatch() noexcept
Get the compiled driver patch version number.
Definition max22200.hpp:990
DriverStatus SetHoldCurrentPercent(uint8_t channel, float percent)
Set HOLD current as percentage of IFS (CDR mode)
Definition max22200.ipp:909
DriverStatus GetHoldDutyPercent(uint8_t channel, float &percent) const
Get HOLD duty cycle in percent (VDR mode)
Definition max22200.ipp:1100
DriverStatus ConfigureDpm(float start_current_ma, float dip_threshold_ma, float debounce_ms)
Configure DPM in real units (easy API)
Definition max22200.ipp:458
DriverStatus SetHitCurrentA(uint8_t channel, float amps)
Set HIT current in Amps (CDR mode)
Definition max22200.ipp:883
DriverStatus ReadDpmConfig(DpmConfig &config) const
Read DPM algorithm configuration (CFG_DPM register)
Definition max22200.ipp:420
static constexpr uint8_t GetDriverVersionMinor() noexcept
Get the compiled driver minor version number.
Definition max22200.hpp:985
DriverStatus DisableChannel(uint8_t channel)
Turn off a channel (set ONCHx = 0)
Definition max22200.ipp:276
void ResetStatistics()
Reset all statistics counters to zero.
Definition max22200.ipp:594
DriverStatus SetHitCurrentMa(uint8_t channel, uint32_t ma)
Set HIT current in milliamps (CDR mode)
Definition max22200.ipp:830
DriverStatus SetChannelsOn(uint8_t channel_mask)
Set which channels are on (fast multi-channel update)
Definition max22200.ipp:311
BoardConfig GetBoardConfig() const
Get current board configuration.
Definition max22200.ipp:821
DriverStatus WriteRegister32(uint8_t bank, uint32_t value)
Write a 32-bit register by bank address (debug/advanced)
Definition max22200.ipp:564
DriverStatus SetHitDutyPercent(uint8_t channel, float percent)
Set HIT duty cycle in percent (VDR mode)
Definition max22200.ipp:1007
static constexpr const char * GetDriverVersion() noexcept
Get the compiled driver version string.
Definition max22200.hpp:975
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:384
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:1237
DriverStatus SetDpmEnabledChannels(uint8_t channel_mask)
Enable or disable DPM (plunger movement detection) on selected channels.
Definition max22200.ipp:438
DriverStatus GetHoldCurrentMa(uint8_t channel, uint32_t &ma) const
Get HOLD current in milliamps (CDR mode)
Definition max22200.ipp:941
DriverStatus GetHitDutyPercent(uint8_t channel, float &percent) const
Get HIT duty cycle in percent (VDR mode)
Definition max22200.ipp:1081
DriverStatus EnableChannel(uint8_t channel)
Turn on a channel (set ONCHx = 1)
Definition max22200.ipp:271
DriverStatus GetHoldCurrentPercent(uint8_t channel, float &percent) const
Get HOLD current as percentage of IFS (CDR mode)
Definition max22200.ipp:981
DriverStatus SetHoldCurrentMa(uint8_t channel, uint32_t ma)
Set HOLD current in milliamps (CDR mode)
Definition max22200.ipp:857
DriverStatus ConfigureChannel(uint8_t channel, const ChannelConfig &config)
Configure a channel (write full 32-bit CFG_CHx register)
Definition max22200.ipp:196
static constexpr uint8_t GetDriverVersionMajor() noexcept
Get the compiled driver major version number.
Definition max22200.hpp:980
DriverStatus GetHitTimeMs(uint8_t channel, float &ms) const
Get HIT time in milliseconds.
Definition max22200.ipp:1215
void SetStateChangeCallback(StateChangeCallback callback, void *user_data)
Register a channel state-change callback (stored for application use)
Definition max22200.ipp:638
DriverStatus GetHitCurrentPercent(uint8_t channel, float &percent) const
Get HIT current as percentage of IFS (CDR mode)
Definition max22200.ipp:959
DriverStatus SetHitCurrentPercent(uint8_t channel, float percent)
Set HIT current as percentage of IFS (CDR mode)
Definition max22200.ipp:893
DriverStatus SetHitTimeMs(uint8_t channel, float ms)
Set HIT time in milliseconds.
Definition max22200.ipp:1187
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:354
DriverStatus ClearFaultFlags()
Clear STATUS fault flags by reading the STATUS register.
Definition max22200.ipp:409
DriverStatus SetAllChannelsEnabled(bool enable)
Set all channels on or off at once (convenience when toggling from a variable)
Definition max22200.ipp:305
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:1273
uint8_t GetLastFaultByte() const
Get last fault flags byte received from Command Register write.
Definition max22200.ipp:580
DriverStatus EnableAllChannels()
Turn on all channels.
Definition max22200.ipp:295
DriverStatus ReadStatus(StatusConfig &status) const
Read the full 32-bit STATUS register.
Definition max22200.ipp:167
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.hpp:78
std::array< ChannelConfig, NUM_CHANNELS_ > ChannelConfigArray
Array type for channel configurations.
Definition max22200_types.hpp:1035
void(*)(uint8_t channel, FaultType fault_type, void *user_data) FaultCallback
Callback function type for fault events.
Definition max22200_types.hpp:1048
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 operation result codes.
Definition max22200_types.hpp:985
FullBridgeState
Full-bridge state for a channel pair (datasheet Table 7)
Definition max22200_types.hpp:973
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:1061
const char * GetDriverVersion() noexcept
Get the compiled driver version string (namespace-level convenience)
Definition max22200.hpp:1105
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.
constexpr uint8_t NUM_CHANNELS_
Number of channels on the MAX22200.
Definition max22200_registers.hpp:60
Board/scale configuration for unit-based APIs.
Definition max22200_types.hpp:1089
Channel configuration structure.
Definition max22200_types.hpp:402
DPM (Detection of Plunger Movement) algorithm configuration.
Definition max22200_types.hpp:940
Driver runtime statistics.
Definition max22200_types.hpp:1165
Duty cycle limits (δMIN, δMAX) for a given configuration.
Definition max22200_types.hpp:1136
Per-channel fault information from FAULT register (0x09)
Definition max22200_types.hpp:859
STATUS register structure.
Definition max22200_types.hpp:683