L6470 SPI daisy chain support (#12895)

This commit is contained in:
Bob Kuhn
2019-01-23 19:06:54 -06:00
committed by Scott Lahteine
parent 6453b82a5e
commit 2f35747f29
95 changed files with 7844 additions and 1429 deletions

View File

@ -79,6 +79,8 @@
#include "stepper.h"
Stepper stepper; // Singleton
#ifdef __AVR__
#include "speed_lookuptable.h"
#endif
@ -107,12 +109,14 @@
#include "../feature/mixing.h"
#endif
Stepper stepper; // Singleton
#if FILAMENT_RUNOUT_DISTANCE_MM > 0
#include "../feature/runout.h"
#endif
#if HAS_DRIVER(L6470)
#include "../libs/L6470/L6470_Marlin.h"
#endif
// public:
#if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS || ENABLED(Z_STEPPER_AUTO_ALIGN)
@ -350,22 +354,28 @@ void Stepper::wake_up() {
*/
void Stepper::set_directions() {
#define SET_STEP_DIR(A) \
if (motor_direction(_AXIS(A))) { \
A##_APPLY_DIR(INVERT_## A##_DIR, false); \
count_direction[_AXIS(A)] = -1; \
} \
else { \
#if HAS_DRIVER(L6470)
uint8_t L6470_buf[MAX_L6470 + 1]; // chip command sequence - element 0 not used
#endif
#define SET_STEP_DIR(A) \
if (motor_direction(_AXIS(A))) { \
A##_APPLY_DIR(INVERT_## A##_DIR, false); \
count_direction[_AXIS(A)] = -1; \
} \
else { \
A##_APPLY_DIR(!INVERT_## A##_DIR, false); \
count_direction[_AXIS(A)] = 1; \
count_direction[_AXIS(A)] = 1; \
}
#if HAS_X_DIR
SET_STEP_DIR(X); // A
#endif
#if HAS_Y_DIR
SET_STEP_DIR(Y); // B
#endif
#if HAS_Z_DIR
SET_STEP_DIR(Z); // C
#endif
@ -394,6 +404,27 @@ void Stepper::set_directions() {
#endif
#endif // !LIN_ADVANCE
#if HAS_DRIVER(L6470)
if (L6470.spi_active) {
L6470.spi_abort = true; // interrupted a SPI transfer - need to shut it down gracefully
for (uint8_t j = 1; j <= L6470::chain[0]; j++)
L6470_buf[j] = dSPIN_NOP; // fill buffer with NOOP commands
L6470.transfer(L6470_buf, L6470::chain[0]); // send enough NOOPs to complete any command
L6470.transfer(L6470_buf, L6470::chain[0]);
L6470.transfer(L6470_buf, L6470::chain[0]);
}
// The L6470.dir_commands[] array holds the direction command for each stepper
//scan command array and copy matches into L6470.transfer
for (uint8_t j = 1; j <= L6470::chain[0]; j++)
L6470_buf[j] = L6470.dir_commands[L6470::chain[j]];
L6470.transfer(L6470_buf, L6470::chain[0]); // send the command stream to the drivers
#endif
// A small delay may be needed after changing direction
#if MINIMUM_STEPPER_DIR_DELAY > 0
DELAY_NS(MINIMUM_STEPPER_DIR_DELAY);
@ -1766,10 +1797,15 @@ uint32_t Stepper::stepper_block_phase_isr() {
else LA_isr_rate = LA_ADV_NEVER;
#endif
if (current_block->direction_bits != last_direction_bits
if (
#if HAS_DRIVER(L6470)
true // Always set direction for L6470 (This also enables the chips)
#else
current_block->direction_bits != last_direction_bits
#if DISABLED(MIXING_EXTRUDER)
|| stepper_extruder != last_moved_extruder
#endif
#endif
) {
last_direction_bits = current_block->direction_bits;
#if EXTRUDERS > 1
@ -2113,7 +2149,10 @@ void Stepper::init() {
ENABLE_STEPPER_DRIVER_INTERRUPT();
sei();
set_directions(); // Init directions to last_direction_bits = 0 Keeps Z from being reversed
Z_DIR_WRITE(0); // Init directions to last_direction_bits = 0 Keeps Z from being reversed
Z2_DIR_WRITE(0);
Z3_DIR_WRITE(0);
}
/**

View File

@ -37,6 +37,10 @@
#include "../module/stepper.h"
#if HAS_DRIVER(L6470)
#include "L6470/L6470_Marlin.h"
#endif
//
// TMC26X Driver objects and inits
//
@ -51,43 +55,43 @@
#define _TMC26X_DEFINE(ST) TMC26XStepper stepper##ST(200, ST##_CS_PIN, ST##_STEP_PIN, ST##_DIR_PIN, ST##_MAX_CURRENT, ST##_SENSE_RESISTOR)
#if AXIS_DRIVER_TYPE(X, TMC26X)
#if AXIS_DRIVER_TYPE_X(TMC26X)
_TMC26X_DEFINE(X);
#endif
#if AXIS_DRIVER_TYPE(X2, TMC26X)
#if AXIS_DRIVER_TYPE_X2(TMC26X)
_TMC26X_DEFINE(X2);
#endif
#if AXIS_DRIVER_TYPE(Y, TMC26X)
#if AXIS_DRIVER_TYPE_Y(TMC26X)
_TMC26X_DEFINE(Y);
#endif
#if AXIS_DRIVER_TYPE(Y2, TMC26X)
#if AXIS_DRIVER_TYPE_Y2(TMC26X)
_TMC26X_DEFINE(Y2);
#endif
#if AXIS_DRIVER_TYPE(Z, TMC26X)
#if AXIS_DRIVER_TYPE_Z(TMC26X)
_TMC26X_DEFINE(Z);
#endif
#if AXIS_DRIVER_TYPE(Z2, TMC26X)
#if AXIS_DRIVER_TYPE_Z2(TMC26X)
_TMC26X_DEFINE(Z2);
#endif
#if AXIS_DRIVER_TYPE(Z3, TMC26X)
#if AXIS_DRIVER_TYPE_Z3(TMC26X)
_TMC26X_DEFINE(Z3);
#endif
#if AXIS_DRIVER_TYPE(E0, TMC26X)
#if AXIS_DRIVER_TYPE_E0(TMC26X)
_TMC26X_DEFINE(E0);
#endif
#if AXIS_DRIVER_TYPE(E1, TMC26X)
#if AXIS_DRIVER_TYPE_E1(TMC26X)
_TMC26X_DEFINE(E1);
#endif
#if AXIS_DRIVER_TYPE(E2, TMC26X)
#if AXIS_DRIVER_TYPE_E2(TMC26X)
_TMC26X_DEFINE(E2);
#endif
#if AXIS_DRIVER_TYPE(E3, TMC26X)
#if AXIS_DRIVER_TYPE_E3(TMC26X)
_TMC26X_DEFINE(E3);
#endif
#if AXIS_DRIVER_TYPE(E4, TMC26X)
#if AXIS_DRIVER_TYPE_E4(TMC26X)
_TMC26X_DEFINE(E4);
#endif
#if AXIS_DRIVER_TYPE(E5, TMC26X)
#if AXIS_DRIVER_TYPE_E5(TMC26X)
_TMC26X_DEFINE(E5);
#endif
@ -97,43 +101,43 @@
}while(0)
void tmc26x_init_to_defaults() {
#if AXIS_DRIVER_TYPE(X, TMC26X)
#if AXIS_DRIVER_TYPE_X(TMC26X)
_TMC26X_INIT(X);
#endif
#if AXIS_DRIVER_TYPE(X2, TMC26X)
#if AXIS_DRIVER_TYPE_X2(TMC26X)
_TMC26X_INIT(X2);
#endif
#if AXIS_DRIVER_TYPE(Y, TMC26X)
#if AXIS_DRIVER_TYPE_Y(TMC26X)
_TMC26X_INIT(Y);
#endif
#if AXIS_DRIVER_TYPE(Y2, TMC26X)
#if AXIS_DRIVER_TYPE_Y2(TMC26X)
_TMC26X_INIT(Y2);
#endif
#if AXIS_DRIVER_TYPE(Z, TMC26X)
#if AXIS_DRIVER_TYPE_Z(TMC26X)
_TMC26X_INIT(Z);
#endif
#if AXIS_DRIVER_TYPE(Z2, TMC26X)
#if AXIS_DRIVER_TYPE_Z2(TMC26X)
_TMC26X_INIT(Z2);
#endif
#if AXIS_DRIVER_TYPE(Z3, TMC26X)
#if AXIS_DRIVER_TYPE_Z3(TMC26X)
_TMC26X_INIT(Z3);
#endif
#if AXIS_DRIVER_TYPE(E0, TMC26X)
#if AXIS_DRIVER_TYPE_E0(TMC26X)
_TMC26X_INIT(E0);
#endif
#if AXIS_DRIVER_TYPE(E1, TMC26X)
#if AXIS_DRIVER_TYPE_E1(TMC26X)
_TMC26X_INIT(E1);
#endif
#if AXIS_DRIVER_TYPE(E2, TMC26X)
#if AXIS_DRIVER_TYPE_E2(TMC26X)
_TMC26X_INIT(E2);
#endif
#if AXIS_DRIVER_TYPE(E3, TMC26X)
#if AXIS_DRIVER_TYPE_E3(TMC26X)
_TMC26X_INIT(E3);
#endif
#if AXIS_DRIVER_TYPE(E4, TMC26X)
#if AXIS_DRIVER_TYPE_E4(TMC26X)
_TMC26X_INIT(E4);
#endif
#if AXIS_DRIVER_TYPE(E5, TMC26X)
#if AXIS_DRIVER_TYPE_E5(TMC26X)
_TMC26X_INIT(E5);
#endif
}
@ -161,43 +165,43 @@
#define TMC2130_DEFINE(ST) _TMC2130_DEFINE(ST, TMC_##ST##_LABEL)
#endif
// Stepper objects of TMC2130 steppers used
#if AXIS_DRIVER_TYPE(X, TMC2130)
#if AXIS_DRIVER_TYPE_X(TMC2130)
TMC2130_DEFINE(X);
#endif
#if AXIS_DRIVER_TYPE(X2, TMC2130)
#if AXIS_DRIVER_TYPE_X2(TMC2130)
TMC2130_DEFINE(X2);
#endif
#if AXIS_DRIVER_TYPE(Y, TMC2130)
#if AXIS_DRIVER_TYPE_Y(TMC2130)
TMC2130_DEFINE(Y);
#endif
#if AXIS_DRIVER_TYPE(Y2, TMC2130)
#if AXIS_DRIVER_TYPE_Y2(TMC2130)
TMC2130_DEFINE(Y2);
#endif
#if AXIS_DRIVER_TYPE(Z, TMC2130)
#if AXIS_DRIVER_TYPE_Z(TMC2130)
TMC2130_DEFINE(Z);
#endif
#if AXIS_DRIVER_TYPE(Z2, TMC2130)
#if AXIS_DRIVER_TYPE_Z2(TMC2130)
TMC2130_DEFINE(Z2);
#endif
#if AXIS_DRIVER_TYPE(Z3, TMC2130)
#if AXIS_DRIVER_TYPE_Z3(TMC2130)
TMC2130_DEFINE(Z3);
#endif
#if AXIS_DRIVER_TYPE(E0, TMC2130)
#if AXIS_DRIVER_TYPE_E0(TMC2130)
TMC2130_DEFINE(E0);
#endif
#if AXIS_DRIVER_TYPE(E1, TMC2130)
#if AXIS_DRIVER_TYPE_E1(TMC2130)
TMC2130_DEFINE(E1);
#endif
#if AXIS_DRIVER_TYPE(E2, TMC2130)
#if AXIS_DRIVER_TYPE_E2(TMC2130)
TMC2130_DEFINE(E2);
#endif
#if AXIS_DRIVER_TYPE(E3, TMC2130)
#if AXIS_DRIVER_TYPE_E3(TMC2130)
TMC2130_DEFINE(E3);
#endif
#if AXIS_DRIVER_TYPE(E4, TMC2130)
#if AXIS_DRIVER_TYPE_E4(TMC2130)
TMC2130_DEFINE(E4);
#endif
#if AXIS_DRIVER_TYPE(E5, TMC2130)
#if AXIS_DRIVER_TYPE_E5(TMC2130)
TMC2130_DEFINE(E5);
#endif
@ -253,91 +257,91 @@
#define TMC2208_DEFINE_SOFTWARE(ST) _TMC2208_DEFINE_SOFTWARE(ST, TMC_##ST##_LABEL)
// Stepper objects of TMC2208 steppers used
#if AXIS_DRIVER_TYPE(X, TMC2208)
#if AXIS_DRIVER_TYPE_X(TMC2208)
#ifdef X_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(X);
#else
TMC2208_DEFINE_SOFTWARE(X);
#endif
#endif
#if AXIS_DRIVER_TYPE(X2, TMC2208)
#if AXIS_DRIVER_TYPE_X2(TMC2208)
#ifdef X2_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(X2);
#else
TMC2208_DEFINE_SOFTWARE(X2);
#endif
#endif
#if AXIS_DRIVER_TYPE(Y, TMC2208)
#if AXIS_DRIVER_TYPE_Y(TMC2208)
#ifdef Y_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(Y);
#else
TMC2208_DEFINE_SOFTWARE(Y);
#endif
#endif
#if AXIS_DRIVER_TYPE(Y2, TMC2208)
#if AXIS_DRIVER_TYPE_Y2(TMC2208)
#ifdef Y2_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(Y2);
#else
TMC2208_DEFINE_SOFTWARE(Y2);
#endif
#endif
#if AXIS_DRIVER_TYPE(Z, TMC2208)
#if AXIS_DRIVER_TYPE_Z(TMC2208)
#ifdef Z_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(Z);
#else
TMC2208_DEFINE_SOFTWARE(Z);
#endif
#endif
#if AXIS_DRIVER_TYPE(Z2, TMC2208)
#if AXIS_DRIVER_TYPE_Z2(TMC2208)
#ifdef Z2_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(Z2);
#else
TMC2208_DEFINE_SOFTWARE(Z2);
#endif
#endif
#if AXIS_DRIVER_TYPE(Z3, TMC2208)
#if AXIS_DRIVER_TYPE_Z3(TMC2208)
#ifdef Z3_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(Z3);
#else
TMC2208_DEFINE_SOFTWARE(Z3);
#endif
#endif
#if AXIS_DRIVER_TYPE(E0, TMC2208)
#if AXIS_DRIVER_TYPE_E0(TMC2208)
#ifdef E0_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(E0);
#else
TMC2208_DEFINE_SOFTWARE(E0);
#endif
#endif
#if AXIS_DRIVER_TYPE(E1, TMC2208)
#if AXIS_DRIVER_TYPE_E1(TMC2208)
#ifdef E1_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(E1);
#else
TMC2208_DEFINE_SOFTWARE(E1);
#endif
#endif
#if AXIS_DRIVER_TYPE(E2, TMC2208)
#if AXIS_DRIVER_TYPE_E2(TMC2208)
#ifdef E2_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(E2);
#else
TMC2208_DEFINE_SOFTWARE(E2);
#endif
#endif
#if AXIS_DRIVER_TYPE(E3, TMC2208)
#if AXIS_DRIVER_TYPE_E3(TMC2208)
#ifdef E3_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(E3);
#else
TMC2208_DEFINE_SOFTWARE(E3);
#endif
#endif
#if AXIS_DRIVER_TYPE(E4, TMC2208)
#if AXIS_DRIVER_TYPE_E4(TMC2208)
#ifdef E4_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(E4);
#else
TMC2208_DEFINE_SOFTWARE(E4);
#endif
#endif
#if AXIS_DRIVER_TYPE(E5, TMC2208)
#if AXIS_DRIVER_TYPE_E5(TMC2208)
#ifdef E5_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(E5);
#else
@ -346,91 +350,91 @@
#endif
void tmc2208_serial_begin() {
#if AXIS_DRIVER_TYPE(X, TMC2208)
#if AXIS_DRIVER_TYPE_X(TMC2208)
#ifdef X_HARDWARE_SERIAL
X_HARDWARE_SERIAL.begin(115200);
#else
stepperX.beginSerial(115200);
#endif
#endif
#if AXIS_DRIVER_TYPE(X2, TMC2208)
#if AXIS_DRIVER_TYPE_X2(TMC2208)
#ifdef X2_HARDWARE_SERIAL
X2_HARDWARE_SERIAL.begin(115200);
#else
stepperX2.beginSerial(115200);
#endif
#endif
#if AXIS_DRIVER_TYPE(Y, TMC2208)
#if AXIS_DRIVER_TYPE_Y(TMC2208)
#ifdef Y_HARDWARE_SERIAL
Y_HARDWARE_SERIAL.begin(115200);
#else
stepperY.beginSerial(115200);
#endif
#endif
#if AXIS_DRIVER_TYPE(Y2, TMC2208)
#if AXIS_DRIVER_TYPE_Y2(TMC2208)
#ifdef Y2_HARDWARE_SERIAL
Y2_HARDWARE_SERIAL.begin(115200);
#else
stepperY2.beginSerial(115200);
#endif
#endif
#if AXIS_DRIVER_TYPE(Z, TMC2208)
#if AXIS_DRIVER_TYPE_Z(TMC2208)
#ifdef Z_HARDWARE_SERIAL
Z_HARDWARE_SERIAL.begin(115200);
#else
stepperZ.beginSerial(115200);
#endif
#endif
#if AXIS_DRIVER_TYPE(Z2, TMC2208)
#if AXIS_DRIVER_TYPE_Z2(TMC2208)
#ifdef Z2_HARDWARE_SERIAL
Z2_HARDWARE_SERIAL.begin(115200);
#else
stepperZ2.beginSerial(115200);
#endif
#endif
#if AXIS_DRIVER_TYPE(Z3, TMC2208)
#if AXIS_DRIVER_TYPE_Z3(TMC2208)
#ifdef Z3_HARDWARE_SERIAL
Z3_HARDWARE_SERIAL.begin(115200);
#else
stepperZ3.beginSerial(115200);
#endif
#endif
#if AXIS_DRIVER_TYPE(E0, TMC2208)
#if AXIS_DRIVER_TYPE_E0(TMC2208)
#ifdef E0_HARDWARE_SERIAL
E0_HARDWARE_SERIAL.begin(115200);
#else
stepperE0.beginSerial(115200);
#endif
#endif
#if AXIS_DRIVER_TYPE(E1, TMC2208)
#if AXIS_DRIVER_TYPE_E1(TMC2208)
#ifdef E1_HARDWARE_SERIAL
E1_HARDWARE_SERIAL.begin(115200);
#else
stepperE1.beginSerial(115200);
#endif
#endif
#if AXIS_DRIVER_TYPE(E2, TMC2208)
#if AXIS_DRIVER_TYPE_E2(TMC2208)
#ifdef E2_HARDWARE_SERIAL
E2_HARDWARE_SERIAL.begin(115200);
#else
stepperE2.beginSerial(115200);
#endif
#endif
#if AXIS_DRIVER_TYPE(E3, TMC2208)
#if AXIS_DRIVER_TYPE_E3(TMC2208)
#ifdef E3_HARDWARE_SERIAL
E3_HARDWARE_SERIAL.begin(115200);
#else
stepperE3.beginSerial(115200);
#endif
#endif
#if AXIS_DRIVER_TYPE(E4, TMC2208)
#if AXIS_DRIVER_TYPE_E4(TMC2208)
#ifdef E4_HARDWARE_SERIAL
E4_HARDWARE_SERIAL.begin(115200);
#else
stepperE4.beginSerial(115200);
#endif
#endif
#if AXIS_DRIVER_TYPE(E5, TMC2208)
#if AXIS_DRIVER_TYPE_E5(TMC2208)
#ifdef E5_HARDWARE_SERIAL
E5_HARDWARE_SERIAL.begin(115200);
#else
@ -502,40 +506,40 @@
#endif
// Stepper objects of TMC2660 steppers used
#if AXIS_DRIVER_TYPE(X, TMC2660)
#if AXIS_DRIVER_TYPE_X(TMC2660)
TMC2660_DEFINE(X);
#endif
#if AXIS_DRIVER_TYPE(X2, TMC2660)
#if AXIS_DRIVER_TYPE_X2(TMC2660)
TMC2660_DEFINE(X2);
#endif
#if AXIS_DRIVER_TYPE(Y, TMC2660)
#if AXIS_DRIVER_TYPE_Y(TMC2660)
TMC2660_DEFINE(Y);
#endif
#if AXIS_DRIVER_TYPE(Y2, TMC2660)
#if AXIS_DRIVER_TYPE_Y2(TMC2660)
TMC2660_DEFINE(Y2);
#endif
#if AXIS_DRIVER_TYPE(Z, TMC2660)
#if AXIS_DRIVER_TYPE_Z(TMC2660)
TMC2660_DEFINE(Z);
#endif
#if AXIS_DRIVER_TYPE(Z2, TMC2660)
#if AXIS_DRIVER_TYPE_Z2(TMC2660)
TMC2660_DEFINE(Z2);
#endif
#if AXIS_DRIVER_TYPE(E0, TMC2660)
#if AXIS_DRIVER_TYPE_E0(TMC2660)
TMC2660_DEFINE(E0);
#endif
#if AXIS_DRIVER_TYPE(E1, TMC2660)
#if AXIS_DRIVER_TYPE_E1(TMC2660)
TMC2660_DEFINE(E1);
#endif
#if AXIS_DRIVER_TYPE(E2, TMC2660)
#if AXIS_DRIVER_TYPE_E2(TMC2660)
TMC2660_DEFINE(E2);
#endif
#if AXIS_DRIVER_TYPE(E3, TMC2660)
#if AXIS_DRIVER_TYPE_E3(TMC2660)
TMC2660_DEFINE(E3);
#endif
#if AXIS_DRIVER_TYPE(E4, TMC2660)
#if AXIS_DRIVER_TYPE_E4(TMC2660)
TMC2660_DEFINE(E4);
#endif
#if AXIS_DRIVER_TYPE(E5, TMC2660)
#if AXIS_DRIVER_TYPE_E5(TMC2660)
TMC2660_DEFINE(E5);
#endif
@ -600,11 +604,13 @@ void restore_stepper_drivers() {
}
void reset_stepper_drivers() {
#if HAS_DRIVER(TMC26X)
tmc26x_init_to_defaults();
#endif
#if ENABLED(HAVE_L6470DRIVER)
L6470_init_to_defaults();
#if HAS_DRIVER(L6470)
L6470.init_to_defaults();
#endif
#if HAS_TRINAMIC
@ -703,7 +709,9 @@ void reset_stepper_drivers() {
TMC_ADV()
#endif
stepper.set_directions();
#if HAS_TRINAMIC
stepper.set_directions();
#endif
}
//
@ -711,99 +719,114 @@ void reset_stepper_drivers() {
//
#if HAS_DRIVER(L6470)
#include <SPI.h>
#include <L6470.h>
// create stepper objects
#define _L6470_DEFINE(ST) L6470 stepper##ST(ST##_ENABLE_PIN)
#define _L6470_DEFINE(ST) L6470 stepper##ST((const int)L6470_CHAIN_SS_PIN)
// L6470 Stepper objects
#if AXIS_DRIVER_TYPE(X, L6470)
#if AXIS_DRIVER_TYPE_X(L6470)
_L6470_DEFINE(X);
#endif
#if AXIS_DRIVER_TYPE(X2, L6470)
#if AXIS_DRIVER_TYPE_X2(L6470)
_L6470_DEFINE(X2);
#endif
#if AXIS_DRIVER_TYPE(Y, L6470)
#if AXIS_DRIVER_TYPE_Y(L6470)
_L6470_DEFINE(Y);
#endif
#if AXIS_DRIVER_TYPE(Y2, L6470)
#if AXIS_DRIVER_TYPE_Y2(L6470)
_L6470_DEFINE(Y2);
#endif
#if AXIS_DRIVER_TYPE(Z, L6470)
#if AXIS_DRIVER_TYPE_Z(L6470)
_L6470_DEFINE(Z);
#endif
#if AXIS_DRIVER_TYPE(Z2, L6470)
#if AXIS_DRIVER_TYPE_Z2(L6470)
_L6470_DEFINE(Z2);
#endif
#if AXIS_DRIVER_TYPE(Z3, L6470)
#if AXIS_DRIVER_TYPE_Z3(L6470)
_L6470_DEFINE(Z3);
#endif
#if AXIS_DRIVER_TYPE(E0, L6470)
#if AXIS_DRIVER_TYPE_E0(L6470)
_L6470_DEFINE(E0);
#endif
#if AXIS_DRIVER_TYPE(E1, L6470)
#if AXIS_DRIVER_TYPE_E1(L6470)
_L6470_DEFINE(E1);
#endif
#if AXIS_DRIVER_TYPE(E2, L6470)
#if AXIS_DRIVER_TYPE_E2(L6470)
_L6470_DEFINE(E2);
#endif
#if AXIS_DRIVER_TYPE(E3, L6470)
#if AXIS_DRIVER_TYPE_E3(L6470)
_L6470_DEFINE(E3);
#endif
#if AXIS_DRIVER_TYPE(E4, L6470)
#if AXIS_DRIVER_TYPE_E4(L6470)
_L6470_DEFINE(E4);
#endif
#if AXIS_DRIVER_TYPE(E5, L6470)
#if AXIS_DRIVER_TYPE_E5(L6470)
_L6470_DEFINE(E5);
#endif
#define _L6470_INIT(A) do{ \
stepper##A.init(); \
stepper##A.softFree(); \
stepper##A.setMicroSteps(A##_MICROSTEPS); \
stepper##A.setOverCurrent(A##_OVERCURRENT); \
stepper##A.setStallCurrent(A##_STALLCURRENT); \
// not using L6470 library's init command because it
// briefly sends power to the steppers
#define _L6470_INIT_CHIP(Q) do{ \
stepper##Q.resetDev(); \
stepper##Q.softFree(); \
stepper##Q.SetParam(L6470_CONFIG, CONFIG_PWM_DIV_1 \
| CONFIG_PWM_MUL_2 \
| CONFIG_SR_290V_us \
| CONFIG_OC_SD_DISABLE \
| CONFIG_VS_COMP_DISABLE \
| CONFIG_SW_HARD_STOP \
| CONFIG_INT_16MHZ); \
stepper##Q.SetParam(L6470_KVAL_RUN, 0xFF); \
stepper##Q.SetParam(L6470_KVAL_ACC, 0xFF); \
stepper##Q.SetParam(L6470_KVAL_DEC, 0xFF); \
stepper##Q.setMicroSteps(Q##_MICROSTEPS); \
stepper##Q.setOverCurrent(Q##_OVERCURRENT); \
stepper##Q.setStallCurrent(Q##_STALLCURRENT); \
stepper##Q.SetParam(L6470_KVAL_HOLD, Q##_MAX_VOLTAGE); \
stepper##Q.SetParam(L6470_ABS_POS, 0); \
stepper##Q.getStatus(); \
}while(0)
void L6470_init_to_defaults() {
#if AXIS_DRIVER_TYPE(X, L6470)
_L6470_INIT(X);
void L6470_Marlin::init_to_defaults() {
#if AXIS_DRIVER_TYPE_X(L6470)
_L6470_INIT_CHIP(X);
#endif
#if AXIS_DRIVER_TYPE(X2, L6470)
_L6470_INIT(X2);
#if AXIS_DRIVER_TYPE_X2(L6470)
_L6470_INIT_CHIP(X2);
#endif
#if AXIS_DRIVER_TYPE(Y, L6470)
_L6470_INIT(Y);
#if AXIS_DRIVER_TYPE_Y(L6470)
_L6470_INIT_CHIP(Y);
#endif
#if AXIS_DRIVER_TYPE(Y2, L6470)
_L6470_INIT(Y2);
#if AXIS_DRIVER_TYPE_Y2(L6470)
_L6470_INIT_CHIP(Y2);
#endif
#if AXIS_DRIVER_TYPE(Z, L6470)
_L6470_INIT(Z);
#if AXIS_DRIVER_TYPE_Z(L6470)
_L6470_INIT_CHIP(Z);
#endif
#if AXIS_DRIVER_TYPE(Z2, L6470)
_L6470_INIT(Z2);
#if AXIS_DRIVER_TYPE_Z2(L6470)
_L6470_INIT_CHIP(Z2);
#endif
#if AXIS_DRIVER_TYPE(Z3, L6470)
_L6470_INIT(Z3);
#if AXIS_DRIVER_TYPE_Z3(L6470)
_L6470_INIT_CHIP(Z3);
#endif
#if AXIS_DRIVER_TYPE(E0, L6470)
_L6470_INIT(E0);
#if AXIS_DRIVER_TYPE_E0(L6470)
_L6470_INIT_CHIP(E0);
#endif
#if AXIS_DRIVER_TYPE(E1, L6470)
_L6470_INIT(E1);
#if AXIS_DRIVER_TYPE_E1(L6470)
_L6470_INIT_CHIP(E1);
#endif
#if AXIS_DRIVER_TYPE(E2, L6470)
_L6470_INIT(E2);
#if AXIS_DRIVER_TYPE_E2(L6470)
_L6470_INIT_CHIP(E2);
#endif
#if AXIS_DRIVER_TYPE(E3, L6470)
_L6470_INIT(E3);
#if AXIS_DRIVER_TYPE_E3(L6470)
_L6470_INIT_CHIP(E3);
#endif
#if AXIS_DRIVER_TYPE(E4, L6470)
_L6470_INIT(E4);
#if AXIS_DRIVER_TYPE_E4(L6470)
_L6470_INIT_CHIP(E4);
#endif
#if AXIS_DRIVER_TYPE(E5, L6470)
_L6470_INIT(E5);
#if AXIS_DRIVER_TYPE_E5(L6470)
_L6470_INIT_CHIP(E5);
#endif
}

View File

@ -83,28 +83,27 @@
// L6470 has STEP on normal pins, but DIR/ENABLE via SPI
#if HAS_DRIVER(L6470)
#include <SPI.h>
#include <L6470.h>
void L6470_init_to_defaults();
#include "L6470/L6470_Marlin.h"
#define L6470_WRITE_DIR_COMMAND(STATE,Q) do{ L6470_dir_commands[Q] = (STATE ? dSPIN_STEP_CLOCK_REV : dSPIN_STEP_CLOCK_FWD); }while(0)
#endif
void restore_stepper_drivers(); // Called by PSU_ON
void reset_stepper_drivers(); // Called by settings.load / settings.reset
// X Stepper
#if AXIS_DRIVER_TYPE(X, L6470)
#if AXIS_DRIVER_TYPE_X(L6470)
extern L6470 stepperX;
#define X_ENABLE_INIT NOOP
#define X_ENABLE_WRITE(STATE) do{ if (STATE) stepperX.Step_Clock(stepperX.getStatus() & STATUS_HIZ); else stepperX.softFree(); }while(0)
#define X_ENABLE_WRITE(STATE) NOOP
#define X_ENABLE_READ (stepperX.getStatus() & STATUS_HIZ)
#define X_DIR_INIT NOOP
#define X_DIR_WRITE(STATE) stepperX.Step_Clock(STATE)
#define X_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,X)
#define X_DIR_READ (stepperX.getStatus() & STATUS_DIR)
#else
#if AXIS_IS_TMC(X)
extern TMC_CLASS(X) stepperX;
#endif
#if AXIS_DRIVER_TYPE(X, TMC26X)
#if AXIS_DRIVER_TYPE_X(TMC26X)
extern TMC26XStepper stepperX;
#define X_ENABLE_INIT NOOP
#define X_ENABLE_WRITE(STATE) stepperX.setEnabled(STATE)
@ -127,19 +126,19 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define X_STEP_READ READ(X_STEP_PIN)
// Y Stepper
#if AXIS_DRIVER_TYPE(Y, L6470)
#if AXIS_DRIVER_TYPE_Y(L6470)
extern L6470 stepperY;
#define Y_ENABLE_INIT NOOP
#define Y_ENABLE_WRITE(STATE) do{ if (STATE) stepperY.Step_Clock(stepperY.getStatus() & STATUS_HIZ); else stepperY.softFree(); }while(0)
#define Y_ENABLE_WRITE(STATE) NOOP
#define Y_ENABLE_READ (stepperY.getStatus() & STATUS_HIZ)
#define Y_DIR_INIT NOOP
#define Y_DIR_WRITE(STATE) stepperY.Step_Clock(STATE)
#define Y_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,Y)
#define Y_DIR_READ (stepperY.getStatus() & STATUS_DIR)
#else
#if AXIS_IS_TMC(Y)
extern TMC_CLASS(Y) stepperY;
#endif
#if AXIS_DRIVER_TYPE(Y, TMC26X)
#if AXIS_DRIVER_TYPE_Y(TMC26X)
extern TMC26XStepper stepperY;
#define Y_ENABLE_INIT NOOP
#define Y_ENABLE_WRITE(STATE) stepperY.setEnabled(STATE)
@ -162,19 +161,19 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define Y_STEP_READ READ(Y_STEP_PIN)
// Z Stepper
#if AXIS_DRIVER_TYPE(Z, L6470)
#if AXIS_DRIVER_TYPE_Z(L6470)
extern L6470 stepperZ;
#define Z_ENABLE_INIT NOOP
#define Z_ENABLE_WRITE(STATE) do{ if (STATE) stepperZ.Step_Clock(stepperZ.getStatus() & STATUS_HIZ); else stepperZ.softFree(); }while(0)
#define Z_ENABLE_WRITE(STATE) NOOP
#define Z_ENABLE_READ (stepperZ.getStatus() & STATUS_HIZ)
#define Z_DIR_INIT NOOP
#define Z_DIR_WRITE(STATE) stepperZ.Step_Clock(STATE)
#define Z_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,Z)
#define Z_DIR_READ (stepperZ.getStatus() & STATUS_DIR)
#else
#if AXIS_IS_TMC(Z)
extern TMC_CLASS(Z) stepperZ;
#endif
#if AXIS_DRIVER_TYPE(Z, TMC26X)
#if AXIS_DRIVER_TYPE_Z(TMC26X)
extern TMC26XStepper stepperZ;
#define Z_ENABLE_INIT NOOP
#define Z_ENABLE_WRITE(STATE) stepperZ.setEnabled(STATE)
@ -198,19 +197,19 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
// X2 Stepper
#if HAS_X2_ENABLE
#if AXIS_DRIVER_TYPE(X2, L6470)
#if AXIS_DRIVER_TYPE_X2(L6470)
extern L6470 stepperX2;
#define X2_ENABLE_INIT NOOP
#define X2_ENABLE_WRITE(STATE) do{ if (STATE) stepperX2.Step_Clock(stepperX2.getStatus() & STATUS_HIZ); else stepperX2.softFree(); }while(0)
#define X2_ENABLE_WRITE(STATE) NOOP
#define X2_ENABLE_READ (stepperX2.getStatus() & STATUS_HIZ)
#define X2_DIR_INIT NOOP
#define X2_DIR_WRITE(STATE) stepperX2.Step_Clock(STATE)
#define X2_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,X2)
#define X2_DIR_READ (stepperX2.getStatus() & STATUS_DIR)
#else
#if AXIS_IS_TMC(X2)
extern TMC_CLASS(X2) stepperX2;
#endif
#if AXIS_DRIVER_TYPE(X2, TMC26X)
#if AXIS_DRIVER_TYPE_X2(TMC26X)
extern TMC26XStepper stepperX2;
#define X2_ENABLE_INIT NOOP
#define X2_ENABLE_WRITE(STATE) stepperX2.setEnabled(STATE)
@ -235,19 +234,19 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
// Y2 Stepper
#if HAS_Y2_ENABLE
#if AXIS_DRIVER_TYPE(Y2, L6470)
#if AXIS_DRIVER_TYPE_Y2(L6470)
extern L6470 stepperY2;
#define Y2_ENABLE_INIT NOOP
#define Y2_ENABLE_WRITE(STATE) do{ if (STATE) stepperY2.Step_Clock(stepperY2.getStatus() & STATUS_HIZ); else stepperY2.softFree(); }while(0)
#define Y2_ENABLE_WRITE(STATE) NOOP
#define Y2_ENABLE_READ (stepperY2.getStatus() & STATUS_HIZ)
#define Y2_DIR_INIT NOOP
#define Y2_DIR_WRITE(STATE) stepperY2.Step_Clock(STATE)
#define Y2_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,Y2)
#define Y2_DIR_READ (stepperY2.getStatus() & STATUS_DIR)
#else
#if AXIS_IS_TMC(Y2)
extern TMC_CLASS(Y2) stepperY2;
#endif
#if AXIS_DRIVER_TYPE(Y2, TMC26X)
#if AXIS_DRIVER_TYPE_Y2(TMC26X)
extern TMC26XStepper stepperY2;
#define Y2_ENABLE_INIT NOOP
#define Y2_ENABLE_WRITE(STATE) stepperY2.setEnabled(STATE)
@ -268,23 +267,25 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define Y2_STEP_INIT SET_OUTPUT(Y2_STEP_PIN)
#define Y2_STEP_WRITE(STATE) WRITE(Y2_STEP_PIN,STATE)
#define Y2_STEP_READ READ(Y2_STEP_PIN)
#else
#define Y2_DIR_WRITE(STATE) NOOP
#endif
// Z2 Stepper
#if HAS_Z2_ENABLE
#if AXIS_DRIVER_TYPE(Z2, L6470)
#if AXIS_DRIVER_TYPE_Z2(L6470)
extern L6470 stepperZ2;
#define Z2_ENABLE_INIT NOOP
#define Z2_ENABLE_WRITE(STATE) do{ if (STATE) stepperZ2.Step_Clock(stepperZ2.getStatus() & STATUS_HIZ); else stepperZ2.softFree(); }while(0)
#define Z2_ENABLE_WRITE(STATE) NOOP
#define Z2_ENABLE_READ (stepperZ2.getStatus() & STATUS_HIZ)
#define Z2_DIR_INIT NOOP
#define Z2_DIR_WRITE(STATE) stepperZ2.Step_Clock(STATE)
#define Z2_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,Z2)
#define Z2_DIR_READ (stepperZ2.getStatus() & STATUS_DIR)
#else
#if AXIS_IS_TMC(Z2)
extern TMC_CLASS(Z2) stepperZ2;
#endif
#if AXIS_DRIVER_TYPE(Z2, TMC26X)
#if AXIS_DRIVER_TYPE_Z2(TMC26X)
extern TMC26XStepper stepperZ2;
#define Z2_ENABLE_INIT NOOP
#define Z2_ENABLE_WRITE(STATE) stepperZ2.setEnabled(STATE)
@ -305,17 +306,19 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define Z2_STEP_INIT SET_OUTPUT(Z2_STEP_PIN)
#define Z2_STEP_WRITE(STATE) WRITE(Z2_STEP_PIN,STATE)
#define Z2_STEP_READ READ(Z2_STEP_PIN)
#else
#define Z2_DIR_WRITE(STATE) NOOP
#endif
// Z3 Stepper
#if HAS_Z3_ENABLE
#if ENABLED(Z3_IS_L6470)
#if AXIS_DRIVER_TYPE_Z3(L6470)
extern L6470 stepperZ3;
#define Z3_ENABLE_INIT NOOP
#define Z3_ENABLE_WRITE(STATE) do{ if (STATE) stepperZ3.Step_Clock(stepperZ3.getStatus() & STATUS_HIZ); else stepperZ3.softFree(); }while(0)
#define Z3_ENABLE_WRITE(STATE) NOOP
#define Z3_ENABLE_READ (stepperZ3.getStatus() & STATUS_HIZ)
#define Z3_DIR_INIT NOOP
#define Z3_DIR_WRITE(STATE) stepperZ3.Step_Clock(STATE)
#define Z3_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,Z3)
#define Z3_DIR_READ (stepperZ3.getStatus() & STATUS_DIR)
#else
#if AXIS_IS_TMC(Z3)
@ -342,22 +345,24 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define Z3_STEP_INIT SET_OUTPUT(Z3_STEP_PIN)
#define Z3_STEP_WRITE(STATE) WRITE(Z3_STEP_PIN,STATE)
#define Z3_STEP_READ READ(Z3_STEP_PIN)
#else
#define Z3_DIR_WRITE(STATE) NOOP
#endif
// E0 Stepper
#if AXIS_DRIVER_TYPE(E0, L6470)
#if AXIS_DRIVER_TYPE_E0(L6470)
extern L6470 stepperE0;
#define E0_ENABLE_INIT NOOP
#define E0_ENABLE_WRITE(STATE) do{ if (STATE) stepperE0.Step_Clock(stepperE0.getStatus() & STATUS_HIZ); else stepperE0.softFree(); }while(0)
#define E0_ENABLE_WRITE(STATE) NOOP
#define E0_ENABLE_READ (stepperE0.getStatus() & STATUS_HIZ)
#define E0_DIR_INIT NOOP
#define E0_DIR_WRITE(STATE) stepperE0.Step_Clock(STATE)
#define E0_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E0)
#define E0_DIR_READ (stepperE0.getStatus() & STATUS_DIR)
#else
#if AXIS_IS_TMC(E0)
extern TMC_CLASS(E0) stepperE0;
#endif
#if AXIS_DRIVER_TYPE(E0, TMC26X)
#if AXIS_DRIVER_TYPE_E0(TMC26X)
extern TMC26XStepper stepperE0;
#define E0_ENABLE_INIT NOOP
#define E0_ENABLE_WRITE(STATE) stepperE0.setEnabled(STATE)
@ -380,19 +385,19 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define E0_STEP_READ READ(E0_STEP_PIN)
// E1 Stepper
#if AXIS_DRIVER_TYPE(E1, L6470)
#if AXIS_DRIVER_TYPE_E1(L6470)
extern L6470 stepperE1;
#define E1_ENABLE_INIT NOOP
#define E1_ENABLE_WRITE(STATE) do{ if (STATE) stepperE1.Step_Clock(stepperE1.getStatus() & STATUS_HIZ); else stepperE1.softFree(); }while(0)
#define E1_ENABLE_WRITE(STATE) NOOP
#define E1_ENABLE_READ (stepperE1.getStatus() & STATUS_HIZ)
#define E1_DIR_INIT NOOP
#define E1_DIR_WRITE(STATE) stepperE1.Step_Clock(STATE)
#define E1_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E1)
#define E1_DIR_READ (stepperE1.getStatus() & STATUS_DIR)
#else
#if AXIS_IS_TMC(E1)
extern TMC_CLASS(E1) stepperE1;
#endif
#if AXIS_DRIVER_TYPE(E1, TMC26X)
#if AXIS_DRIVER_TYPE_E1(TMC26X)
extern TMC26XStepper stepperE1;
#define E1_ENABLE_INIT NOOP
#define E1_ENABLE_WRITE(STATE) stepperE1.setEnabled(STATE)
@ -415,19 +420,19 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define E1_STEP_READ READ(E1_STEP_PIN)
// E2 Stepper
#if AXIS_DRIVER_TYPE(E2, L6470)
#if AXIS_DRIVER_TYPE_E2(L6470)
extern L6470 stepperE2;
#define E2_ENABLE_INIT NOOP
#define E2_ENABLE_WRITE(STATE) do{ if (STATE) stepperE2.Step_Clock(stepperE2.getStatus() & STATUS_HIZ); else stepperE2.softFree(); }while(0)
#define E2_ENABLE_WRITE(STATE) NOOP
#define E2_ENABLE_READ (stepperE2.getStatus() & STATUS_HIZ)
#define E2_DIR_INIT NOOP
#define E2_DIR_WRITE(STATE) stepperE2.Step_Clock(STATE)
#define E2_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E2)
#define E2_DIR_READ (stepperE2.getStatus() & STATUS_DIR)
#else
#if AXIS_IS_TMC(E2)
extern TMC_CLASS(E2) stepperE2;
#endif
#if AXIS_DRIVER_TYPE(E2, TMC26X)
#if AXIS_DRIVER_TYPE_E2(TMC26X)
extern TMC26XStepper stepperE2;
#define E2_ENABLE_INIT NOOP
#define E2_ENABLE_WRITE(STATE) stepperE2.setEnabled(STATE)
@ -450,19 +455,19 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define E2_STEP_READ READ(E2_STEP_PIN)
// E3 Stepper
#if AXIS_DRIVER_TYPE(E3, L6470)
#if AXIS_DRIVER_TYPE_E3(L6470)
extern L6470 stepperE3;
#define E3_ENABLE_INIT NOOP
#define E3_ENABLE_WRITE(STATE) do{ if (STATE) stepperE3.Step_Clock(stepperE3.getStatus() & STATUS_HIZ); else stepperE3.softFree(); }while(0)
#define E3_ENABLE_WRITE(STATE) NOOP
#define E3_ENABLE_READ (stepperE3.getStatus() & STATUS_HIZ)
#define E3_DIR_INIT NOOP
#define E3_DIR_WRITE(STATE) stepperE3.Step_Clock(STATE)
#define E3_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E3)
#define E3_DIR_READ (stepperE3.getStatus() & STATUS_DIR)
#else
#if AXIS_IS_TMC(E3)
extern TMC_CLASS(E3) stepperE3;
#endif
#if AXIS_DRIVER_TYPE(E3, TMC26X)
#if AXIS_DRIVER_TYPE_E3(TMC26X)
extern TMC26XStepper stepperE3;
#define E3_ENABLE_INIT NOOP
#define E3_ENABLE_WRITE(STATE) stepperE3.setEnabled(STATE)
@ -485,19 +490,19 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define E3_STEP_READ READ(E3_STEP_PIN)
// E4 Stepper
#if AXIS_DRIVER_TYPE(E4, L6470)
#if AXIS_DRIVER_TYPE_E4(L6470)
extern L6470 stepperE4;
#define E4_ENABLE_INIT NOOP
#define E4_ENABLE_WRITE(STATE) do{ if (STATE) stepperE4.Step_Clock(stepperE4.getStatus() & STATUS_HIZ); else stepperE4.softFree(); }while(0)
#define E4_ENABLE_WRITE(STATE) NOOP
#define E4_ENABLE_READ (stepperE4.getStatus() & STATUS_HIZ)
#define E4_DIR_INIT NOOP
#define E4_DIR_WRITE(STATE) stepperE4.Step_Clock(STATE)
#define E4_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E4)
#define E4_DIR_READ (stepperE4.getStatus() & STATUS_DIR)
#else
#if AXIS_IS_TMC(E4)
extern TMC_CLASS(E4) stepperE4;
#endif
#if AXIS_DRIVER_TYPE(E4, TMC26X)
#if AXIS_DRIVER_TYPE_E4(TMC26X)
extern TMC26XStepper stepperE4;
#define E4_ENABLE_INIT NOOP
#define E4_ENABLE_WRITE(STATE) stepperE4.setEnabled(STATE)
@ -520,19 +525,19 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define E4_STEP_READ READ(E4_STEP_PIN)
// E5 Stepper
#if AXIS_DRIVER_TYPE(E5, L6470)
#if AXIS_DRIVER_TYPE_E5(L6470)
extern L6470 stepperE5;
#define E5_ENABLE_INIT NOOP
#define E5_ENABLE_WRITE(STATE) do{ if (STATE) stepperE5.Step_Clock(stepperE5.getStatus() & STATUS_HIZ); else stepperE5.softFree(); }while(0)
#define E5_ENABLE_WRITE(STATE) NOOP
#define E5_ENABLE_READ (stepperE5.getStatus() & STATUS_HIZ)
#define E5_DIR_INIT NOOP
#define E5_DIR_WRITE(STATE) stepperE5.Step_Clock(STATE)
#define E5_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E5)
#define E5_DIR_READ (stepperE5.getStatus() & STATUS_DIR)
#else
#if AXIS_IS_TMC(E5)
extern TMC_CLASS(E5) stepperE5;
#endif
#if AXIS_DRIVER_TYPE(E5, TMC26X)
#if AXIS_DRIVER_TYPE_E5(TMC26X)
extern TMC26XStepper stepperE5;
#define E5_ENABLE_INIT NOOP
#define E5_ENABLE_WRITE(STATE) stepperE5.setEnabled(STATE)
@ -623,126 +628,3 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define NORM_E_DIR(E) E0_DIR_WRITE(!INVERT_E0_DIR)
#define REV_E_DIR(E) E0_DIR_WRITE( INVERT_E0_DIR)
#endif
//
// Stepper enable / disable
//
#if HAS_X2_ENABLE
#define enable_X() do{ X_ENABLE_WRITE( X_ENABLE_ON); X2_ENABLE_WRITE( X_ENABLE_ON); }while(0)
#define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); X2_ENABLE_WRITE(!X_ENABLE_ON); CBI(axis_known_position, X_AXIS); }while(0)
#elif HAS_X_ENABLE
#define enable_X() X_ENABLE_WRITE( X_ENABLE_ON)
#define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); CBI(axis_known_position, X_AXIS); }while(0)
#else
#define enable_X() NOOP
#define disable_X() NOOP
#endif
#if HAS_Y2_ENABLE
#define enable_Y() do{ Y_ENABLE_WRITE( Y_ENABLE_ON); Y2_ENABLE_WRITE(Y_ENABLE_ON); }while(0)
#define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); Y2_ENABLE_WRITE(!Y_ENABLE_ON); CBI(axis_known_position, Y_AXIS); }while(0)
#elif HAS_Y_ENABLE
#define enable_Y() Y_ENABLE_WRITE( Y_ENABLE_ON)
#define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); CBI(axis_known_position, Y_AXIS); }while(0)
#else
#define enable_Y() NOOP
#define disable_Y() NOOP
#endif
#if HAS_Z3_ENABLE
#define enable_Z() do{ Z_ENABLE_WRITE( Z_ENABLE_ON); Z2_ENABLE_WRITE(Z_ENABLE_ON); Z3_ENABLE_WRITE(Z_ENABLE_ON); }while(0)
#define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); Z3_ENABLE_WRITE(!Z_ENABLE_ON); CBI(axis_known_position, Z_AXIS); }while(0)
#elif HAS_Z2_ENABLE
#define enable_Z() do{ Z_ENABLE_WRITE( Z_ENABLE_ON); Z2_ENABLE_WRITE(Z_ENABLE_ON); }while(0)
#define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); CBI(axis_known_position, Z_AXIS); }while(0)
#elif HAS_Z_ENABLE
#define enable_Z() Z_ENABLE_WRITE( Z_ENABLE_ON)
#define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); CBI(axis_known_position, Z_AXIS); }while(0)
#else
#define enable_Z() NOOP
#define disable_Z() NOOP
#endif
#if ENABLED(MIXING_EXTRUDER)
/**
* Mixing steppers synchronize their enable (and direction) together
*/
#if MIXING_STEPPERS > 5
#define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); E4_ENABLE_WRITE( E_ENABLE_ON); E5_ENABLE_WRITE( E_ENABLE_ON); }
#define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); E4_ENABLE_WRITE(!E_ENABLE_ON); E5_ENABLE_WRITE(!E_ENABLE_ON); }
#elif MIXING_STEPPERS > 4
#define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); E4_ENABLE_WRITE( E_ENABLE_ON); }
#define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); E4_ENABLE_WRITE(!E_ENABLE_ON); }
#elif MIXING_STEPPERS > 3
#define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); }
#define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); }
#elif MIXING_STEPPERS > 2
#define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); }
#define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); }
#else
#define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); }
#define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); }
#endif
#define enable_E1() NOOP
#define disable_E1() NOOP
#define enable_E2() NOOP
#define disable_E2() NOOP
#define enable_E3() NOOP
#define disable_E3() NOOP
#define enable_E4() NOOP
#define disable_E4() NOOP
#define enable_E5() NOOP
#define disable_E5() NOOP
#else // !MIXING_EXTRUDER
#if HAS_E0_ENABLE
#define enable_E0() E0_ENABLE_WRITE( E_ENABLE_ON)
#define disable_E0() E0_ENABLE_WRITE(!E_ENABLE_ON)
#else
#define enable_E0() NOOP
#define disable_E0() NOOP
#endif
#if E_STEPPERS > 1 && HAS_E1_ENABLE
#define enable_E1() E1_ENABLE_WRITE( E_ENABLE_ON)
#define disable_E1() E1_ENABLE_WRITE(!E_ENABLE_ON)
#else
#define enable_E1() NOOP
#define disable_E1() NOOP
#endif
#if E_STEPPERS > 2 && HAS_E2_ENABLE
#define enable_E2() E2_ENABLE_WRITE( E_ENABLE_ON)
#define disable_E2() E2_ENABLE_WRITE(!E_ENABLE_ON)
#else
#define enable_E2() NOOP
#define disable_E2() NOOP
#endif
#if E_STEPPERS > 3 && HAS_E3_ENABLE
#define enable_E3() E3_ENABLE_WRITE( E_ENABLE_ON)
#define disable_E3() E3_ENABLE_WRITE(!E_ENABLE_ON)
#else
#define enable_E3() NOOP
#define disable_E3() NOOP
#endif
#if E_STEPPERS > 4 && HAS_E4_ENABLE
#define enable_E4() E4_ENABLE_WRITE( E_ENABLE_ON)
#define disable_E4() E4_ENABLE_WRITE(!E_ENABLE_ON)
#else
#define enable_E4() NOOP
#define disable_E4() NOOP
#endif
#if E_STEPPERS > 5 && HAS_E5_ENABLE
#define enable_E5() E5_ENABLE_WRITE( E_ENABLE_ON)
#define disable_E5() E5_ENABLE_WRITE(!E_ENABLE_ON)
#else
#define enable_E5() NOOP
#define disable_E5() NOOP
#endif
#endif // !MIXING_EXTRUDER