In the end I managed to fix it. HALShow was really helpful, and using a small oscilloscope made it easy to see exactly where the signal chain was stopping.
I’ll leave the relevant HAL and INI sections below in case anyone else needs them.
HAL Part
# ---setup spindle control signals---
setp hm2_[MESA](BOARD).0.pwmgen.pwm_frequency [SPINDLE_0](PWM_FREQUENCY)
setp hm2_[MESA](BOARD).0.pwmgen.00.scale [SPINDLE_0](SCALE)
net spindle-enable spindle.0.forward => hm2_[MESA](BOARD).0.pwmgen.00.enable
net spindle-speed-cmd spindle.0.speed-out => hm2_[MESA](BOARD).0.pwmgen.00.value
net spindle-enable => hm2_7i95.0.ssr.00.out-01
INI Part
[SPINDLE_0]
PWM_FREQUENCY = 2000
P = 0.0
I = 0.0
D = 0.0
FF0 = 1.0
FF1 = 0.0
FF2 = 0.0
BIAS = 0.0
DEADBAND = 0.0
SCALE = 24000
MIN_RPM = 3000
Thanks everyone for the help!