TMC SPI Endstops and Improved Sensorless Homing (#14044)
This commit is contained in:
		
				
					committed by
					
						 Scott Lahteine
						Scott Lahteine
					
				
			
			
				
	
			
			
			
						parent
						
							d493cafc4a
						
					
				
				
					commit
					d4974ea719
				
			| @@ -140,6 +140,9 @@ class TMCMarlin : public TMC, public TMCStorage<AXIS_LETTER, DRIVER_ID> { | ||||
|           this->stored.homing_thrs = sgt_val; | ||||
|         #endif | ||||
|       } | ||||
|       #if ENABLED(SPI_ENDSTOPS) | ||||
|         bool test_stall_status(); | ||||
|       #endif | ||||
|     #endif | ||||
|  | ||||
|     #if HAS_LCD_MENU | ||||
| @@ -355,9 +358,22 @@ void test_tmc_connection(const bool test_x, const bool test_y, const bool test_z | ||||
|  * Defined here because of limitations with templates and headers. | ||||
|  */ | ||||
| #if USE_SENSORLESS | ||||
|  | ||||
|   // Track enabled status of stealthChop and only re-enable where applicable | ||||
|   struct sensorless_t { bool x, y, z, x2, y2, z2, z3; }; | ||||
|  | ||||
|   #if ENABLED(IMPROVE_HOMING_RELIABILITY) | ||||
|     extern millis_t sg_guard_period; | ||||
|     constexpr uint16_t default_sg_guard_duration = 400; | ||||
|  | ||||
|     struct slow_homing_t { | ||||
|       struct { uint32_t x, y; } acceleration; | ||||
|       #if HAS_CLASSIC_JERK | ||||
|         struct { float x, y; } jerk; | ||||
|       #endif | ||||
|     }; | ||||
|   #endif | ||||
|  | ||||
|   bool tmc_enable_stallguard(TMC2130Stepper &st); | ||||
|   void tmc_disable_stallguard(TMC2130Stepper &st, const bool restore_stealth); | ||||
|  | ||||
| @@ -366,7 +382,42 @@ void test_tmc_connection(const bool test_x, const bool test_y, const bool test_z | ||||
|  | ||||
|   bool tmc_enable_stallguard(TMC2660Stepper); | ||||
|   void tmc_disable_stallguard(TMC2660Stepper, const bool); | ||||
| #endif | ||||
|  | ||||
|   #if ENABLED(SPI_ENDSTOPS) | ||||
|  | ||||
|     template<class TMC, char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID> | ||||
|     bool TMCMarlin<TMC, AXIS_LETTER, DRIVER_ID, AXIS_ID>::test_stall_status() { | ||||
|       uint16_t sg_result = 0; | ||||
|  | ||||
|       this->switchCSpin(LOW); | ||||
|  | ||||
|       if (this->TMC_SW_SPI != nullptr) { | ||||
|         this->TMC_SW_SPI->transfer(TMC2130_n::DRV_STATUS_t::address); | ||||
|         this->TMC_SW_SPI->transfer16(0); | ||||
|         // We only care about the last 10 bits | ||||
|         sg_result = this->TMC_SW_SPI->transfer(0); | ||||
|         sg_result <<= 8; | ||||
|         sg_result |= this->TMC_SW_SPI->transfer(0); | ||||
|       } | ||||
|       else { | ||||
|         SPI.beginTransaction(SPISettings(16000000/8, MSBFIRST, SPI_MODE3)); | ||||
|         // Read DRV_STATUS | ||||
|         SPI.transfer(TMC2130_n::DRV_STATUS_t::address); | ||||
|         SPI.transfer16(0); | ||||
|         // We only care about the last 10 bits | ||||
|         sg_result = SPI.transfer(0); | ||||
|         sg_result <<= 8; | ||||
|         sg_result |= SPI.transfer(0); | ||||
|         SPI.endTransaction(); | ||||
|       } | ||||
|       this->switchCSpin(HIGH); | ||||
|  | ||||
|       return (sg_result & 0x3FF) == 0; | ||||
|     } | ||||
|  | ||||
|   #endif // SPI_ENDSTOPS | ||||
|  | ||||
| #endif // USE_SENSORLESS | ||||
|  | ||||
| #if TMC_HAS_SPI | ||||
|   void tmc_init_cs_pins(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user