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 <nefelim4ag@gmail.com>
This commit is contained in:
Timofey Titovets 2025-12-20 16:56:41 +01:00
parent b3ef9b4cb9
commit 02a7a93f7c
2 changed files with 9 additions and 4 deletions

View file

@ -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",

View file

@ -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]