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/sht3x.py b/klippy/extras/sht3x.py index c4fb22960..8151bd462 100644 --- a/klippy/extras/sht3x.py +++ b/klippy/extras/sht3x.py @@ -56,7 +56,7 @@ class SHT3X: self.reactor = self.printer.get_reactor() self.i2c = bus.MCU_I2C_from_config( config, default_addr=SHT3X_I2C_ADDR, default_speed=100000) - self._error = self.i2c.get_mcu().error + self._error = self.printer.command_error self.report_time = config.getint('sht3x_report_time', 1, minval=1) self.deviceId = config.get('sensor_type') self.temp = self.min_temp = self.max_temp = self.humidity = 0. 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]