Hi Jeff,
Ending a Program with M2 or M30 performs a number of things including M5 Spindle off. Here is a comment from the code:
The following resets have been added by calling the appropriate
canonical machining command and/or by resetting interpreter
settings. They occur on M2 or M30.
1. Axis offsets are set to zero (like g92.2) and - SET_ORIGIN_OFFSETS
origin offsets are set to the default (like G54)
2. Selected plane is set to CANON_PLANE_XY (like G17) - SELECT_PLANE
3. Distance mode is set to MODE_ABSOLUTE (like G90) - no canonical call
4. Feed mode is set to UNITS_PER_MINUTE (like G94) - no canonical call
5. Feed and speed overrides are set to ON (like M48) - ENABLE_FEED_OVERRIDE
- ENABLE_SPEED_OVERRIDE
6. Cutter compensation is turned off (like G40) - no canonical call
7. The spindle is stopped (like M5) - STOP_SPINDLE_TURNING
8. The motion mode is set to G_1 (like G1) - no canonical call
9. Coolant is turned off (like M9)
So Spindle off should be expected. It isn't clear to me how your other machines do not turn off the Spindle. Possibly M5 is not configured to actually turn off the spindle? I can't think of why using a KStep Board would make a difference other than the bit number used to control the spindle. Maybe M5 is configured to always turn off Bit0 which is the the Spindle with KStep but an unused bit for your other systems?
Maybe you could terminate your Manual Move sequence with M0. This should do nothing except stop execution.
Regards