From 02a7a93f7c58377dd2875a49deb4ddce9b7219cd Mon Sep 17 00:00:00 2001 From: Timofey Titovets Date: Sat, 20 Dec 2025 16:56:41 +0100 Subject: [PATCH] tmc: optimize SPI read resource utilization TMC dump endpoints do high frequency queryes Because write and query happen one after another That not only adds additional overhead on the reactor But can consume 2 distinct write packages to the mcu Do a small optimization by packing them in one call Signed-off-by: Timofey Titovets --- klippy/extras/bus.py | 4 ++-- klippy/extras/tmc2130.py | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/klippy/extras/bus.py b/klippy/extras/bus.py index 19e278418..bc5f4e559 100644 --- a/klippy/extras/bus.py +++ b/klippy/extras/bus.py @@ -111,10 +111,10 @@ class MCU_SPI: return self.spi_transfer_cmd.send([self.oid, data], minclock=minclock, reqclock=reqclock) def spi_transfer_with_preface(self, preface_data, data, - minclock=0, reqclock=0): + minclock=0, reqclock=0, retry=True): return self.spi_transfer_cmd.send_with_preface( self.spi_send_cmd, [self.oid, preface_data], [self.oid, data], - minclock=minclock, reqclock=reqclock) + minclock=minclock, reqclock=reqclock, retry=retry) # Helper to setup an spi bus from settings in a config section def MCU_SPI_from_config(config, mode, pin_option="cs_pin", diff --git a/klippy/extras/tmc2130.py b/klippy/extras/tmc2130.py index 181fe07ae..953eb486d 100644 --- a/klippy/extras/tmc2130.py +++ b/klippy/extras/tmc2130.py @@ -192,20 +192,25 @@ class MCU_TMC_SPI_chain: share = "tmc_spi_cs" self.spi = bus.MCU_SPI_from_config(config, 3, default_speed=4000000, share_type=share) + self._error = self.printer.command_error self.taken_chain_positions = [] def _build_cmd(self, data, chain_pos): return ([0x00] * ((self.chain_len - chain_pos) * 5) + data + [0x00] * ((chain_pos - 1) * 5)) def reg_read(self, reg, chain_pos): cmd = self._build_cmd([reg, 0x00, 0x00, 0x00, 0x00], chain_pos) - self.spi.spi_send(cmd) if self.printer.get_start_args().get('debugoutput') is not None: + self.spi.spi_send(cmd) return { "spi_status": 0, "data": 0, "#receive_time": .0, } - params = self.spi.spi_transfer(cmd) + # Optimize read by grouping write + transfer request + try: + params = self.spi.spi_transfer_with_preface(cmd, cmd, retry=False) + except self._error: + params = self.spi.spi_transfer(cmd) pr = bytearray(params['response']) pr = pr[(self.chain_len - chain_pos) * 5 : (self.chain_len - chain_pos + 1) * 5]