2017-06-29 16:35:43 +00:00
# include "Marlin.h"
# ifdef HAVE_TMC2130_DRIVERS
# include "tmc2130.h"
# include <SPI.h>
2017-07-01 10:39:16 +00:00
//externals for debuging
extern float current_position [ 4 ] ;
extern void st_get_position_xy ( long & x , long & y ) ;
//chipselect pins
uint8_t tmc2130_cs [ 4 ] = { X_TMC2130_CS , Y_TMC2130_CS , Z_TMC2130_CS , E0_TMC2130_CS } ;
2017-07-03 05:43:50 +00:00
//mode
uint8_t tmc2130_mode = TMC2130_MODE_NORMAL ;
2017-07-01 10:39:16 +00:00
//holding currents
uint8_t tmc2130_current_h [ 4 ] = TMC2130_CURRENTS_H ;
//running currents
uint8_t tmc2130_current_r [ 4 ] = TMC2130_CURRENTS_R ;
//axis stalled flags
2017-07-06 11:06:07 +00:00
uint8_t tmc2130_axis_stalled [ 2 ] = { 0 , 0 } ;
2017-07-01 10:39:16 +00:00
//last homing stalled
uint8_t tmc2130_LastHomingStalled = 0 ;
2017-07-06 11:06:07 +00:00
//pwm_ampl
uint8_t tmc2130_pwm_ampl [ 2 ] = { TMC2130_PWM_AMPL_XY , TMC2130_PWM_AMPL_XY } ;
//pwm_grad
uint8_t tmc2130_pwm_grad [ 2 ] = { TMC2130_PWM_GRAD_XY , TMC2130_PWM_GRAD_XY } ;
//pwm_auto
uint8_t tmc2130_pwm_auto [ 2 ] = { TMC2130_PWM_AUTO_XY , TMC2130_PWM_AUTO_XY } ;
//pwm_freq
uint8_t tmc2130_pwm_freq [ 2 ] = { TMC2130_PWM_FREQ_XY , TMC2130_PWM_FREQ_XY } ;
2017-07-01 10:39:16 +00:00
uint8_t sg_homing_axis = 0xff ;
uint8_t sg_homing_delay = 0 ;
2017-07-03 08:39:56 +00:00
uint8_t sg_thrs_x = TMC2130_SG_THRS_X ;
uint8_t sg_thrs_y = TMC2130_SG_THRS_Y ;
2017-07-06 11:06:07 +00:00
bool skip_debug_msg = false ;
2017-07-01 10:39:16 +00:00
2017-07-02 22:11:42 +00:00
//TMC2130 registers
# define TMC2130_REG_GCONF 0x00 // 17 bits
# define TMC2130_REG_GSTAT 0x01 // 3 bits
# define TMC2130_REG_IOIN 0x04 // 8+8 bits
# define TMC2130_REG_IHOLD_IRUN 0x10 // 5+5+4 bits
# define TMC2130_REG_TPOWERDOWN 0x11 // 8 bits
# define TMC2130_REG_TSTEP 0x12 // 20 bits
# define TMC2130_REG_TPWMTHRS 0x13 // 20 bits
# define TMC2130_REG_TCOOLTHRS 0x14 // 20 bits
# define TMC2130_REG_THIGH 0x15 // 20 bits
# define TMC2130_REG_XDIRECT 0x2d // 32 bits
# define TMC2130_REG_VDCMIN 0x33 // 23 bits
# define TMC2130_REG_MSLUT0 0x60 // 32 bits
# define TMC2130_REG_MSLUT1 0x61 // 32 bits
# define TMC2130_REG_MSLUT2 0x62 // 32 bits
# define TMC2130_REG_MSLUT3 0x63 // 32 bits
# define TMC2130_REG_MSLUT4 0x64 // 32 bits
# define TMC2130_REG_MSLUT5 0x65 // 32 bits
# define TMC2130_REG_MSLUT6 0x66 // 32 bits
# define TMC2130_REG_MSLUT7 0x67 // 32 bits
# define TMC2130_REG_MSLUTSEL 0x68 // 32 bits
# define TMC2130_REG_MSLUTSTART 0x69 // 8+8 bits
# define TMC2130_REG_MSCNT 0x6a // 10 bits
# define TMC2130_REG_MSCURACT 0x6b // 9+9 bits
# define TMC2130_REG_CHOPCONF 0x6c // 32 bits
# define TMC2130_REG_COOLCONF 0x6d // 25 bits
# define TMC2130_REG_DCCTRL 0x6e // 24 bits
# define TMC2130_REG_DRV_STATUS 0x6f // 32 bits
# define TMC2130_REG_PWMCONF 0x70 // 22 bits
# define TMC2130_REG_PWM_SCALE 0x71 // 8 bits
# define TMC2130_REG_ENCM_CTRL 0x72 // 2 bits
# define TMC2130_REG_LOST_STEPS 0x73 // 20 bits
uint16_t tmc2130_rd_TSTEP ( uint8_t cs ) ;
uint16_t tmc2130_rd_DRV_STATUS ( uint8_t chipselect ) ;
2017-07-06 11:06:07 +00:00
void tmc2130_wr_CHOPCONF ( uint8_t cs , uint8_t toff = 3 , uint8_t hstrt = 4 , uint8_t hend = 1 , uint8_t fd3 = 0 , uint8_t disfdcc = 0 , uint8_t rndtf = 0 , uint8_t chm = 0 , uint8_t tbl = 2 , uint8_t vsense = 0 , uint8_t vhighfs = 0 , uint8_t vhighchm = 0 , uint8_t sync = 0 , uint8_t mres = 0b0100 , uint8_t intpol = 1 , uint8_t dedge = 0 , uint8_t diss2g = 0 ) ;
void tmc2130_wr_PWMCONF ( uint8_t cs , uint8_t pwm_ampl , uint8_t pwm_grad , uint8_t pwm_freq , uint8_t pwm_auto , uint8_t pwm_symm , uint8_t freewheel ) ;
2017-07-02 22:11:42 +00:00
void tmc2130_wr_TPWMTHRS ( uint8_t cs , uint32_t val32 ) ;
void tmc2130_wr_THIGH ( uint8_t cs , uint32_t val32 ) ;
2017-07-06 11:06:07 +00:00
uint8_t tmc2130_axis_by_cs ( uint8_t cs ) ;
uint8_t tmc2130_mres ( uint16_t microstep_resolution ) ;
2017-07-02 22:11:42 +00:00
uint8_t tmc2130_wr ( uint8_t cs , uint8_t addr , uint32_t wval ) ;
uint8_t tmc2130_rd ( uint8_t cs , uint8_t addr , uint32_t * rval ) ;
2017-07-06 11:06:07 +00:00
uint8_t tmc2130_txrx ( uint8_t cs , uint8_t addr , uint32_t wval , uint32_t * rval ) ;
2017-07-01 10:39:16 +00:00
void tmc2130_init ( )
{
2017-07-03 05:43:50 +00:00
MYSERIAL . print ( " tmc2130_init mode= " ) ;
MYSERIAL . println ( tmc2130_mode , DEC ) ;
2017-07-01 10:39:16 +00:00
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 ( ) ;
2017-07-02 22:11:42 +00:00
for ( int i = 0 ; i < 2 ; i + + ) // X Y axes
2017-07-01 10:39:16 +00:00
{
2017-07-06 11:06:07 +00:00
uint8_t mres = tmc2130_mres ( TMC2130_USTEPS_XY ) ;
tmc2130_wr_CHOPCONF ( tmc2130_cs [ i ] , 3 , 5 , 1 , 0 , 0 , 0 , 0 , 2 , 1 , 0 , 0 , 0 , mres , TMC2130_INTPOL_XY , 0 , 0 ) ;
2017-07-02 22:11:42 +00:00
tmc2130_wr ( tmc2130_cs [ i ] , TMC2130_REG_IHOLD_IRUN , 0x000f0000 | ( ( tmc2130_current_r [ i ] & 0x1f ) < < 8 ) | ( tmc2130_current_h [ i ] & 0x1f ) ) ;
tmc2130_wr ( tmc2130_cs [ i ] , TMC2130_REG_TPOWERDOWN , 0x00000000 ) ;
2017-07-06 11:06:07 +00:00
tmc2130_wr ( tmc2130_cs [ i ] , TMC2130_REG_GCONF , ( tmc2130_mode = = TMC2130_MODE_SILENT ) ? 0x00000004 : 0x00000000 ) ;
tmc2130_wr_PWMCONF ( tmc2130_cs [ i ] , tmc2130_pwm_ampl [ i ] , tmc2130_pwm_grad [ i ] , tmc2130_pwm_freq [ i ] , tmc2130_pwm_auto [ i ] , 0 , 0 ) ;
2017-07-03 05:43:50 +00:00
tmc2130_wr_TPWMTHRS ( tmc2130_cs [ i ] , TMC2130_TPWMTHRS ) ;
2017-07-02 22:11:42 +00:00
//tmc2130_wr_THIGH(tmc2130_cs[i], TMC2130_THIGH);
2017-07-01 10:39:16 +00:00
}
2017-07-02 22:11:42 +00:00
for ( int i = 2 ; i < 3 ; i + + ) // Z axis
2017-07-01 10:39:16 +00:00
{
2017-07-06 11:06:07 +00:00
uint8_t mres = tmc2130_mres ( TMC2130_USTEPS_Z ) ;
tmc2130_wr_CHOPCONF ( tmc2130_cs [ i ] , 3 , 5 , 1 , 0 , 0 , 0 , 0 , 2 , 1 , 0 , 0 , 0 , mres , TMC2130_INTPOL_Z , 0 , 0 ) ;
2017-07-02 22:11:42 +00:00
tmc2130_wr ( tmc2130_cs [ i ] , TMC2130_REG_IHOLD_IRUN , 0x000f0000 | ( ( tmc2130_current_r [ i ] & 0x1f ) < < 8 ) | ( tmc2130_current_h [ i ] & 0x1f ) ) ;
tmc2130_wr ( tmc2130_cs [ i ] , TMC2130_REG_TPOWERDOWN , 0x00000000 ) ;
2017-07-06 11:06:07 +00:00
tmc2130_wr ( tmc2130_cs [ i ] , TMC2130_REG_GCONF , 0x00000000 ) ;
2017-07-02 22:11:42 +00:00
}
for ( int i = 3 ; i < 4 ; i + + ) // E axis
{
2017-07-06 11:06:07 +00:00
uint8_t mres = tmc2130_mres ( TMC2130_USTEPS_E ) ;
tmc2130_wr_CHOPCONF ( tmc2130_cs [ i ] , 3 , 5 , 1 , 0 , 0 , 0 , 0 , 2 , 1 , 0 , 0 , 0 , mres , TMC2130_INTPOL_E , 0 , 0 ) ;
2017-07-02 22:11:42 +00:00
tmc2130_wr ( tmc2130_cs [ i ] , TMC2130_REG_IHOLD_IRUN , 0x000f0000 | ( ( tmc2130_current_r [ i ] & 0x1f ) < < 8 ) | ( tmc2130_current_h [ i ] & 0x1f ) ) ;
tmc2130_wr ( tmc2130_cs [ i ] , TMC2130_REG_TPOWERDOWN , 0x00000000 ) ;
2017-07-06 11:06:07 +00:00
tmc2130_wr ( tmc2130_cs [ i ] , TMC2130_REG_GCONF , 0x00000000 ) ;
2017-07-01 10:39:16 +00:00
}
}
bool tmc2130_update_sg ( )
{
2017-07-03 08:39:56 +00:00
# if (defined(TMC2130_SG_HOMING) && defined(TMC2130_SG_HOMING_SW))
2017-07-01 10:39:16 +00:00
if ( ( sg_homing_axis = = X_AXIS ) | | ( sg_homing_axis = = Y_AXIS ) )
{
uint8_t cs = tmc2130_cs [ sg_homing_axis ] ;
2017-07-02 22:11:42 +00:00
uint16_t tstep = tmc2130_rd_TSTEP ( cs ) ;
if ( tstep < TMC2130_TCOOLTHRS )
2017-07-01 10:39:16 +00:00
{
2017-07-04 14:23:28 +00:00
if ( sg_homing_delay < TMC2130_SG_DELAY ) // wait for a few tens microsteps until stallGuard is used //todo: read out microsteps directly, instead of delay counter
2017-07-01 10:39:16 +00:00
sg_homing_delay + + ;
else
{
2017-07-02 22:11:42 +00:00
uint16_t sg = tmc2130_rd_DRV_STATUS ( cs ) & 0x3ff ;
2017-07-01 10:39:16 +00:00
if ( sg = = 0 )
{
tmc2130_axis_stalled [ sg_homing_axis ] = true ;
tmc2130_LastHomingStalled = true ;
}
else
tmc2130_axis_stalled [ sg_homing_axis ] = false ;
}
}
else
tmc2130_axis_stalled [ sg_homing_axis ] = false ;
return true ;
}
else
{
tmc2130_axis_stalled [ X_AXIS ] = false ;
tmc2130_axis_stalled [ Y_AXIS ] = false ;
}
2017-07-03 08:39:56 +00:00
# endif
2017-07-01 10:39:16 +00:00
return false ;
}
void tmc2130_check_overtemp ( )
{
const static char TMC_OVERTEMP_MSG [ ] PROGMEM = " TMC DRIVER OVERTEMP " ;
2017-07-02 22:11:42 +00:00
uint8_t cs [ 4 ] = { X_TMC2130_CS , Y_TMC2130_CS , Z_TMC2130_CS , E0_TMC2130_CS } ;
2017-07-01 10:39:16 +00:00
static uint32_t checktime = 0 ;
//drivers_disabled[0] = 1; //TEST
if ( millis ( ) - checktime > 1000 )
{
2017-07-04 09:31:39 +00:00
//SERIAL_ECHOLNPGM("drv_status:");
2017-07-02 22:11:42 +00:00
for ( int i = 0 ; i < 4 ; i + + )
2017-07-01 10:39:16 +00:00
{
2017-07-02 22:11:42 +00:00
uint32_t drv_status = 0 ;
2017-07-06 11:06:07 +00:00
skip_debug_msg = true ;
2017-07-02 22:11:42 +00:00
tmc2130_rd ( cs [ i ] , TMC2130_REG_DRV_STATUS , & drv_status ) ;
2017-07-04 09:31:39 +00:00
//MYSERIAL.print(drv_status);
//SERIAL_ECHOPGM(" ");
2017-07-01 10:39:16 +00:00
if ( drv_status & ( ( uint32_t ) 1 < < 26 ) )
{ // BIT 26 - over temp prewarning ~120C (+-20C)
SERIAL_ERRORRPGM ( TMC_OVERTEMP_MSG ) ;
SERIAL_ECHOLN ( i ) ;
2017-07-02 22:11:42 +00:00
for ( int i = 0 ; i < 4 ; i + + )
tmc2130_wr ( tmc2130_cs [ i ] , TMC2130_REG_CHOPCONF , 0x00010000 ) ;
kill ( TMC_OVERTEMP_MSG ) ;
2017-07-01 10:39:16 +00:00
}
}
2017-07-04 09:31:39 +00:00
//SERIAL_ECHOLNPGM("");
2017-07-01 10:39:16 +00:00
checktime = millis ( ) ;
}
}
void tmc2130_home_enter ( uint8_t axis )
{
MYSERIAL . print ( " tmc2130_home_enter " ) ;
MYSERIAL . println ( ( int ) axis ) ;
2017-07-03 08:39:56 +00:00
# ifdef TMC2130_SG_HOMING
2017-07-01 10:39:16 +00:00
uint8_t cs = tmc2130_cs [ axis ] ;
sg_homing_axis = axis ;
sg_homing_delay = 0 ;
tmc2130_axis_stalled [ X_AXIS ] = false ;
tmc2130_axis_stalled [ Y_AXIS ] = false ;
//Configuration to spreadCycle
2017-07-02 22:11:42 +00:00
tmc2130_wr ( cs , TMC2130_REG_GCONF , 0x00000000 ) ;
2017-07-03 08:39:56 +00:00
tmc2130_wr ( cs , TMC2130_REG_COOLCONF , ( ( axis = = X_AXIS ) ? sg_thrs_x : sg_thrs_y ) < < 16 ) ;
2017-07-02 22:11:42 +00:00
tmc2130_wr ( cs , TMC2130_REG_TCOOLTHRS , TMC2130_TCOOLTHRS ) ;
2017-07-03 08:39:56 +00:00
# ifndef TMC2130_SG_HOMING_SW
tmc2130_wr ( cs , TMC2130_REG_GCONF , 0x00000080 ) ; //stallguard output to DIAG0
# endif
# endif
2017-07-01 10:39:16 +00:00
}
void tmc2130_home_exit ( )
{
2017-07-03 08:39:56 +00:00
MYSERIAL . println ( " tmc2130_home_exit " ) ;
MYSERIAL . println ( ( int ) sg_homing_axis ) ;
# ifdef TMC2130_SG_HOMING
2017-07-01 10:39:16 +00:00
if ( ( sg_homing_axis = = X_AXIS ) | | ( sg_homing_axis = = Y_AXIS ) )
{
2017-07-03 05:43:50 +00:00
if ( tmc2130_mode = = TMC2130_MODE_SILENT )
2017-07-03 08:39:56 +00:00
tmc2130_wr ( tmc2130_cs [ sg_homing_axis ] , TMC2130_REG_GCONF , 0x00000004 ) ; // Configuration back to stealthChop
else
tmc2130_wr ( tmc2130_cs [ sg_homing_axis ] , TMC2130_REG_GCONF , 0x00000000 ) ;
2017-07-01 10:39:16 +00:00
sg_homing_axis = 0xff ;
}
2017-07-03 08:39:56 +00:00
# endif
2017-07-01 10:39:16 +00:00
}
2017-07-06 11:06:07 +00:00
uint8_t tmc2130_didLastHomingStall ( )
2017-07-01 10:39:16 +00:00
{
uint8_t ret = tmc2130_LastHomingStalled ;
tmc2130_LastHomingStalled = false ;
return ret ;
}
void tmc2130_set_current_h ( uint8_t axis , uint8_t current )
{
MYSERIAL . print ( " tmc2130_set_current_h " ) ;
MYSERIAL . print ( ( int ) axis ) ;
MYSERIAL . print ( " " ) ;
MYSERIAL . println ( ( int ) current ) ;
2017-07-06 11:06:07 +00:00
// if (current > 15) current = 15; //current>15 is unsafe
2017-07-01 10:39:16 +00:00
tmc2130_current_h [ axis ] = current ;
2017-07-02 22:11:42 +00:00
tmc2130_wr ( tmc2130_cs [ axis ] , TMC2130_REG_IHOLD_IRUN , 0x000f0000 | ( ( tmc2130_current_r [ axis ] & 0x1f ) < < 8 ) | ( tmc2130_current_h [ axis ] & 0x1f ) ) ;
2017-07-01 10:39:16 +00:00
}
void tmc2130_set_current_r ( uint8_t axis , uint8_t current )
{
MYSERIAL . print ( " tmc2130_set_current_r " ) ;
MYSERIAL . print ( ( int ) axis ) ;
MYSERIAL . print ( " " ) ;
MYSERIAL . println ( ( int ) current ) ;
2017-07-06 11:06:07 +00:00
// if (current > 15) current = 15; //current>15 is unsafe
2017-07-01 10:39:16 +00:00
tmc2130_current_r [ axis ] = current ;
2017-07-02 22:11:42 +00:00
tmc2130_wr ( tmc2130_cs [ axis ] , TMC2130_REG_IHOLD_IRUN , 0x000f0000 | ( ( tmc2130_current_r [ axis ] & 0x1f ) < < 8 ) | ( tmc2130_current_h [ axis ] & 0x1f ) ) ;
2017-07-01 10:39:16 +00:00
}
void tmc2130_print_currents ( )
{
MYSERIAL . println ( " tmc2130_print_currents " ) ;
MYSERIAL . println ( " \t H \r R " ) ;
MYSERIAL . print ( " X \t " ) ;
MYSERIAL . print ( ( int ) tmc2130_current_h [ 0 ] ) ;
MYSERIAL . print ( " \t " ) ;
MYSERIAL . println ( ( int ) tmc2130_current_r [ 0 ] ) ;
MYSERIAL . print ( " Y \t " ) ;
MYSERIAL . print ( ( int ) tmc2130_current_h [ 1 ] ) ;
MYSERIAL . print ( " \t " ) ;
MYSERIAL . println ( ( int ) tmc2130_current_r [ 1 ] ) ;
MYSERIAL . print ( " Z \t " ) ;
MYSERIAL . print ( ( int ) tmc2130_current_h [ 2 ] ) ;
MYSERIAL . print ( " \t " ) ;
MYSERIAL . println ( ( int ) tmc2130_current_r [ 2 ] ) ;
MYSERIAL . print ( " E \t " ) ;
MYSERIAL . print ( ( int ) tmc2130_current_h [ 3 ] ) ;
MYSERIAL . print ( " \t " ) ;
MYSERIAL . println ( ( int ) tmc2130_current_r [ 3 ] ) ;
}
2017-07-06 11:06:07 +00:00
void tmc2130_set_pwm_ampl ( uint8_t axis , uint8_t pwm_ampl )
{
MYSERIAL . print ( " tmc2130_set_pwm_ampl " ) ;
MYSERIAL . print ( ( int ) axis ) ;
MYSERIAL . print ( " " ) ;
MYSERIAL . println ( ( int ) pwm_ampl ) ;
tmc2130_pwm_ampl [ axis ] = pwm_ampl ;
if ( ( ( axis = = 0 ) | | ( axis = = 1 ) ) & & ( tmc2130_mode = = TMC2130_MODE_SILENT ) )
tmc2130_wr_PWMCONF ( tmc2130_cs [ axis ] , tmc2130_pwm_ampl [ axis ] , tmc2130_pwm_grad [ axis ] , tmc2130_pwm_freq [ axis ] , tmc2130_pwm_auto [ axis ] , 0 , 0 ) ;
}
void tmc2130_set_pwm_grad ( uint8_t axis , uint8_t pwm_grad )
{
MYSERIAL . print ( " tmc2130_set_pwm_grad " ) ;
MYSERIAL . print ( ( int ) axis ) ;
MYSERIAL . print ( " " ) ;
MYSERIAL . println ( ( int ) pwm_grad ) ;
tmc2130_pwm_grad [ axis ] = pwm_grad ;
if ( ( ( axis = = 0 ) | | ( axis = = 1 ) ) & & ( tmc2130_mode = = TMC2130_MODE_SILENT ) )
tmc2130_wr_PWMCONF ( tmc2130_cs [ axis ] , tmc2130_pwm_ampl [ axis ] , tmc2130_pwm_grad [ axis ] , tmc2130_pwm_freq [ axis ] , tmc2130_pwm_auto [ axis ] , 0 , 0 ) ;
}
2017-07-02 22:11:42 +00:00
uint16_t tmc2130_rd_TSTEP ( uint8_t cs )
2017-06-29 16:35:43 +00:00
{
2017-07-02 22:11:42 +00:00
uint32_t val32 = 0 ;
tmc2130_rd ( cs , TMC2130_REG_TSTEP , & val32 ) ;
if ( val32 & 0x000f0000 ) return 0xffff ;
return val32 & 0xffff ;
2017-06-29 16:35:43 +00:00
}
2017-07-02 22:11:42 +00:00
uint16_t tmc2130_rd_DRV_STATUS ( uint8_t cs )
2017-06-29 16:35:43 +00:00
{
2017-07-02 22:11:42 +00:00
uint32_t val32 = 0 ;
tmc2130_rd ( cs , TMC2130_REG_DRV_STATUS , & val32 ) ;
return val32 ;
2017-06-29 16:35:43 +00:00
}
2017-07-06 11:06:07 +00:00
void tmc2130_wr_CHOPCONF ( uint8_t cs , uint8_t toff , uint8_t hstrt , uint8_t hend , uint8_t fd3 , uint8_t disfdcc , uint8_t rndtf , uint8_t chm , uint8_t tbl , uint8_t vsense , uint8_t vhighfs , uint8_t vhighchm , uint8_t sync , uint8_t mres , uint8_t intpol , uint8_t dedge , uint8_t diss2g )
2017-06-29 16:35:43 +00:00
{
2017-07-06 11:06:07 +00:00
uint32_t val = 0 ;
val | = ( uint32_t ) ( toff & 15 ) ;
val | = ( uint32_t ) ( hstrt & 7 ) < < 4 ;
val | = ( uint32_t ) ( hend & 15 ) < < 7 ;
val | = ( uint32_t ) ( fd3 & 1 ) < < 11 ;
val | = ( uint32_t ) ( disfdcc & 1 ) < < 12 ;
val | = ( uint32_t ) ( rndtf & 1 ) < < 13 ;
val | = ( uint32_t ) ( chm & 1 ) < < 14 ;
val | = ( uint32_t ) ( tbl & 3 ) < < 15 ;
val | = ( uint32_t ) ( vsense & 1 ) < < 17 ;
val | = ( uint32_t ) ( vhighfs & 1 ) < < 18 ;
val | = ( uint32_t ) ( vhighchm & 1 ) < < 19 ;
val | = ( uint32_t ) ( sync & 15 ) < < 20 ;
val | = ( uint32_t ) ( mres & 15 ) < < 24 ;
val | = ( uint32_t ) ( intpol & 1 ) < < 28 ;
val | = ( uint32_t ) ( dedge & 1 ) < < 29 ;
val | = ( uint32_t ) ( diss2g & 1 ) < < 30 ;
tmc2130_wr ( cs , TMC2130_REG_CHOPCONF , val ) ;
2017-06-29 16:35:43 +00:00
}
2017-07-06 11:06:07 +00:00
//void tmc2130_wr_PWMCONF(uint8_t cs, uint8_t PWMautoScale, uint8_t PWMfreq, uint8_t PWMgrad, uint8_t PWMampl)
void tmc2130_wr_PWMCONF ( uint8_t cs , uint8_t pwm_ampl , uint8_t pwm_grad , uint8_t pwm_freq , uint8_t pwm_auto , uint8_t pwm_symm , uint8_t freewheel )
2017-06-29 16:35:43 +00:00
{
2017-07-06 11:06:07 +00:00
uint32_t val = 0 ;
val | = ( uint32_t ) ( pwm_ampl & 255 ) ;
val | = ( uint32_t ) ( pwm_grad & 255 ) < < 8 ;
val | = ( uint32_t ) ( pwm_freq & 3 ) < < 16 ;
val | = ( uint32_t ) ( pwm_auto & 1 ) < < 18 ;
val | = ( uint32_t ) ( pwm_symm & 1 ) < < 19 ;
val | = ( uint32_t ) ( freewheel & 3 ) < < 20 ;
tmc2130_wr ( cs , TMC2130_REG_PWMCONF , val ) ;
// tmc2130_wr(cs, TMC2130_REG_PWMCONF, ((uint32_t)(PWMautoScale+PWMfreq) << 16) | ((uint32_t)PWMgrad << 8) | PWMampl); // TMC LJ -> For better readability changed to 0x00 and added PWMautoScale and PWMfreq
2017-06-29 16:35:43 +00:00
}
2017-07-02 22:11:42 +00:00
void tmc2130_wr_TPWMTHRS ( uint8_t cs , uint32_t val32 )
2017-06-29 16:35:43 +00:00
{
2017-07-02 22:11:42 +00:00
tmc2130_wr ( cs , TMC2130_REG_TPWMTHRS , val32 ) ;
2017-06-29 16:35:43 +00:00
}
2017-07-02 22:11:42 +00:00
void tmc2130_wr_THIGH ( uint8_t cs , uint32_t val32 )
2017-06-29 16:35:43 +00:00
{
2017-07-02 22:11:42 +00:00
tmc2130_wr ( cs , TMC2130_REG_THIGH , val32 ) ;
2017-06-29 16:35:43 +00:00
}
2017-07-02 22:11:42 +00:00
uint8_t tmc2130_axis_by_cs ( uint8_t cs )
2017-06-29 16:35:43 +00:00
{
2017-07-02 22:11:42 +00:00
switch ( cs )
{
case X_TMC2130_CS : return 0 ;
case Y_TMC2130_CS : return 1 ;
case Z_TMC2130_CS : return 2 ;
case E0_TMC2130_CS : return 3 ;
}
return - 1 ;
2017-06-29 16:35:43 +00:00
}
2017-07-06 11:06:07 +00:00
uint8_t tmc2130_mres ( uint16_t microstep_resolution )
{
if ( microstep_resolution = = 256 ) return 0b0000 ;
if ( microstep_resolution = = 128 ) return 0b0001 ;
if ( microstep_resolution = = 64 ) return 0b0010 ;
if ( microstep_resolution = = 32 ) return 0b0011 ;
if ( microstep_resolution = = 16 ) return 0b0100 ;
if ( microstep_resolution = = 8 ) return 0b0101 ;
if ( microstep_resolution = = 4 ) return 0b0110 ;
if ( microstep_resolution = = 2 ) return 0b0111 ;
if ( microstep_resolution = = 1 ) return 0b1000 ;
return 0 ;
}
2017-07-02 22:11:42 +00:00
uint8_t tmc2130_wr ( uint8_t cs , uint8_t addr , uint32_t wval )
2017-06-29 16:35:43 +00:00
{
2017-07-02 22:11:42 +00:00
uint8_t stat = tmc2130_txrx ( cs , addr | 0x80 , wval , 0 ) ;
# ifdef TMC2130_DEBUG_WR
MYSERIAL . print ( " tmc2130_wr( " ) ;
MYSERIAL . print ( ( unsigned char ) tmc2130_axis_by_cs ( cs ) , DEC ) ;
MYSERIAL . print ( " , 0x " ) ;
MYSERIAL . print ( ( unsigned char ) addr , HEX ) ;
MYSERIAL . print ( " , 0x " ) ;
MYSERIAL . print ( ( unsigned long ) wval , HEX ) ;
MYSERIAL . print ( " )=0x " ) ;
MYSERIAL . println ( ( unsigned char ) stat , HEX ) ;
# endif //TMC2130_DEBUG_WR
return stat ;
2017-06-29 16:35:43 +00:00
}
2017-07-02 22:11:42 +00:00
uint8_t tmc2130_rd ( uint8_t cs , uint8_t addr , uint32_t * rval )
2017-06-29 16:35:43 +00:00
{
2017-07-02 22:11:42 +00:00
uint32_t val32 = 0 ;
uint8_t stat = tmc2130_txrx ( cs , addr , 0x00000000 , & val32 ) ;
if ( rval ! = 0 ) * rval = val32 ;
# ifdef TMC2130_DEBUG_RD
2017-07-06 11:06:07 +00:00
if ( ! skip_debug_msg )
{
MYSERIAL . print ( " tmc2130_rd( " ) ;
MYSERIAL . print ( ( unsigned char ) tmc2130_axis_by_cs ( cs ) , DEC ) ;
MYSERIAL . print ( " , 0x " ) ;
MYSERIAL . print ( ( unsigned char ) addr , HEX ) ;
MYSERIAL . print ( " , 0x " ) ;
MYSERIAL . print ( ( unsigned long ) val32 , HEX ) ;
MYSERIAL . print ( " )=0x " ) ;
MYSERIAL . println ( ( unsigned char ) stat , HEX ) ;
}
skip_debug_msg = false ;
2017-07-02 22:11:42 +00:00
# endif //TMC2130_DEBUG_RD
return stat ;
2017-06-29 16:35:43 +00:00
}
2017-07-02 22:11:42 +00:00
uint8_t tmc2130_txrx ( uint8_t cs , uint8_t addr , uint32_t wval , uint32_t * rval )
2017-06-29 16:35:43 +00:00
{
2017-07-02 22:11:42 +00:00
//datagram1 - request
SPI . beginTransaction ( SPISettings ( 4000000 , MSBFIRST , SPI_MODE3 ) ) ;
digitalWrite ( cs , LOW ) ;
SPI . transfer ( addr ) ; // address
SPI . transfer ( ( wval > > 24 ) & 0xff ) ; // MSB
SPI . transfer ( ( wval > > 16 ) & 0xff ) ;
SPI . transfer ( ( wval > > 8 ) & 0xff ) ;
SPI . transfer ( wval & 0xff ) ; // LSB
digitalWrite ( cs , HIGH ) ;
SPI . endTransaction ( ) ;
//datagram2 - response
SPI . beginTransaction ( SPISettings ( 4000000 , MSBFIRST , SPI_MODE3 ) ) ;
digitalWrite ( cs , LOW ) ;
uint8_t stat = SPI . transfer ( 0 ) ; // status
uint32_t val32 = 0 ;
val32 = SPI . transfer ( 0 ) ; // MSB
val32 = ( val32 < < 8 ) | SPI . transfer ( 0 ) ;
val32 = ( val32 < < 8 ) | SPI . transfer ( 0 ) ;
val32 = ( val32 < < 8 ) | SPI . transfer ( 0 ) ; // LSB
digitalWrite ( cs , HIGH ) ;
SPI . endTransaction ( ) ;
if ( rval ! = 0 ) * rval = val32 ;
return stat ;
2017-06-29 16:35:43 +00:00
}
# endif //HAVE_TMC2130_DRIVERS