tmc: It's not valid to schedule messages with print_time=0
A print_time of zero may translate to a negative clock on a secondary micro-controller, which would cause an internal error. Change the code to pass a real print_time or None if it is not needed. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
79c24f95b3
commit
6ec7dee07d
|
@ -96,7 +96,7 @@ class TMCCommandHelper:
|
||||||
self.cmd_INIT_TMC, desc=self.cmd_INIT_TMC_help)
|
self.cmd_INIT_TMC, desc=self.cmd_INIT_TMC_help)
|
||||||
self.printer.register_event_handler("klippy:connect",
|
self.printer.register_event_handler("klippy:connect",
|
||||||
self._handle_connect)
|
self._handle_connect)
|
||||||
def _init_registers(self, print_time):
|
def _init_registers(self, print_time=None):
|
||||||
# Send registers
|
# Send registers
|
||||||
for reg_name, val in self.fields.registers.items():
|
for reg_name, val in self.fields.registers.items():
|
||||||
self.mcu_tmc.set_register(reg_name, val, print_time)
|
self.mcu_tmc.set_register(reg_name, val, print_time)
|
||||||
|
@ -104,7 +104,7 @@ class TMCCommandHelper:
|
||||||
retry_count = 0
|
retry_count = 0
|
||||||
while 1:
|
while 1:
|
||||||
try:
|
try:
|
||||||
self._init_registers(0.)
|
self._init_registers()
|
||||||
return
|
return
|
||||||
except self.printer.command_error as e:
|
except self.printer.command_error as e:
|
||||||
logging.exception("TMC init error")
|
logging.exception("TMC init error")
|
||||||
|
|
|
@ -186,12 +186,14 @@ class MCU_TMC_SPI:
|
||||||
params = self.spi.spi_transfer([reg, 0x00, 0x00, 0x00, 0x00])
|
params = self.spi.spi_transfer([reg, 0x00, 0x00, 0x00, 0x00])
|
||||||
pr = bytearray(params['response'])
|
pr = bytearray(params['response'])
|
||||||
return (pr[1] << 24) | (pr[2] << 16) | (pr[3] << 8) | pr[4]
|
return (pr[1] << 24) | (pr[2] << 16) | (pr[3] << 8) | pr[4]
|
||||||
def set_register(self, reg_name, val, print_time=0.):
|
def set_register(self, reg_name, val, print_time=None):
|
||||||
min_clock = self.spi.get_mcu().print_time_to_clock(print_time)
|
minclock = 0
|
||||||
|
if print_time is not None:
|
||||||
|
minclock = self.spi.get_mcu().print_time_to_clock(print_time)
|
||||||
reg = Registers[reg_name]
|
reg = Registers[reg_name]
|
||||||
data = [(reg | 0x80) & 0xff, (val >> 24) & 0xff, (val >> 16) & 0xff,
|
data = [(reg | 0x80) & 0xff, (val >> 24) & 0xff, (val >> 16) & 0xff,
|
||||||
(val >> 8) & 0xff, val & 0xff]
|
(val >> 8) & 0xff, val & 0xff]
|
||||||
self.spi.spi_send(data, min_clock)
|
self.spi.spi_send(data, minclock)
|
||||||
|
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
|
@ -169,7 +169,8 @@ class TMC2660CurrentHelper:
|
||||||
return vsense, cs
|
return vsense, cs
|
||||||
|
|
||||||
def handle_printing(self, print_time):
|
def handle_printing(self, print_time):
|
||||||
self.set_current(0., self.current) # workaround
|
print_time -= 0.100 # Schedule slightly before deadline
|
||||||
|
self.set_current(print_time, self.current)
|
||||||
|
|
||||||
def handle_ready(self, print_time):
|
def handle_ready(self, print_time):
|
||||||
self.set_current(print_time, (float(self.idle_current_percentage)
|
self.set_current(print_time, (float(self.idle_current_percentage)
|
||||||
|
@ -213,15 +214,17 @@ class MCU_TMC2660_SPI:
|
||||||
val = self.fields.set_field("RDSEL", ReadRegisters.index(reg_name))
|
val = self.fields.set_field("RDSEL", ReadRegisters.index(reg_name))
|
||||||
if self.printer.get_start_args().get('debugoutput') is not None:
|
if self.printer.get_start_args().get('debugoutput') is not None:
|
||||||
return 0
|
return 0
|
||||||
params = self.spi.spi_transfer([((val >> 16) | reg) & 0xff,
|
msg = [((val >> 16) | reg) & 0xff, (val >> 8) & 0xff, val & 0xff]
|
||||||
(val >> 8) & 0xff, val & 0xff])
|
params = self.spi.spi_transfer(msg)
|
||||||
pr = bytearray(params['response'])
|
pr = bytearray(params['response'])
|
||||||
return (pr[0] << 16) | (pr[1] << 8) | pr[2]
|
return (pr[0] << 16) | (pr[1] << 8) | pr[2]
|
||||||
def set_register(self, reg_name, val, print_time=0.):
|
def set_register(self, reg_name, val, print_time=None):
|
||||||
min_clock = self.spi.get_mcu().print_time_to_clock(print_time)
|
minclock = 0
|
||||||
|
if print_time is not None:
|
||||||
|
minclock = self.spi.get_mcu().print_time_to_clock(print_time)
|
||||||
reg = self.name_to_reg[reg_name]
|
reg = self.name_to_reg[reg_name]
|
||||||
self.spi.spi_send([((val >> 16) | reg) & 0xff,
|
msg = [((val >> 16) | reg) & 0xff, (val >> 8) & 0xff, val & 0xff]
|
||||||
(val >> 8) & 0xff, val & 0xff], min_clock)
|
self.spi.spi_send(msg, minclock)
|
||||||
|
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
|
@ -149,7 +149,9 @@ class MCU_TMC_uart_bitbang:
|
||||||
params = self.tmcuart_send_cmd.send_with_response(
|
params = self.tmcuart_send_cmd.send_with_response(
|
||||||
[self.oid, msg, 10], 'tmcuart_response', self.oid)
|
[self.oid, msg, 10], 'tmcuart_response', self.oid)
|
||||||
return self._decode_read(reg, params['read'])
|
return self._decode_read(reg, params['read'])
|
||||||
def reg_write(self, instance_id, addr, reg, val, print_time=0.):
|
def reg_write(self, instance_id, addr, reg, val, print_time=None):
|
||||||
|
minclock = 0
|
||||||
|
if print_time is not None:
|
||||||
minclock = self.mcu.print_time_to_clock(print_time)
|
minclock = self.mcu.print_time_to_clock(print_time)
|
||||||
if self.analog_mux is not None:
|
if self.analog_mux is not None:
|
||||||
self.analog_mux.activate(instance_id)
|
self.analog_mux.activate(instance_id)
|
||||||
|
|
Loading…
Reference in New Issue