TMC 2209 TMCStepper library UART configuration

Hi I'm just trying to get some practice in configuring and using the UART interface for a tmc2209 but struggling a bit.

I have done a bit of digging around but with no success.

I'm unable to get any communication between the driver and my uno. Because I want to use the hardware serial to read the serial on my pc I tried setting up software serial however this didn't seem to work and there were no changes in the readings from the driver.

Im using a bigtreetech driver

The code I was using was: (adapted from the TMCStepoer library example)

#include <SoftwareSerial.h>
#include <AccelStepper.h>

AccelStepper stepper = AccelStepper(1, 9, 8);

SoftwareSerial Serial1 (6, 7);
/**
 * Author Teemu Mäntykallio
 *
 * Plot TMC2130 or TMC2660 motor load using the stallGuard value.
 * You can finetune the reading by changing the STALL_VALUE.
 * This will let you control at which load the value will read 0
 * and the stall flag will be triggered. This will also set pin DIAG1 high.
 * A higher STALL_VALUE will make the reading less sensitive and
 * a lower STALL_VALUE will make it more sensitive.
 *
 * You can control the rotation speed with
 * 0 Stop
 * 1 Resume
 * + Speed up
 * - Slow down
 */
#include <TMCStepper.h>

#define MAX_SPEED        40 // In timer value
#define MIN_SPEED      1000

#define STALL_VALUE     10 // [0..255]

#define EN_PIN           12 // Enable
#define DIR_PIN          8 // Direction
#define STEP_PIN         9 // Step
#define SW_RX            6 // TMC2208/TMC2224 SoftwareSerial receive pin
#define SW_TX            7 // TMC2208/TMC2224 SoftwareSerial transmit pin
#define SERIAL_PORT Serial1 // TMC2208/TMC2224 HardwareSerial port
#define DRIVER_ADDRESS 0b00 // TMC2209 Driver address according to MS1 and MS2

#define R_SENSE 0.11f // Match to your driver
                      // SilentStepStick series use 0.11
                      // UltiMachine Einsy and Archim2 boards use 0.2
                      // Panucatt BSD2660 uses 0.1
                      // Watterott TMC5160 uses 0.075

// Select your stepper driver type
//TMC2209Stepper driver(&SERIAL_PORT, R_SENSE, DRIVER_ADDRESS);
TMC2209Stepper driver(SW_RX, SW_TX, R_SENSE, DRIVER_ADDRESS);

using namespace TMC2208_n;

// Using direct register manipulation can reach faster stepping times
#define STEP_PORT     PORTB // Match with STEP_PIN
#define STEP_BIT_POS      9 // Match with STEP_PIN

ISR(TIMER1_COMPA_vect){
  //STEP_PORT ^= 1 << STEP_BIT_POS;
  digitalWrite(STEP_PIN, !digitalRead(STEP_PIN));
}

void setup() {
  Serial.begin(250000);         // Init serial port and set baudrate
  while(!Serial);               // Wait for serial port to connect
  Serial.println("\nStart...");

  SERIAL_PORT.begin(115200);
  driver.beginSerial(115200);

  pinMode(EN_PIN, OUTPUT);
  pinMode(STEP_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  digitalWrite(EN_PIN, LOW);

  driver.begin();
  driver.toff(4);
  driver.blank_time(24);
  driver.rms_current(400); // mA
  driver.microsteps(16);
  driver.TCOOLTHRS(0xFFFFF); // 20bit max
  driver.semin(5);
  driver.semax(2);
  driver.sedn(0b01);
  driver.SGTHRS(STALL_VALUE);

  // Set stepper interrupt
  {
    cli();//stop interrupts
    TCCR1A = 0;// set entire TCCR1A register to 0
    TCCR1B = 0;// same for TCCR1B
    TCNT1  = 0;//initialize counter value to 0
    OCR1A = 256;// = (16*10^6) / (1*1024) - 1 (must be <65536)
    // turn on CTC mode
    TCCR1B |= (1 << WGM12);
    // Set CS11 bits for 8 prescaler
    TCCR1B |= (1 << CS11);// | (1 << CS10);
    // enable timer compare interrupt
    TIMSK1 |= (1 << OCIE1A);
    sei();//allow interrupts
  }
}

void loop() {
  stepper.setSpeed(400);
  stepper.runSpeed();
  static uint32_t last_time=0;
  uint32_t ms = millis();

  while(Serial.available() > 0) {
    int8_t read_byte = Serial.read();
    #ifdef USING_TMC2660
      if (read_byte == '0')      { TIMSK1 &= ~(1 << OCIE1A); driver.toff(0); }
      else if (read_byte == '1') { TIMSK1 |=  (1 << OCIE1A); driver.toff(driver.savedToff()); }
    #else
      if (read_byte == '0')      { TIMSK1 &= ~(1 << OCIE1A); digitalWrite( EN_PIN, HIGH ); }
      else if (read_byte == '1') { TIMSK1 |=  (1 << OCIE1A); digitalWrite( EN_PIN,  LOW ); }
    #endif
    else if (read_byte == '+') { if (OCR1A > MAX_SPEED) OCR1A -= 20; }
    else if (read_byte == '-') { if (OCR1A < MIN_SPEED) OCR1A += 20; }
  }

  if((ms-last_time) > 100) { //run every 0.1s
    last_time = ms;

    Serial.print("0 ");
    Serial.print(driver.SG_RESULT(), DEC);
    Serial.print(" ");
    Serial.println(driver.cs2rms(driver.cs_actual()), DEC);
  }
}

Can you spot anything I'm doing wrong?

Also, could someone clarify what this line means, I don't understand it.

#define DRIVER_ADDRESS 0b00 // TMC2209 Driver address according to MS1 and MS2

Thanks in advance.
Please do let me know if Im not giving enough information.

#define DRIVER_ADDRESS 0b00 // TMC2209 Driver address according to MS1 and MS2
tells us that the driver is located at 0x0b00. This is the address used to communicate
with it. I would start by debugging the UART communications on your board. Check the tx
and RX signals, A-Tx goes to B-Rx and A-Rx goes to B-Tx. If this is not working properly
nothing else will either. A schematic not a frizzy thing always helps.

Great thanks for that.
So is the address '0x0b00' like the io port address or is it the address for the driver on the actual driver itself. How would I find this address?
The driver has a one-pin UART interface which I split to RX and tx using a 1k resistor on the tx line.

Here's a schematic for the driver itself if it helps in any way:
Driver Schematic

Thanks for your help.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.