From 510f13b24a149b0d2fc48fc12e93b3cacfd37cec Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 13 Feb 2022 13:22:09 +0100 Subject: [PATCH] Make the diag pins open collector with pullup. Solves random crash detected on startup --- Firmware/Marlin_main.cpp | 2 +- Firmware/mesh_bed_calibration.cpp | 6 +++--- Firmware/stepper.cpp | 30 +++++++----------------------- Firmware/tmc2130.cpp | 16 +++++++++++----- 4 files changed, 22 insertions(+), 32 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 2139bb51..c3915d1e 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -2201,7 +2201,7 @@ bool calibrate_z_auto() #ifdef TMC2130 static void check_Z_crash(void) { - if (READ(Z_TMC2130_DIAG) != 0) { //Z crash + if (!READ(Z_TMC2130_DIAG)) { //Z crash FORCE_HIGH_POWER_END; current_position[Z_AXIS] = 0; plan_set_position_curposXYZE(); diff --git a/Firmware/mesh_bed_calibration.cpp b/Firmware/mesh_bed_calibration.cpp index 289d2dd7..69b29123 100644 --- a/Firmware/mesh_bed_calibration.cpp +++ b/Firmware/mesh_bed_calibration.cpp @@ -974,7 +974,7 @@ bool find_bed_induction_sensor_point_z(float minimum_z, uint8_t n_iter, int goto error; } #ifdef TMC2130 - if (READ(Z_TMC2130_DIAG) != 0) + if (!READ(Z_TMC2130_DIAG)) { //printf_P(PSTR("crash detected 1, current_pos[Z]: %f \n"), current_position[Z_AXIS]); goto error; //crash Z detected @@ -1011,7 +1011,7 @@ bool find_bed_induction_sensor_point_z(float minimum_z, uint8_t n_iter, int goto error; } #ifdef TMC2130 - if (READ(Z_TMC2130_DIAG) != 0) { + if (!READ(Z_TMC2130_DIAG)) { //printf_P(PSTR("crash detected 2, current_pos[Z]: %f \n"), current_position[Z_AXIS]); goto error; //crash Z detected } @@ -2857,7 +2857,7 @@ bool sample_mesh_and_store_reference() homeaxis(Z_AXIS); #ifdef TMC2130 - if (!axis_known_position[Z_AXIS] && (READ(Z_TMC2130_DIAG) != 0)) //Z crash + if (!axis_known_position[Z_AXIS] && (!READ(Z_TMC2130_DIAG))) //Z crash { kill(_T(MSG_BED_LEVELING_FAILED_POINT_LOW)); return false; diff --git a/Firmware/stepper.cpp b/Firmware/stepper.cpp index 8caea4bc..d3236460 100644 --- a/Firmware/stepper.cpp +++ b/Firmware/stepper.cpp @@ -495,7 +495,7 @@ FORCE_INLINE void stepper_check_endstops() #if ( (defined(X_MIN_PIN) && (X_MIN_PIN > -1)) || defined(TMC2130_SG_HOMING) ) && !defined(DEBUG_DISABLE_XMINLIMIT) #ifdef TMC2130_SG_HOMING // Stall guard homing turned on - SET_BIT_TO(_endstop, X_AXIS, (READ(X_TMC2130_DIAG) != 0)); + SET_BIT_TO(_endstop, X_AXIS, (!READ(X_TMC2130_DIAG))); #else // Normal homing SET_BIT_TO(_endstop, X_AXIS, (READ(X_MIN_PIN) != X_MIN_ENDSTOP_INVERTING)); @@ -512,7 +512,7 @@ FORCE_INLINE void stepper_check_endstops() #if ( (defined(X_MAX_PIN) && (X_MAX_PIN > -1)) || defined(TMC2130_SG_HOMING) ) && !defined(DEBUG_DISABLE_XMAXLIMIT) #ifdef TMC2130_SG_HOMING // Stall guard homing turned on - SET_BIT_TO(_endstop, X_AXIS + 4, (READ(X_TMC2130_DIAG) != 0)); + SET_BIT_TO(_endstop, X_AXIS + 4, (!READ(X_TMC2130_DIAG))); #else // Normal homing SET_BIT_TO(_endstop, X_AXIS + 4, (READ(X_MAX_PIN) != X_MAX_ENDSTOP_INVERTING)); @@ -536,7 +536,7 @@ FORCE_INLINE void stepper_check_endstops() #if ( (defined(Y_MIN_PIN) && (Y_MIN_PIN > -1)) || defined(TMC2130_SG_HOMING) ) && !defined(DEBUG_DISABLE_YMINLIMIT) #ifdef TMC2130_SG_HOMING // Stall guard homing turned on - SET_BIT_TO(_endstop, Y_AXIS, (READ(Y_TMC2130_DIAG) != 0)); + SET_BIT_TO(_endstop, Y_AXIS, (!READ(Y_TMC2130_DIAG))); #else // Normal homing SET_BIT_TO(_endstop, Y_AXIS, (READ(Y_MIN_PIN) != Y_MIN_ENDSTOP_INVERTING)); @@ -553,7 +553,7 @@ FORCE_INLINE void stepper_check_endstops() #if ( (defined(Y_MAX_PIN) && (Y_MAX_PIN > -1)) || defined(TMC2130_SG_HOMING) ) && !defined(DEBUG_DISABLE_YMAXLIMIT) #ifdef TMC2130_SG_HOMING // Stall guard homing turned on - SET_BIT_TO(_endstop, Y_AXIS + 4, (READ(Y_TMC2130_DIAG) != 0)); + SET_BIT_TO(_endstop, Y_AXIS + 4, (!READ(Y_TMC2130_DIAG))); #else // Normal homing SET_BIT_TO(_endstop, Y_AXIS + 4, (READ(Y_MAX_PIN) != Y_MAX_ENDSTOP_INVERTING)); @@ -579,7 +579,7 @@ FORCE_INLINE void stepper_check_endstops() SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); else #endif //TMC2130_STEALTH_Z - SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) || (READ(Z_TMC2130_DIAG) != 0)); + SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) || (!READ(Z_TMC2130_DIAG))); #else SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); #endif //TMC2130_SG_HOMING @@ -601,7 +601,7 @@ FORCE_INLINE void stepper_check_endstops() SET_BIT_TO(_endstop, Z_AXIS + 4, 0); else #endif //TMC2130_STEALTH_Z - SET_BIT_TO(_endstop, Z_AXIS + 4, (READ(Z_TMC2130_DIAG) != 0)); + SET_BIT_TO(_endstop, Z_AXIS + 4, (!READ(Z_TMC2130_DIAG))); #else SET_BIT_TO(_endstop, Z_AXIS + 4, (READ(Z_MAX_PIN) != Z_MAX_ENDSTOP_INVERTING)); #endif //TMC2130_SG_HOMING @@ -634,7 +634,7 @@ FORCE_INLINE void stepper_check_endstops() SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); else #endif //TMC2130_STEALTH_Z - SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) || (READ(Z_TMC2130_DIAG) != 0)); + SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) || (!READ(Z_TMC2130_DIAG))); #else SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); #endif //TMC2130_SG_HOMING @@ -1179,22 +1179,6 @@ void st_init() #endif //endstops and pullups - - #ifdef TMC2130_SG_HOMING - SET_INPUT(X_TMC2130_DIAG); - WRITE(X_TMC2130_DIAG,HIGH); - - SET_INPUT(Y_TMC2130_DIAG); - WRITE(Y_TMC2130_DIAG,HIGH); - - SET_INPUT(Z_TMC2130_DIAG); - WRITE(Z_TMC2130_DIAG,HIGH); - - SET_INPUT(E0_TMC2130_DIAG); - WRITE(E0_TMC2130_DIAG,HIGH); - - #endif - #if defined(X_MIN_PIN) && X_MIN_PIN > -1 SET_INPUT(X_MIN_PIN); #ifdef ENDSTOPPULLUP_XMIN diff --git a/Firmware/tmc2130.cpp b/Firmware/tmc2130.cpp index b6f938ac..b19a7e11 100755 --- a/Firmware/tmc2130.cpp +++ b/Firmware/tmc2130.cpp @@ -11,7 +11,7 @@ #include "Timer.h" #define TMC2130_GCONF_NORMAL 0x00000000 // spreadCycle -#define TMC2130_GCONF_SGSENS 0x00003180 // spreadCycle with stallguard (stall activates DIAG0 and DIAG1 [pushpull]) +#define TMC2130_GCONF_SGSENS 0x00000180 // spreadCycle with stallguard (stall activates DIAG0 and DIAG1 [open collector]) #define TMC2130_GCONF_SILENT 0x00000004 // stealthChop @@ -152,10 +152,16 @@ void tmc2130_init(TMCInitParams params) SET_OUTPUT(Y_TMC2130_CS); SET_OUTPUT(Z_TMC2130_CS); SET_OUTPUT(E0_TMC2130_CS); + SET_INPUT(X_TMC2130_DIAG); SET_INPUT(Y_TMC2130_DIAG); SET_INPUT(Z_TMC2130_DIAG); SET_INPUT(E0_TMC2130_DIAG); + WRITE(X_TMC2130_DIAG,HIGH); + WRITE(Y_TMC2130_DIAG,HIGH); + WRITE(Z_TMC2130_DIAG,HIGH); + WRITE(E0_TMC2130_DIAG,HIGH); + for (uint_least8_t axis = 0; axis < 2; axis++) // X Y axes { tmc2130_setup_chopper(axis, tmc2130_mres[axis], tmc2130_current_h[axis], tmc2130_current_r[axis]); @@ -224,10 +230,10 @@ void tmc2130_init(TMCInitParams params) uint8_t tmc2130_sample_diag() { uint8_t mask = 0; - if (READ(X_TMC2130_DIAG)) mask |= X_AXIS_MASK; - if (READ(Y_TMC2130_DIAG)) mask |= Y_AXIS_MASK; -// if (READ(Z_TMC2130_DIAG)) mask |= Z_AXIS_MASK; -// if (READ(E0_TMC2130_DIAG)) mask |= E_AXIS_MASK; + if (!READ(X_TMC2130_DIAG)) mask |= X_AXIS_MASK; + if (!READ(Y_TMC2130_DIAG)) mask |= Y_AXIS_MASK; +// if (!READ(Z_TMC2130_DIAG)) mask |= Z_AXIS_MASK; +// if (!READ(E0_TMC2130_DIAG)) mask |= E_AXIS_MASK; return mask; }