TMCStepper
Library supporting Trinamic Stepper Drivers for Arduino platforms
Loading...
Searching...
No Matches
TMC2130Stepper.cpp
Go to the documentation of this file.
1
6#include "../TMCStepper.h"
7#include "TMC_MACROS.h"
8
10uint32_t TMC2130Stepper::spi_speed = 16000000/8;
11
12TMC2130Stepper::TMC2130Stepper(uint16_t pinCS, float RS, int8_t link) :
13 TMCStepper(RS),
14 _pinCS(pinCS),
15 link_index(link)
16 {
17 defaults();
18
19 if (link > chain_length)
20 chain_length = link;
21 }
22
23TMC2130Stepper::TMC2130Stepper(uint16_t pinCS, uint16_t pinMOSI, uint16_t pinMISO, uint16_t pinSCK, int8_t link) :
25 _pinCS(pinCS),
26 link_index(link)
27 {
28 SW_SPIClass *SW_SPI_Obj = new SW_SPIClass(pinMOSI, pinMISO, pinSCK);
29 TMC_SW_SPI = SW_SPI_Obj;
30 defaults();
31
32 if (link > chain_length)
33 chain_length = link;
34 }
35
36TMC2130Stepper::TMC2130Stepper(uint16_t pinCS, float RS, uint16_t pinMOSI, uint16_t pinMISO, uint16_t pinSCK, int8_t link) :
37 TMCStepper(RS),
38 _pinCS(pinCS),
39 link_index(link)
40 {
41 SW_SPIClass *SW_SPI_Obj = new SW_SPIClass(pinMOSI, pinMISO, pinSCK);
42 TMC_SW_SPI = SW_SPI_Obj;
43 defaults();
44
45 if (link > chain_length)
46 chain_length = link;
47 }
48
50 //MSLUT0_register.sr = ???;
51 //MSLUT1_register.sr = ???;
52 //MSLUT2_register.sr = ???;
53 //MSLUT3_register.sr = ???;
54 //MSLUT4_register.sr = ???;
55 //MSLUT5_register.sr = ???;
56 //MSLUT6_register.sr = ???;
57 //MSLUT7_register.sr = ???;
58 //MSLUTSTART_register.start_sin90 = 247;
59
60 //PWMCONF_register.sr = 0x00050480;
61 PWMCONF_register.pwm_ampl = 128;
62 PWMCONF_register.pwm_grad = 4;
63 PWMCONF_register.pwm_freq = 1;
64 PWMCONF_register.pwm_autoscale = true;
65 PWMCONF_register.pwm_symmetric = false;
66 PWMCONF_register.freewheel = 0;
67}
68
70void TMC2130Stepper::setSPISpeed(uint32_t speed) {
71 spi_speed = speed;
72}
73
74__attribute__((weak))
75void TMC2130Stepper::switchCSpin(bool state) {
76 digitalWrite(_pinCS, state);
77}
78
79__attribute__((weak))
81 if (TMC_SW_SPI == nullptr) {
83 }
84}
85__attribute__((weak))
87 if (TMC_SW_SPI == nullptr) {
89 }
90}
91
92__attribute__((weak))
93uint8_t TMC2130Stepper::transfer(const uint8_t data) {
94 uint8_t out = 0;
95 if (TMC_SW_SPI != nullptr) {
96 out = TMC_SW_SPI->transfer(data);
97 }
98 else {
99 out = SPI.transfer(data);
100 }
101 return out;
102}
103
105 for (uint8_t i = 0; i < n; i++) {
106 transfer(0x00);
107 }
108}
109
110__attribute__((weak))
111uint32_t TMC2130Stepper::read(uint8_t addressByte) {
112 uint32_t out = 0UL;
113 int8_t i = 1;
114
116 switchCSpin(LOW);
117 transfer(addressByte);
118 // Clear SPI
120
121 // Shift the written data to the correct driver in chain
122 // Default link_index = -1 and no shifting happens
123 while(i < link_index) {
125 i++;
126 }
127
128 switchCSpin(HIGH);
129 switchCSpin(LOW);
130
131 // Shift data from target link into the last one...
132 while(i < chain_length) {
134 i++;
135 }
136
137 // ...and once more to MCU
138 status_response = transfer(addressByte); // Send the address byte again
139 out = transfer(0x00);
140 out <<= 8; out |= transfer(0x00);
141 out <<= 8; out |= transfer(0x00);
142 out <<= 8; out |= transfer(0x00);
143
145 switchCSpin(HIGH);
146 return out;
147}
148
149__attribute__((weak))
150void TMC2130Stepper::write(uint8_t addressByte, uint32_t config) {
151 addressByte |= TMC_WRITE;
152 int8_t i = 1;
153
155 switchCSpin(LOW);
156 status_response = transfer(addressByte);
157 transfer(config>>24);
158 transfer(config>>16);
159 transfer(config>>8);
160 transfer(config);
161
162 // Shift the written data to the correct driver in chain
163 // Default link_index = -1 and no shifting happens
164 while(i < link_index) {
166 i++;
167 }
168
170 switchCSpin(HIGH);
171}
172
174 // Init pins
176 switchCSpin(HIGH);
177
178 if (TMC_SW_SPI != nullptr) TMC_SW_SPI->init();
179
180 // Send current states of shadow registers (0) to hardware
181 GCONF(GCONF_register.sr);
182 CHOPCONF(CHOPCONF_register.sr);
183 COOLCONF(COOLCONF_register.sr);
184 PWMCONF(PWMCONF_register.sr);
185 IHOLD_IRUN(IHOLD_IRUN_register.sr);
186
187 toff(8); //off_time(8);
188 tbl(1); //blank_time(24);
190
192 * Helper functions
193 */
194
196
198 // Apply current states of shadow registers
199 GCONF(GCONF_register.sr);
200 IHOLD_IRUN(IHOLD_IRUN_register.sr);
201 TPOWERDOWN(TPOWERDOWN_register.sr);
202 TPWMTHRS(TPWMTHRS_register.sr);
203 TCOOLTHRS(TCOOLTHRS_register.sr);
204 THIGH(THIGH_register.sr);
205 XDIRECT(XDIRECT_register.sr);
206 VDCMIN(VDCMIN_register.sr);
207 CHOPCONF(CHOPCONF_register.sr);
208 COOLCONF(COOLCONF_register.sr);
209 DCCTRL(DCCTRL_register.sr);
210 PWMCONF(PWMCONF_register.sr);
211 ENCM_CTRL(ENCM_CTRL_register.sr);
212}
213
215// W: TCOOLTHRS
216uint32_t TMC2130Stepper::TCOOLTHRS() { return TCOOLTHRS_register.sr; }
217void TMC2130Stepper::TCOOLTHRS(uint32_t input) {
218 TCOOLTHRS_register.sr = input;
219 write(TCOOLTHRS_register.address, TCOOLTHRS_register.sr);
220}
221
222// W: THIGH
223uint32_t TMC2130Stepper::THIGH() { return THIGH_register.sr; }
224void TMC2130Stepper::THIGH(uint32_t input) {
225 THIGH_register.sr = input;
226 write(THIGH_register.address, THIGH_register.sr);
227}
228
229// RW: XDIRECT
231 return read(XDIRECT_register.address);
232}
233void TMC2130Stepper::XDIRECT(uint32_t input) {
234 XDIRECT_register.sr = input;
235 write(XDIRECT_register.address, XDIRECT_register.sr);
236}
237void TMC2130Stepper::coil_A(int16_t B) { XDIRECT_register.coil_A = B; write(XDIRECT_register.address, XDIRECT_register.sr); }
238void TMC2130Stepper::coil_B(int16_t B) { XDIRECT_register.coil_B = B; write(XDIRECT_register.address, XDIRECT_register.sr); }
239int16_t TMC2130Stepper::coil_A() { XDIRECT_t r{}; r.sr = XDIRECT(); return r.coil_A; }
240int16_t TMC2130Stepper::coil_B() { XDIRECT_t r{}; r.sr = XDIRECT(); return r.coil_B; }
242// W: VDCMIN
243uint32_t TMC2130Stepper::VDCMIN() { return VDCMIN_register.sr; }
244void TMC2130Stepper::VDCMIN(uint32_t input) {
245 VDCMIN_register.sr = input;
246 write(VDCMIN_register.address, VDCMIN_register.sr);
247}
248
249// RW: DCCTRL
250uint32_t TMC2130Stepper::DCCTRL() { return read(DCCTRL_register.address); }
251void TMC2130Stepper::DCCTRL(uint32_t input) {
252 DCCTRL_register.sr = input;
253 write(DCCTRL_register.address, DCCTRL_register.sr);
254}
255
256uint16_t TMC2130Stepper::dc_time() { DCCTRL_t r{}; r.sr = DCCTRL(); return r.dc_time; }
257void TMC2130Stepper::dc_time(uint16_t input) {
258 DCCTRL_register.dc_time = input;
259 write(DCCTRL_register.address, DCCTRL_register.sr);
260}
261
262uint8_t TMC2130Stepper::dc_sg() { DCCTRL_t r{}; r.sr = DCCTRL(); return r.dc_sg; }
263void TMC2130Stepper::dc_sg(uint8_t input) {
264 DCCTRL_register.dc_sg = input;
265 write(DCCTRL_register.address, DCCTRL_register.sr);
266}
267
269// R: PWM_SCALE
271
273// W: ENCM_CTRL
274uint8_t TMC2130Stepper::ENCM_CTRL() { return ENCM_CTRL_register.sr; }
275void TMC2130Stepper::ENCM_CTRL(uint8_t input) {
276 ENCM_CTRL_register.sr = input;
277 write(ENCM_CTRL_register.address, ENCM_CTRL_register.sr);
278}
279void TMC2130Stepper::inv(bool B) { ENCM_CTRL_register.inv = B; write(ENCM_CTRL_register.address, ENCM_CTRL_register.sr); }
280void TMC2130Stepper::maxspeed(bool B) { ENCM_CTRL_register.maxspeed = B; write(ENCM_CTRL_register.address, ENCM_CTRL_register.sr); }
281bool TMC2130Stepper::inv() { return ENCM_CTRL_register.inv; }
282bool TMC2130Stepper::maxspeed() { return ENCM_CTRL_register.maxspeed; }
284// R: LOST_STEPS
286
288 switch(value) {
289 case 32: sedn(0b00); break;
290 case 8: sedn(0b01); break;
291 case 2: sedn(0b10); break;
292 case 1: sedn(0b11); break;
293 }
294}
296 switch(sedn()) {
297 case 0b00: return 32;
298 case 0b01: return 8;
299 case 0b10: return 2;
300 case 0b11: return 1;
301 }
302 return 0;
303}
304
306 if (TMC_SW_SPI != nullptr) {
307 delete TMC_SW_SPI;
308 TMC_SW_SPI = nullptr;
309 }
310}
__attribute__((weak)) void TMC2130Stepper
#define MSBFIRST
Definition bcm2835_spi.h:10
SPIClass SPI
#define SPI_MODE3
Definition bcm2835_spi.h:14
void endTransaction()
void beginTransaction(SPISettings settings)
uint8_t transfer(uint8_t)
uint8_t sedn()
Definition COOLCONF.cpp:33
void write(uint8_t addressByte, uint32_t config)
uint8_t sg_current_decrease()
uint32_t PWMCONF()
Definition PWMCONF.cpp:16
void setSPISpeed(uint32_t speed)
SW_SPIClass * TMC_SW_SPI
TMC2130Stepper(uint16_t pinCS, float RS=default_RS, int8_t link_index=-1)
uint8_t status_response
uint32_t CHOPCONF()
Definition CHOPCONF.cpp:16
const uint16_t _pinCS
uint8_t transfer(const uint8_t data)
static constexpr float default_RS
bool drv_enn_cfg6()
Definition IOIN.cpp:21
void endTransaction()
uint32_t LOST_STEPS()
void transferEmptyBytes(const uint8_t n)
uint32_t COOLCONF()
Definition COOLCONF.cpp:16
uint8_t toff()
Definition CHOPCONF.cpp:39
static uint32_t spi_speed
static int8_t chain_length
void beginTransaction()
uint8_t tbl()
Definition CHOPCONF.cpp:46
uint32_t read(uint8_t addressByte)
void switchCSpin(bool state)
uint32_t GCONF()
Definition GCONF.cpp:16
uint32_t IHOLD_IRUN()
uint8_t TPOWERDOWN()
TMCStepper(float RS)
uint32_t TPWMTHRS()
static constexpr uint8_t TMC_WRITE
#define pinMode(PIN, MODE)
Definition rpi_bcm2835.h:13
#define digitalWrite(PIN, MODE)
Definition rpi_bcm2835.h:14
#define OUTPUT
Definition rpi_bcm2835.h:11
uint16_t dc_time
uint16_t uint8_t dc_sg
static constexpr uint8_t address
static constexpr uint8_t address