tmc2130: Add a DUMP_TMC helper command

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2018-06-30 12:17:32 -04:00
parent 38d7b9ada0
commit b41770caa6
2 changed files with 40 additions and 3 deletions

View File

@ -158,3 +158,10 @@ section is enabled:
- `SET_DUAL_CARRIAGE CARRIAGE=[0|1]`: This command will set the active
carriage. It is typically invoked from the activate_gcode and
deactivate_gcode fields in a multiple extruder configuration.
## TMC2130
The following command is available when the "tmc2130" config section
is enabled:
- `DUMP_TMC STEPPER=<name>`: This command will read the TMC2130 driver
registers and report their values.

View File

@ -3,7 +3,7 @@
# Copyright (C) 2018 Kevin O'Connor <kevin@koconnor.net>
#
# This file may be distributed under the terms of the GNU GPLv3 license.
import math
import math, logging
TMC_FREQUENCY=13200000.
REG_GCONF=0x00
@ -13,9 +13,16 @@ REG_TCOOLTHRS=0x14
REG_COOLCONF=0x6d
REG_PWMCONF=0x70
ReadRegisters = {
0x00: "GCONF", 0x01: "GSTAT", 0x04: "IOIN", 0x12: "TSTEP", 0x2d: "XDIRECT",
0x6a: "MSCNT", 0x6b: "MSCURACT", 0x6c: "CHOPCONF", 0x6f: "DRV_STATUS",
0x71: "PWM_SCALE", 0x73: "LOST_STEPS"
}
class TMC2130:
def __init__(self, config):
self.printer = config.get_printer()
self.name = config.get_name().split()[1]
# pin setup
ppins = self.printer.lookup_object("pins")
cs_pin = config.get('cs_pin')
@ -25,6 +32,12 @@ class TMC2130:
self.mcu = cs_pin_params['chip']
pin = cs_pin_params['pin']
self.oid = self.mcu.create_oid()
# Add DUMP_TMC command
gcode = self.printer.lookup_object("gcode")
gcode.register_mux_command(
"DUMP_TMC", "STEPPER", self.name,
self.cmd_DUMP_TMC, desc=self.cmd_DUMP_TMC_help)
# Setup driver registers
self.mcu.add_config_cmd(
"config_spi oid=%d bus=%d pin=%s mode=%d rate=%d shutdown_msg=" % (
self.oid, 0, cs_pin_params['pin'], 3, 4000000))
@ -52,8 +65,8 @@ class TMC2130:
pwm_ampl = config.getint('driver_PWM_AMPL', 128, minval=0, maxval=255)
# Allow virtual endstop to be created
self.diag1_pin = config.get('diag1_pin', None)
ppins.register_chip("_".join(config.get_name().split()[:2]), self)
self.send_spi_cmd = None
ppins.register_chip("tmc2130_" + self.name, self)
self.spi_send_cmd = self.spi_transfer_cmd = None
self.mcu.add_config_object(self)
# calculate current
vsense = False
@ -111,10 +124,27 @@ class TMC2130:
cmd_queue = self.mcu.alloc_command_queue()
self.spi_send_cmd = self.mcu.lookup_command(
"spi_send oid=%c data=%*s", cq=cmd_queue)
self.spi_transfer_cmd = self.mcu.lookup_command(
"spi_transfer oid=%c data=%*s", cq=cmd_queue)
def set_register(self, addr, val):
data = [(addr | 0x80) & 0xff, (val >> 24) & 0xff, (val >> 16) & 0xff,
(val >> 8) & 0xff, val & 0xff]
self.spi_send_cmd.send([self.oid, data])
cmd_DUMP_TMC_help = "Read and display TMC2130 registers"
def cmd_DUMP_TMC(self, params):
self.printer.lookup_object('toolhead').get_last_move_time()
gcode = self.printer.lookup_object('gcode')
logging.info("DUMP_TMC2130 %s", self.name)
for reg, name in sorted(ReadRegisters.items()):
self.spi_send_cmd.send([self.oid, [reg, 0x00, 0x00, 0x00, 0x00]])
params = self.spi_transfer_cmd.send_with_response(
[self.oid, [reg, 0x00, 0x00, 0x00, 0x00]],
'spi_transfer_response', self.oid)
pr = bytearray(params['response'])
val = (pr[1] << 24) | (pr[2] << 16) | (pr[3] << 8) | pr[4]
msg = "%15s: %8x" % (name, val)
logging.info(msg)
gcode.respond_info(msg)
# Endstop wrapper that enables tmc2130 "sensorless homing"
class TMC2130VirtualEndstop: