Library for Trinamic TMC2209 stepper modules to drive bipolar stepper motors. Ported and adapted from https://github.com/teemuatlut/TMCStepper

Dependents:   TMC2209-Test2

Committer:
charly
Date:
Thu Dec 02 20:29:39 2021 +0000
Revision:
2:b34e91b54373
Parent:
0:f4343071c8b1
Changes from Original Project for TMC2209 integrated

Who changed what in which revision?

UserRevisionLine numberNew contents of line
charly 0:f4343071c8b1 1 #pragma once
charly 0:f4343071c8b1 2
charly 0:f4343071c8b1 3 //#define TMCDEBUG
charly 0:f4343071c8b1 4
charly 0:f4343071c8b1 5 #include "mbed.h"
charly 0:f4343071c8b1 6
charly 0:f4343071c8b1 7 #define SW_CAPABLE_PLATFORM true
charly 0:f4343071c8b1 8
charly 0:f4343071c8b1 9 //#include "TMC2130_bitfields.h"
charly 0:f4343071c8b1 10 //#include "TMC2160_bitfields.h"
charly 0:f4343071c8b1 11 //#include "TMC5130_bitfields.h"
charly 0:f4343071c8b1 12 //#include "TMC5160_bitfields.h"
charly 0:f4343071c8b1 13 #include "TMC2208_bitfields.h"
charly 0:f4343071c8b1 14 #include "TMC2209_bitfields.h"
charly 0:f4343071c8b1 15 //#include "TMC2660_bitfields.h"
charly 0:f4343071c8b1 16
charly 0:f4343071c8b1 17 #define INIT_REGISTER(REG) REG##_t REG##_register = REG##_t
charly 0:f4343071c8b1 18 //#define INIT2130_REGISTER(REG) TMC2130_n::REG##_t REG##_register = TMC2130_n::REG##_t
charly 0:f4343071c8b1 19 //#define INIT2160_REGISTER(REG) TMC2160_n::REG##_t REG##_register = TMC2160_n::REG##_t
charly 0:f4343071c8b1 20 //#define INIT5130_REGISTER(REG) TMC5130_n::REG##_t REG##_register = TMC5130_n::REG##_t
charly 0:f4343071c8b1 21 //#define INIT5160_REGISTER(REG) TMC5160_n::REG##_t REG##_register = TMC5160_n::REG##_t
charly 0:f4343071c8b1 22 //#define INIT2660_REGISTER(REG) TMC2660_n::REG##_t REG##_register = TMC2660_n::REG##_t
charly 0:f4343071c8b1 23 #define INIT2208_REGISTER(REG) TMC2208_n::REG##_t REG##_register = TMC2208_n::REG##_t
charly 0:f4343071c8b1 24 //#define INIT2224_REGISTER(REG) TMC2224_n::REG##_t REG##_register = TMC2224_n::REG##_t
charly 0:f4343071c8b1 25 #define SET_ALIAS(TYPE, DRIVER, NEW, ARG, OLD) TYPE (DRIVER::*NEW)(ARG) = &DRIVER::OLD
charly 0:f4343071c8b1 26
charly 0:f4343071c8b1 27 #define TMCSTEPPER_VERSION 0x000701 // v0.7.1
charly 0:f4343071c8b1 28
charly 0:f4343071c8b1 29 #if SW_CAPABLE_PLATFORM
charly 0:f4343071c8b1 30 #include <BufferedSerial.h>
charly 0:f4343071c8b1 31 #include <Stream.h>
charly 0:f4343071c8b1 32 #endif
charly 0:f4343071c8b1 33 class TMCStepper {
charly 0:f4343071c8b1 34 public:
charly 0:f4343071c8b1 35 uint16_t cs2rms(uint8_t CS);
charly 0:f4343071c8b1 36 void rms_current(uint16_t mA);
charly 0:f4343071c8b1 37 void rms_current(uint16_t mA, float mult);
charly 0:f4343071c8b1 38 uint16_t rms_current();
charly 0:f4343071c8b1 39 void hold_multiplier(float val) { holdMultiplier = val; }
charly 0:f4343071c8b1 40 float hold_multiplier() { return holdMultiplier; }
charly 0:f4343071c8b1 41 uint8_t test_connection();
charly 0:f4343071c8b1 42
charly 0:f4343071c8b1 43 // Helper functions
charly 0:f4343071c8b1 44 void microsteps(uint16_t ms);
charly 0:f4343071c8b1 45 uint16_t microsteps();
charly 0:f4343071c8b1 46 void blank_time(uint8_t value);
charly 0:f4343071c8b1 47 uint8_t blank_time();
charly 0:f4343071c8b1 48 void hysteresis_end(int8_t value);
charly 0:f4343071c8b1 49 int8_t hysteresis_end();
charly 0:f4343071c8b1 50 void hysteresis_start(uint8_t value);
charly 0:f4343071c8b1 51 uint8_t hysteresis_start();
charly 0:f4343071c8b1 52
charly 0:f4343071c8b1 53 // R+WC: GSTAT
charly 0:f4343071c8b1 54 void GSTAT( uint8_t input);
charly 0:f4343071c8b1 55 uint8_t GSTAT();
charly 0:f4343071c8b1 56 bool reset();
charly 0:f4343071c8b1 57 bool drv_err();
charly 0:f4343071c8b1 58 bool uv_cp();
charly 0:f4343071c8b1 59
charly 0:f4343071c8b1 60 // W: IHOLD_IRUN
charly 0:f4343071c8b1 61 void IHOLD_IRUN( uint32_t input);
charly 0:f4343071c8b1 62 uint32_t IHOLD_IRUN();
charly 0:f4343071c8b1 63 void ihold( uint8_t B);
charly 0:f4343071c8b1 64 void irun( uint8_t B);
charly 0:f4343071c8b1 65 void iholddelay( uint8_t B);
charly 0:f4343071c8b1 66 uint8_t ihold();
charly 0:f4343071c8b1 67 uint8_t irun();
charly 0:f4343071c8b1 68 uint8_t iholddelay();
charly 0:f4343071c8b1 69
charly 0:f4343071c8b1 70 // W: TPOWERDOWN
charly 0:f4343071c8b1 71 uint8_t TPOWERDOWN();
charly 0:f4343071c8b1 72 void TPOWERDOWN( uint8_t input);
charly 0:f4343071c8b1 73
charly 0:f4343071c8b1 74 // R: TSTEP
charly 0:f4343071c8b1 75 uint32_t TSTEP();
charly 0:f4343071c8b1 76
charly 0:f4343071c8b1 77 // W: TPWMTHRS
charly 0:f4343071c8b1 78 uint32_t TPWMTHRS();
charly 0:f4343071c8b1 79 void TPWMTHRS( uint32_t input);
charly 0:f4343071c8b1 80
charly 0:f4343071c8b1 81 // R: MSCNT
charly 0:f4343071c8b1 82 uint16_t MSCNT();
charly 0:f4343071c8b1 83
charly 0:f4343071c8b1 84 // R: MSCURACT
charly 0:f4343071c8b1 85 uint32_t MSCURACT();
charly 0:f4343071c8b1 86 int16_t cur_a();
charly 0:f4343071c8b1 87 int16_t cur_b();
charly 0:f4343071c8b1 88
charly 0:f4343071c8b1 89 protected:
charly 0:f4343071c8b1 90 TMCStepper(float RS) : Rsense(RS) {};
charly 0:f4343071c8b1 91 INIT_REGISTER(IHOLD_IRUN){{.sr=0}}; // 32b
charly 0:f4343071c8b1 92 INIT_REGISTER(TPOWERDOWN){.sr=0}; // 8b
charly 0:f4343071c8b1 93 INIT_REGISTER(TPWMTHRS){.sr=0}; // 32b
charly 0:f4343071c8b1 94
charly 0:f4343071c8b1 95 static constexpr uint8_t TMC_READ = 0x00,
charly 0:f4343071c8b1 96 TMC_WRITE = 0x80;
charly 0:f4343071c8b1 97
charly 0:f4343071c8b1 98 struct TSTEP_t { constexpr static uint8_t address = 0x12; };
charly 0:f4343071c8b1 99 struct MSCNT_t { constexpr static uint8_t address = 0x6A; };
charly 0:f4343071c8b1 100
charly 0:f4343071c8b1 101 virtual void write(uint8_t, uint32_t) = 0;
charly 0:f4343071c8b1 102 virtual uint32_t read(uint8_t) = 0;
charly 0:f4343071c8b1 103 virtual void vsense(bool) = 0;
charly 0:f4343071c8b1 104 virtual bool vsense(void) = 0;
charly 0:f4343071c8b1 105 virtual uint32_t DRV_STATUS() = 0;
charly 0:f4343071c8b1 106 virtual void hend(uint8_t) = 0;
charly 0:f4343071c8b1 107 virtual uint8_t hend() = 0;
charly 0:f4343071c8b1 108 virtual void hstrt(uint8_t) = 0;
charly 0:f4343071c8b1 109 virtual uint8_t hstrt() = 0;
charly 0:f4343071c8b1 110 virtual void mres(uint8_t) = 0;
charly 0:f4343071c8b1 111 virtual uint8_t mres() = 0;
charly 0:f4343071c8b1 112 virtual void tbl(uint8_t) = 0;
charly 0:f4343071c8b1 113 virtual uint8_t tbl() = 0;
charly 0:f4343071c8b1 114
charly 0:f4343071c8b1 115 const float Rsense;
charly 0:f4343071c8b1 116 float holdMultiplier = 0.5;
charly 0:f4343071c8b1 117 };
charly 0:f4343071c8b1 118
charly 0:f4343071c8b1 119
charly 0:f4343071c8b1 120 class TMC2208Stepper : public TMCStepper {
charly 0:f4343071c8b1 121 public:
charly 0:f4343071c8b1 122 TMC2208Stepper(Stream * SerialPort, float RS, uint8_t addr, uint16_t mul_pin1, uint16_t mul_pin2);
charly 0:f4343071c8b1 123 TMC2208Stepper(Stream * SerialPort, float RS) :
charly 0:f4343071c8b1 124 TMC2208Stepper(SerialPort, RS, TMC2208_SLAVE_ADDR)
charly 0:f4343071c8b1 125 {}
charly 0:f4343071c8b1 126 #if SW_CAPABLE_PLATFORM
charly 0:f4343071c8b1 127 TMC2208Stepper(PinName SW_RX_pin, PinName SW_TX_pin, float RS) :
charly 0:f4343071c8b1 128 TMC2208Stepper(SW_RX_pin, SW_TX_pin, RS, TMC2208_SLAVE_ADDR)
charly 0:f4343071c8b1 129 {}
charly 0:f4343071c8b1 130
charly 0:f4343071c8b1 131 __attribute__((deprecated("Boolean argument has been deprecated and does nothing")))
charly 0:f4343071c8b1 132 TMC2208Stepper(PinName SW_RX_pin, PinName SW_TX_pin, float RS, bool) :
charly 0:f4343071c8b1 133 TMC2208Stepper(SW_RX_pin, SW_TX_pin, RS, TMC2208_SLAVE_ADDR)
charly 0:f4343071c8b1 134 {};
charly 0:f4343071c8b1 135 #else
charly 0:f4343071c8b1 136 TMC2208Stepper(PinName, PinName, float) = delete; // Your platform does not currently support Software Serial
charly 0:f4343071c8b1 137 #endif
charly 0:f4343071c8b1 138 void defaults();
charly 0:f4343071c8b1 139 void push();
charly 0:f4343071c8b1 140 void begin();
charly 0:f4343071c8b1 141 #if SW_CAPABLE_PLATFORM
charly 0:f4343071c8b1 142 void beginSerial(uint32_t baudrate) __attribute__((weak));
charly 0:f4343071c8b1 143 #else
charly 0:f4343071c8b1 144 void beginSerial(uint32_t) = delete; // Your platform does not currently support Software Serial
charly 0:f4343071c8b1 145 #endif
charly 0:f4343071c8b1 146 bool isEnabled();
charly 0:f4343071c8b1 147
charly 0:f4343071c8b1 148 // RW: GCONF
charly 0:f4343071c8b1 149 void GCONF(uint32_t input);
charly 0:f4343071c8b1 150 void I_scale_analog(bool B);
charly 0:f4343071c8b1 151 void internal_Rsense(bool B);
charly 0:f4343071c8b1 152 void en_spreadCycle(bool B);
charly 0:f4343071c8b1 153 void shaft(bool B);
charly 0:f4343071c8b1 154 void index_otpw(bool B);
charly 0:f4343071c8b1 155 void index_step(bool B);
charly 0:f4343071c8b1 156 void pdn_disable(bool B);
charly 0:f4343071c8b1 157 void mstep_reg_select(bool B);
charly 0:f4343071c8b1 158 void multistep_filt(bool B);
charly 0:f4343071c8b1 159 uint32_t GCONF();
charly 0:f4343071c8b1 160 bool I_scale_analog();
charly 0:f4343071c8b1 161 bool internal_Rsense();
charly 0:f4343071c8b1 162 bool en_spreadCycle();
charly 0:f4343071c8b1 163 bool shaft();
charly 0:f4343071c8b1 164 bool index_otpw();
charly 0:f4343071c8b1 165 bool index_step();
charly 0:f4343071c8b1 166 bool pdn_disable();
charly 0:f4343071c8b1 167 bool mstep_reg_select();
charly 0:f4343071c8b1 168 bool multistep_filt();
charly 0:f4343071c8b1 169
charly 0:f4343071c8b1 170 // R: IFCNT
charly 0:f4343071c8b1 171 uint8_t IFCNT();
charly 0:f4343071c8b1 172
charly 0:f4343071c8b1 173 // W: SLAVECONF
charly 0:f4343071c8b1 174 void SLAVECONF(uint16_t input);
charly 0:f4343071c8b1 175 uint16_t SLAVECONF();
charly 0:f4343071c8b1 176 void senddelay(uint8_t B);
charly 0:f4343071c8b1 177 uint8_t senddelay();
charly 0:f4343071c8b1 178
charly 0:f4343071c8b1 179 // W: OTP_PROG
charly 0:f4343071c8b1 180 void OTP_PROG(uint16_t input);
charly 0:f4343071c8b1 181
charly 0:f4343071c8b1 182 // R: OTP_READ
charly 0:f4343071c8b1 183 uint32_t OTP_READ();
charly 0:f4343071c8b1 184
charly 0:f4343071c8b1 185 // R: IOIN
charly 0:f4343071c8b1 186 uint32_t IOIN();
charly 0:f4343071c8b1 187 bool enn();
charly 0:f4343071c8b1 188 bool ms1();
charly 0:f4343071c8b1 189 bool ms2();
charly 0:f4343071c8b1 190 bool diag();
charly 0:f4343071c8b1 191 bool pdn_uart();
charly 0:f4343071c8b1 192 bool step();
charly 0:f4343071c8b1 193 bool sel_a();
charly 0:f4343071c8b1 194 bool dir();
charly 0:f4343071c8b1 195 uint8_t version();
charly 0:f4343071c8b1 196
charly 0:f4343071c8b1 197 // RW: FACTORY_CONF
charly 0:f4343071c8b1 198 void FACTORY_CONF(uint16_t input);
charly 0:f4343071c8b1 199 uint16_t FACTORY_CONF();
charly 0:f4343071c8b1 200 void fclktrim(uint8_t B);
charly 0:f4343071c8b1 201 void ottrim(uint8_t B);
charly 0:f4343071c8b1 202 uint8_t fclktrim();
charly 0:f4343071c8b1 203 uint8_t ottrim();
charly 0:f4343071c8b1 204
charly 0:f4343071c8b1 205 // W: VACTUAL
charly 0:f4343071c8b1 206 void VACTUAL(uint32_t input);
charly 0:f4343071c8b1 207 uint32_t VACTUAL();
charly 0:f4343071c8b1 208
charly 0:f4343071c8b1 209 // RW: CHOPCONF
charly 0:f4343071c8b1 210 void CHOPCONF(uint32_t input);
charly 0:f4343071c8b1 211 void toff(uint8_t B);
charly 0:f4343071c8b1 212 void hstrt(uint8_t B);
charly 0:f4343071c8b1 213 void hend(uint8_t B);
charly 0:f4343071c8b1 214 void tbl(uint8_t B);
charly 0:f4343071c8b1 215 void vsense(bool B);
charly 0:f4343071c8b1 216 void mres(uint8_t B);
charly 0:f4343071c8b1 217 void intpol(bool B);
charly 0:f4343071c8b1 218 void dedge(bool B);
charly 0:f4343071c8b1 219 void diss2g(bool B);
charly 0:f4343071c8b1 220 void diss2vs(bool B);
charly 0:f4343071c8b1 221 uint32_t CHOPCONF();
charly 0:f4343071c8b1 222 uint8_t toff();
charly 0:f4343071c8b1 223 uint8_t hstrt();
charly 0:f4343071c8b1 224 uint8_t hend();
charly 0:f4343071c8b1 225 uint8_t tbl();
charly 0:f4343071c8b1 226 bool vsense();
charly 0:f4343071c8b1 227 uint8_t mres();
charly 0:f4343071c8b1 228 bool intpol();
charly 0:f4343071c8b1 229 bool dedge();
charly 0:f4343071c8b1 230 bool diss2g();
charly 0:f4343071c8b1 231 bool diss2vs();
charly 0:f4343071c8b1 232
charly 0:f4343071c8b1 233 // R: DRV_STATUS
charly 0:f4343071c8b1 234 uint32_t DRV_STATUS();
charly 0:f4343071c8b1 235 bool otpw();
charly 0:f4343071c8b1 236 bool ot();
charly 0:f4343071c8b1 237 bool s2ga();
charly 0:f4343071c8b1 238 bool s2gb();
charly 0:f4343071c8b1 239 bool s2vsa();
charly 0:f4343071c8b1 240 bool s2vsb();
charly 0:f4343071c8b1 241 bool ola();
charly 0:f4343071c8b1 242 bool olb();
charly 0:f4343071c8b1 243 bool t120();
charly 0:f4343071c8b1 244 bool t143();
charly 0:f4343071c8b1 245 bool t150();
charly 0:f4343071c8b1 246 bool t157();
charly 0:f4343071c8b1 247 uint16_t cs_actual();
charly 0:f4343071c8b1 248 bool stealth();
charly 0:f4343071c8b1 249 bool stst();
charly 0:f4343071c8b1 250
charly 0:f4343071c8b1 251 // RW: PWMCONF
charly 0:f4343071c8b1 252 void PWMCONF(uint32_t input);
charly 0:f4343071c8b1 253 void pwm_ofs(uint8_t B);
charly 0:f4343071c8b1 254 void pwm_grad(uint8_t B);
charly 0:f4343071c8b1 255 void pwm_freq(uint8_t B);
charly 0:f4343071c8b1 256 void pwm_autoscale(bool B);
charly 0:f4343071c8b1 257 void pwm_autograd(bool B);
charly 0:f4343071c8b1 258 void freewheel(uint8_t B);
charly 0:f4343071c8b1 259 void pwm_reg(uint8_t B);
charly 0:f4343071c8b1 260 void pwm_lim(uint8_t B);
charly 0:f4343071c8b1 261 uint32_t PWMCONF();
charly 0:f4343071c8b1 262 uint8_t pwm_ofs();
charly 0:f4343071c8b1 263 uint8_t pwm_grad();
charly 0:f4343071c8b1 264 uint8_t pwm_freq();
charly 0:f4343071c8b1 265 bool pwm_autoscale();
charly 0:f4343071c8b1 266 bool pwm_autograd();
charly 0:f4343071c8b1 267 uint8_t freewheel();
charly 0:f4343071c8b1 268 uint8_t pwm_reg();
charly 0:f4343071c8b1 269 uint8_t pwm_lim();
charly 0:f4343071c8b1 270
charly 0:f4343071c8b1 271 // R: PWM_SCALE
charly 0:f4343071c8b1 272 uint32_t PWM_SCALE();
charly 0:f4343071c8b1 273 uint8_t pwm_scale_sum();
charly 0:f4343071c8b1 274 int16_t pwm_scale_auto();
charly 0:f4343071c8b1 275
charly 0:f4343071c8b1 276 // R: PWM_AUTO (0x72)
charly 0:f4343071c8b1 277 uint32_t PWM_AUTO();
charly 0:f4343071c8b1 278 uint8_t pwm_ofs_auto();
charly 0:f4343071c8b1 279 uint8_t pwm_grad_auto();
charly 0:f4343071c8b1 280
charly 0:f4343071c8b1 281 uint16_t bytesWritten = 0;
charly 0:f4343071c8b1 282 float Rsense = 0.11;
charly 0:f4343071c8b1 283 bool CRCerror = false;
charly 0:f4343071c8b1 284 protected:
charly 0:f4343071c8b1 285 INIT2208_REGISTER(GCONF) {{.sr=0}};
charly 0:f4343071c8b1 286 INIT_REGISTER(SLAVECONF) {{.sr=0}};
charly 0:f4343071c8b1 287 INIT_REGISTER(FACTORY_CONF) {{.sr=0}};
charly 0:f4343071c8b1 288 INIT2208_REGISTER(VACTUAL) {.sr=0};
charly 0:f4343071c8b1 289 INIT2208_REGISTER(CHOPCONF) {{.sr=0}};
charly 0:f4343071c8b1 290 INIT2208_REGISTER(PWMCONF) {{.sr=0}};
charly 0:f4343071c8b1 291
charly 0:f4343071c8b1 292 struct IFCNT_t { constexpr static uint8_t address = 0x02; };
charly 0:f4343071c8b1 293 struct OTP_PROG_t { constexpr static uint8_t address = 0x04; };
charly 0:f4343071c8b1 294 struct OTP_READ_t { constexpr static uint8_t address = 0x05; };
charly 0:f4343071c8b1 295
charly 0:f4343071c8b1 296 TMC2208Stepper(Stream * SerialPort, float RS, uint8_t addr);
charly 0:f4343071c8b1 297 #if SW_CAPABLE_PLATFORM
charly 0:f4343071c8b1 298 TMC2208Stepper(PinName SW_RX_pin, PinName SW_TX_pin, float RS, uint8_t addr);
charly 0:f4343071c8b1 299 #endif
charly 0:f4343071c8b1 300
charly 0:f4343071c8b1 301 Stream * HWSerial = nullptr;
charly 0:f4343071c8b1 302 #if SW_CAPABLE_PLATFORM
charly 0:f4343071c8b1 303 BufferedSerial * SWSerial = nullptr;
charly 0:f4343071c8b1 304 const uint16_t RXTX_pin = 0; // Half duplex
charly 0:f4343071c8b1 305 #endif
charly 0:f4343071c8b1 306
charly 0:f4343071c8b1 307 // SSwitch *sswitch = nullptr;
charly 0:f4343071c8b1 308
charly 0:f4343071c8b1 309 int available();
charly 0:f4343071c8b1 310 void preWriteCommunication();
charly 0:f4343071c8b1 311 void preReadCommunication();
charly 0:f4343071c8b1 312 int16_t serial_read();
charly 0:f4343071c8b1 313 uint8_t serial_write(const uint8_t data);
charly 0:f4343071c8b1 314 void postWriteCommunication();
charly 0:f4343071c8b1 315 void postReadCommunication();
charly 0:f4343071c8b1 316 void write(uint8_t, uint32_t);
charly 0:f4343071c8b1 317 uint32_t read(uint8_t);
charly 0:f4343071c8b1 318 const uint8_t slave_address;
charly 0:f4343071c8b1 319 uint8_t calcCRC(uint8_t datagram[], uint8_t len);
charly 0:f4343071c8b1 320 static constexpr uint8_t TMC2208_SYNC = 0x05,
charly 0:f4343071c8b1 321 TMC2208_SLAVE_ADDR = 0x00;
charly 0:f4343071c8b1 322 static constexpr uint8_t replyDelay = 2; //ms
charly 0:f4343071c8b1 323 static constexpr uint8_t abort_window = 5;
charly 0:f4343071c8b1 324 static constexpr uint8_t max_retries = 2;
charly 0:f4343071c8b1 325
charly 0:f4343071c8b1 326 uint64_t _sendDatagram(uint8_t [], const uint8_t, uint16_t);
charly 0:f4343071c8b1 327 };
charly 0:f4343071c8b1 328
charly 0:f4343071c8b1 329 class TMC2209Stepper : public TMC2208Stepper {
charly 0:f4343071c8b1 330 public:
charly 0:f4343071c8b1 331 TMC2209Stepper(Stream * SerialPort, float RS, uint8_t addr) :
charly 0:f4343071c8b1 332 TMC2208Stepper(SerialPort, RS, addr) {}
charly 0:f4343071c8b1 333
charly 0:f4343071c8b1 334 #if SW_CAPABLE_PLATFORM
charly 0:f4343071c8b1 335 TMC2209Stepper(PinName SW_RX_pin, PinName SW_TX_pin, float RS, uint8_t addr) :
charly 0:f4343071c8b1 336 TMC2208Stepper(SW_RX_pin, SW_TX_pin, RS, addr) {}
charly 0:f4343071c8b1 337 #else
charly 0:f4343071c8b1 338 TMC2209Stepper(PinName, PinName, float, uint8_t) = delete; // Your platform does not currently support Software Serial
charly 0:f4343071c8b1 339 #endif
charly 0:f4343071c8b1 340 void push();
charly 0:f4343071c8b1 341
charly 0:f4343071c8b1 342 // R: IOIN
charly 0:f4343071c8b1 343 uint32_t IOIN();
charly 0:f4343071c8b1 344 bool enn();
charly 0:f4343071c8b1 345 bool ms1();
charly 0:f4343071c8b1 346 bool ms2();
charly 0:f4343071c8b1 347 bool diag();
charly 0:f4343071c8b1 348 bool pdn_uart();
charly 0:f4343071c8b1 349 bool step();
charly 0:f4343071c8b1 350 bool spread_en();
charly 0:f4343071c8b1 351 bool dir();
charly 0:f4343071c8b1 352 uint8_t version();
charly 0:f4343071c8b1 353
charly 0:f4343071c8b1 354 // W: TCOOLTHRS
charly 0:f4343071c8b1 355 uint32_t TCOOLTHRS();
charly 0:f4343071c8b1 356 void TCOOLTHRS(uint32_t input);
charly 0:f4343071c8b1 357
charly 0:f4343071c8b1 358 // W: SGTHRS
charly 0:f4343071c8b1 359 void SGTHRS(uint8_t B);
charly 0:f4343071c8b1 360 uint8_t SGTHRS();
charly 0:f4343071c8b1 361
charly 0:f4343071c8b1 362 // R: SG_RESULT
charly 0:f4343071c8b1 363 uint16_t SG_RESULT();
charly 0:f4343071c8b1 364
charly 0:f4343071c8b1 365 // W: COOLCONF
charly 0:f4343071c8b1 366 void COOLCONF(uint16_t B);
charly 0:f4343071c8b1 367 uint16_t COOLCONF();
charly 0:f4343071c8b1 368 void semin(uint8_t B);
charly 0:f4343071c8b1 369 void seup(uint8_t B);
charly 0:f4343071c8b1 370 void semax(uint8_t B);
charly 0:f4343071c8b1 371 void sedn(uint8_t B);
charly 0:f4343071c8b1 372 void seimin(bool B);
charly 0:f4343071c8b1 373 uint8_t semin();
charly 0:f4343071c8b1 374 uint8_t seup();
charly 0:f4343071c8b1 375 uint8_t semax();
charly 0:f4343071c8b1 376 uint8_t sedn();
charly 0:f4343071c8b1 377 bool seimin();
charly 0:f4343071c8b1 378
charly 0:f4343071c8b1 379 protected:
charly 0:f4343071c8b1 380 INIT_REGISTER(TCOOLTHRS){.sr=0};
charly 0:f4343071c8b1 381 TMC2209_n::SGTHRS_t SGTHRS_register{.sr=0};
charly 0:f4343071c8b1 382 TMC2209_n::COOLCONF_t COOLCONF_register{{.sr=0}};
charly 0:f4343071c8b1 383 };