|
@@ -32,7 +32,9 @@
|
|
#if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1
|
|
#if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1
|
|
#include <SPI.h>
|
|
#include <SPI.h>
|
|
#endif
|
|
#endif
|
|
-
|
|
|
|
|
|
+#ifdef HAVE_TMC2130_DRIVERS
|
|
|
|
+#include <SPI.h>
|
|
|
|
+#endif
|
|
|
|
|
|
//===========================================================================
|
|
//===========================================================================
|
|
//=============================public variables ============================
|
|
//=============================public variables ============================
|
|
@@ -630,9 +632,158 @@ ISR(TIMER1_COMPA_vect)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+#ifdef HAVE_TMC2130_DRIVERS
|
|
|
|
+ void tmc2130_write(uint8_t chipselect, uint8_t address,uint8_t wval1,uint8_t wval2,uint8_t wval3,uint8_t wval4)
|
|
|
|
+ {
|
|
|
|
+ uint32_t val32;
|
|
|
|
+ uint8_t val0;
|
|
|
|
+ uint8_t val1;
|
|
|
|
+ uint8_t val2;
|
|
|
|
+ uint8_t val3;
|
|
|
|
+ uint8_t val4;
|
|
|
|
+
|
|
|
|
+ //datagram1 - write
|
|
|
|
+ SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3));
|
|
|
|
+ digitalWrite(chipselect,LOW);
|
|
|
|
+ SPI.transfer(address+0x80);
|
|
|
|
+ SPI.transfer(wval1);
|
|
|
|
+ SPI.transfer(wval2);
|
|
|
|
+ SPI.transfer(wval3);
|
|
|
|
+ SPI.transfer(wval4);
|
|
|
|
+ digitalWrite(chipselect, HIGH);
|
|
|
|
+ SPI.endTransaction();
|
|
|
|
+
|
|
|
|
+ //datagram2 - response
|
|
|
|
+ SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3));
|
|
|
|
+ digitalWrite(chipselect,LOW);
|
|
|
|
+ val0 = SPI.transfer(0);
|
|
|
|
+ val1 = SPI.transfer(0);
|
|
|
|
+ val2 = SPI.transfer(0);
|
|
|
|
+ val3 = SPI.transfer(0);
|
|
|
|
+ val4 = SPI.transfer(0);
|
|
|
|
+ digitalWrite(chipselect, HIGH);
|
|
|
|
+ SPI.endTransaction();
|
|
|
|
+
|
|
|
|
+ MYSERIAL.print("WriteRead 0x");
|
|
|
|
+ MYSERIAL.print(address,HEX);
|
|
|
|
+ MYSERIAL.print(" Status:");
|
|
|
|
+ MYSERIAL.print(val0 & 0b00000111,BIN);
|
|
|
|
+ MYSERIAL.print(" ");
|
|
|
|
+ MYSERIAL.print(val1,BIN);
|
|
|
|
+ MYSERIAL.print(" ");
|
|
|
|
+ MYSERIAL.print(val2,BIN);
|
|
|
|
+ MYSERIAL.print(" ");
|
|
|
|
+ MYSERIAL.print(val3,BIN);
|
|
|
|
+ MYSERIAL.print(" ");
|
|
|
|
+ MYSERIAL.print(val4,BIN);
|
|
|
|
+
|
|
|
|
+ val32 = (uint32_t)val1<<24 | (uint32_t)val2<<16 | (uint32_t)val3<<8 | (uint32_t)val4;
|
|
|
|
+ MYSERIAL.print(" 0x");
|
|
|
|
+ MYSERIAL.println(val32,HEX);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ uint8_t tmc2130_read8(uint8_t chipselect, uint8_t address){
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //datagram1 - write
|
|
|
|
+ SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3));
|
|
|
|
+ digitalWrite(chipselect,LOW);
|
|
|
|
+ SPI.transfer(address);
|
|
|
|
+ SPI.transfer(0x00);
|
|
|
|
+ SPI.transfer(0x00);
|
|
|
|
+ SPI.transfer(0x00);
|
|
|
|
+ SPI.transfer(0x00);
|
|
|
|
+ digitalWrite(chipselect, HIGH);
|
|
|
|
+ SPI.endTransaction();
|
|
|
|
+
|
|
|
|
+ uint8_t val0;
|
|
|
|
+
|
|
|
|
+ //datagram2 - response
|
|
|
|
+ SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3));
|
|
|
|
+ digitalWrite(chipselect,LOW);
|
|
|
|
+ val0 = SPI.transfer(0);
|
|
|
|
+ digitalWrite(chipselect, HIGH);
|
|
|
|
+ SPI.endTransaction();
|
|
|
|
+
|
|
|
|
+ return val0;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ void tmc2130_chopconf(uint8_t cs, bool extrapolate256 = 0, uint16_t microstep_resolution = 16)
|
|
|
|
+ {
|
|
|
|
+ uint8_t mres=0b0100;
|
|
|
|
+ if(microstep_resolution == 256) mres = 0b0000;
|
|
|
|
+ if(microstep_resolution == 128) mres = 0b0001;
|
|
|
|
+ if(microstep_resolution == 64) mres = 0b0010;
|
|
|
|
+ if(microstep_resolution == 32) mres = 0b0011;
|
|
|
|
+ if(microstep_resolution == 16) mres = 0b0100;
|
|
|
|
+ if(microstep_resolution == 8) mres = 0b0101;
|
|
|
|
+ if(microstep_resolution == 4) mres = 0b0110;
|
|
|
|
+ if(microstep_resolution == 2) mres = 0b0111;
|
|
|
|
+ if(microstep_resolution == 1) mres = 0b1000;
|
|
|
|
+
|
|
|
|
+ mres |= extrapolate256 << 4; //bit28 intpol
|
|
|
|
+
|
|
|
|
+ //tmc2130_write(cs,0x6C,mres,0x01,0x00,0xD3);
|
|
|
|
+ tmc2130_write(cs,0x6C,mres,0x01,0x00,0xC3);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ void tmc2130_PWMconf(uint8_t cs, uint8_t PWMautoScale = PWM_AUTOSCALE, uint8_t PWMfreq = PWM_FREQ, uint8_t PWMgrad = PWM_GRAD, uint8_t PWMampl = PWM_AMPL)
|
|
|
|
+ {
|
|
|
|
+ tmc2130_write(cs,0x70,0x00,(PWMautoScale+PWMfreq),PWMgrad,PWMampl); // TMC LJ -> For better readability changed to 0x00 and added PWMautoScale and PWMfreq
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ void tmc2130_PWMthreshold(uint8_t cs)
|
|
|
|
+ {
|
|
|
|
+ tmc2130_write(cs,0x13,0x00,0x00,0x00,0x00); // TMC LJ -> Adds possibility to swtich from stealthChop to spreadCycle automatically
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+#endif //HAVE_TMC2130_DRIVERS
|
|
|
|
+
|
|
|
|
+ void tmc2130_init()
|
|
|
|
+ {
|
|
|
|
+#ifdef HAVE_TMC2130_DRIVERS
|
|
|
|
+ uint8_t cs[4] = { X_TMC2130_CS, Y_TMC2130_CS, Z_TMC2130_CS, E0_TMC2130_CS };
|
|
|
|
+ uint8_t current[4] = { 31, 31, 31, 31 };
|
|
|
|
+
|
|
|
|
+ WRITE(X_TMC2130_CS, HIGH);
|
|
|
|
+ WRITE(Y_TMC2130_CS, HIGH);
|
|
|
|
+ WRITE(Z_TMC2130_CS, HIGH);
|
|
|
|
+ WRITE(E0_TMC2130_CS, HIGH);
|
|
|
|
+ SET_OUTPUT(X_TMC2130_CS);
|
|
|
|
+ SET_OUTPUT(Y_TMC2130_CS);
|
|
|
|
+ SET_OUTPUT(Z_TMC2130_CS);
|
|
|
|
+ SET_OUTPUT(E0_TMC2130_CS);
|
|
|
|
+
|
|
|
|
+ SPI.begin();
|
|
|
|
+
|
|
|
|
+ for(int i=0;i<4;i++)
|
|
|
|
+ {
|
|
|
|
+ //tmc2130_write(cs[i],0x6C,0b10100,01,00,0xC5);
|
|
|
|
+ tmc2130_chopconf(cs[i],1,16);
|
|
|
|
+ tmc2130_write(cs[i],0x10,0,15,current[i],current[i]); //0x10 IHOLD_IRUN
|
|
|
|
+ //tmc2130_write(cs[i],0x0,0,0,0,0x05); //address=0x0 GCONF EXT VREF
|
|
|
|
+ tmc2130_write(cs[i],0x0,0,0,0,0x05); //address=0x0 GCONF EXT VREF - activate stealthChop
|
|
|
|
+ //tmc2130_write(cs[i],0x11,0,0,0,0xA);
|
|
|
|
+
|
|
|
|
+ // Uncomment lines below to use a different configuration (pwm_autoscale = 0) for XY axes
|
|
|
|
+ // if(i==0 || i==1)
|
|
|
|
+ // tmc2130_PWMconf(cs[i],PWM_AUTOSCALE_XY,PWM_FREQ_XY,PWM_GRAD_XY,PWM_AMPL_XY); //address=0x70 PWM_CONF //reset default=0x00050480
|
|
|
|
+ // else
|
|
|
|
+ tmc2130_PWMconf(cs[i]); //address=0x70 PWM_CONF //reset default=0x00050480
|
|
|
|
+ tmc2130_PWMthreshold(cs[i]);
|
|
|
|
+ }
|
|
|
|
+ tmc2130_chopconf(cs[3],0,256);
|
|
|
|
+#endif
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
void st_init()
|
|
void st_init()
|
|
{
|
|
{
|
|
|
|
+ tmc2130_init(); //Initialize TMC2130 drivers
|
|
digipot_init(); //Initialize Digipot Motor Current
|
|
digipot_init(); //Initialize Digipot Motor Current
|
|
microstep_init(); //Initialize Microstepping Pins
|
|
microstep_init(); //Initialize Microstepping Pins
|
|
|
|
|