tmc2130: Initial spi communication
parent
e2ba71fc03
commit
1022603f9d
|
|
@ -13,5 +13,32 @@ void TMC2130::Init(const MotorParams ¶ms) {
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t TMC2130::ReadRegister(const MotorParams ¶ms, Registers reg) {
|
||||||
|
uint8_t pData[5] = {(uint8_t)reg};
|
||||||
|
_spi_tx_rx(params, pData);
|
||||||
|
// _handle_spi_status(pData[0]); /// could be outdated. Safer not to use it.
|
||||||
|
pData[0] = 0;
|
||||||
|
_spi_tx_rx(params, pData);
|
||||||
|
_handle_spi_status(pData[0]);
|
||||||
|
return ((uint32_t)pData[1] << 24 | (uint32_t)pData[2] << 16 | (uint32_t)pData[3] << 8 | (uint32_t)pData[4]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TMC2130::WriteRegister(const MotorParams ¶ms, Registers reg, uint32_t data) {
|
||||||
|
uint8_t pData[5] = {(uint8_t)((uint8_t)(reg) | 0x80), (uint8_t)(data >> 24), (uint8_t)(data >> 16), (uint8_t)(data >> 8), (uint8_t)data};
|
||||||
|
_spi_tx_rx(params, pData);
|
||||||
|
_handle_spi_status(pData[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TMC2130::_spi_tx_rx(const MotorParams ¶ms, uint8_t (&pData)[5]) {
|
||||||
|
hal::gpio::WritePin(params.csPin, hal::gpio::Level::low);
|
||||||
|
for (uint8_t i = 0; i < sizeof(pData); i++)
|
||||||
|
pData[i] = hal::spi::TxRx(params.spi, pData[i]);
|
||||||
|
hal::gpio::WritePin(params.csPin, hal::gpio::Level::high);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TMC2130::_handle_spi_status(uint8_t status) {
|
||||||
|
spi_status |= status & 0x03; /// update reset_flag and driver_error
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace tmc2130
|
} // namespace tmc2130
|
||||||
} // namespace hal
|
} // namespace hal
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "../hal/gpio.h"
|
#include "../hal/gpio.h"
|
||||||
#include "../hal/shr16.h"
|
#include "../hal/shr16.h"
|
||||||
|
#include "../hal/spi.h"
|
||||||
|
|
||||||
namespace hal {
|
namespace hal {
|
||||||
|
|
||||||
|
|
@ -16,6 +17,7 @@ enum MotorMode : uint8_t {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MotorParams {
|
struct MotorParams {
|
||||||
|
hal::spi::SPI_TypeDef *spi;
|
||||||
uint8_t idx; ///< SHR16 index
|
uint8_t idx; ///< SHR16 index
|
||||||
bool dirOn; ///< forward direction
|
bool dirOn; ///< forward direction
|
||||||
gpio::GPIO_pin csPin; ///< CS pin
|
gpio::GPIO_pin csPin; ///< CS pin
|
||||||
|
|
@ -33,8 +35,31 @@ struct MotorCurrents {
|
||||||
class TMC2130 {
|
class TMC2130 {
|
||||||
MotorMode mode;
|
MotorMode mode;
|
||||||
MotorCurrents currents;
|
MotorCurrents currents;
|
||||||
|
uint8_t spi_status = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
enum class Registers : uint8_t {
|
||||||
|
/// General Configuration Registers
|
||||||
|
GCONF = 0x00,
|
||||||
|
GSTAT = 0x01,
|
||||||
|
IOIN = 0x04,
|
||||||
|
|
||||||
|
/// Velocity Dependent Driver Feature Control Register Set
|
||||||
|
IHOLD_IRUN = 0x10,
|
||||||
|
TPOWERDOWN = 0x11,
|
||||||
|
TSTEP = 0x12,
|
||||||
|
TPWMTHRS = 0x13,
|
||||||
|
TCOOLTHRS = 0x14,
|
||||||
|
THIGH = 0x15,
|
||||||
|
|
||||||
|
/// Motor Driver Registers
|
||||||
|
MSCNT = 0x6A,
|
||||||
|
CHOPCONF = 0x6C,
|
||||||
|
COOLCONF = 0x6D,
|
||||||
|
DRV_STATUS = 0x6F,
|
||||||
|
PWMCONF = 0x70,
|
||||||
|
};
|
||||||
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
TMC2130(const MotorParams ¶ms,
|
TMC2130(const MotorParams ¶ms,
|
||||||
const MotorCurrents ¤ts,
|
const MotorCurrents ¤ts,
|
||||||
|
|
@ -82,27 +107,15 @@ public:
|
||||||
return gpio::ReadPin(params.sgPin) == gpio::Level::high;
|
return gpio::ReadPin(params.sgPin) == gpio::Level::high;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class Registers : uint8_t {
|
/// Reads a driver register and updates the status flags
|
||||||
/// General Configuration Registers
|
uint32_t ReadRegister(const MotorParams ¶ms, Registers reg);
|
||||||
GCONF = 0x00,
|
|
||||||
GSTAT = 0x01,
|
|
||||||
IOIN = 0x04,
|
|
||||||
|
|
||||||
/// Velocity Dependent Driver Feature Control Register Set
|
/// Writes a driver register and updates the status flags
|
||||||
IHOLD_IRUN = 0x10,
|
void WriteRegister(const MotorParams ¶ms, Registers reg, uint32_t data);
|
||||||
TPOWERDOWN = 0x11,
|
|
||||||
TSTEP = 0x12,
|
|
||||||
TPWMTHRS = 0x13,
|
|
||||||
TCOOLTHRS = 0x14,
|
|
||||||
THIGH = 0x15,
|
|
||||||
|
|
||||||
/// Motor Driver Registers
|
private:
|
||||||
MSCNT = 0x6A,
|
void _spi_tx_rx(const MotorParams ¶ms, uint8_t (&pData)[5]);
|
||||||
CHOPCONF = 0x6C,
|
void _handle_spi_status(uint8_t status);
|
||||||
COOLCONF = 0x6D,
|
|
||||||
DRV_STATUS = 0x6F,
|
|
||||||
PWMCONF = 0x70,
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace tmc2130
|
} // namespace tmc2130
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ static constexpr AxisParams axisParams[NUM_AXIS] = {
|
||||||
// Pulley
|
// Pulley
|
||||||
{
|
{
|
||||||
.name = 'P',
|
.name = 'P',
|
||||||
.params = { .idx = Pulley, .dirOn = config::pulley.dirOn, .csPin = PULLEY_CS_PIN, .stepPin = PULLEY_STEP_PIN, .sgPin = PULLEY_SG_PIN, .uSteps = config::pulley.uSteps },
|
.params = { .spi = config::TmcSpiBus, .idx = Pulley, .dirOn = config::pulley.dirOn, .csPin = PULLEY_CS_PIN, .stepPin = PULLEY_STEP_PIN, .sgPin = PULLEY_SG_PIN, .uSteps = config::pulley.uSteps },
|
||||||
.currents = { .vSense = config::pulley.vSense, .iRun = config::pulley.iRun, .iHold = config::pulley.iHold },
|
.currents = { .vSense = config::pulley.vSense, .iRun = config::pulley.iRun, .iHold = config::pulley.iHold },
|
||||||
.mode = DefaultMotorMode(config::pulley),
|
.mode = DefaultMotorMode(config::pulley),
|
||||||
.jerk = unitToSteps<P_speed_t>(config::pulleyLimits.jerk),
|
.jerk = unitToSteps<P_speed_t>(config::pulleyLimits.jerk),
|
||||||
|
|
@ -51,7 +51,7 @@ static constexpr AxisParams axisParams[NUM_AXIS] = {
|
||||||
// Selector
|
// Selector
|
||||||
{
|
{
|
||||||
.name = 'S',
|
.name = 'S',
|
||||||
.params = { .idx = Selector, .dirOn = config::selector.dirOn, .csPin = SELECTOR_CS_PIN, .stepPin = SELECTOR_STEP_PIN, .sgPin = SELECTOR_SG_PIN, .uSteps = config::selector.uSteps },
|
.params = { .spi = config::TmcSpiBus, .idx = Selector, .dirOn = config::selector.dirOn, .csPin = SELECTOR_CS_PIN, .stepPin = SELECTOR_STEP_PIN, .sgPin = SELECTOR_SG_PIN, .uSteps = config::selector.uSteps },
|
||||||
.currents = { .vSense = config::selector.vSense, .iRun = config::selector.iRun, .iHold = config::selector.iHold },
|
.currents = { .vSense = config::selector.vSense, .iRun = config::selector.iRun, .iHold = config::selector.iHold },
|
||||||
.mode = DefaultMotorMode(config::selector),
|
.mode = DefaultMotorMode(config::selector),
|
||||||
.jerk = unitToSteps<S_speed_t>(config::selectorLimits.jerk),
|
.jerk = unitToSteps<S_speed_t>(config::selectorLimits.jerk),
|
||||||
|
|
@ -60,7 +60,7 @@ static constexpr AxisParams axisParams[NUM_AXIS] = {
|
||||||
// Idler
|
// Idler
|
||||||
{
|
{
|
||||||
.name = 'I',
|
.name = 'I',
|
||||||
.params = { .idx = Idler, .dirOn = config::idler.dirOn, .csPin = IDLER_CS_PIN, .stepPin = IDLER_STEP_PIN, .sgPin = IDLER_SG_PIN, .uSteps = config::idler.uSteps },
|
.params = { .spi = config::TmcSpiBus, .idx = Idler, .dirOn = config::idler.dirOn, .csPin = IDLER_CS_PIN, .stepPin = IDLER_STEP_PIN, .sgPin = IDLER_SG_PIN, .uSteps = config::idler.uSteps },
|
||||||
.currents = { .vSense = config::idler.vSense, .iRun = config::idler.iRun, .iHold = config::idler.iHold },
|
.currents = { .vSense = config::idler.vSense, .iRun = config::idler.iRun, .iHold = config::idler.iHold },
|
||||||
.mode = DefaultMotorMode(config::idler),
|
.mode = DefaultMotorMode(config::idler),
|
||||||
.jerk = unitToSteps<I_speed_t>(config::idlerLimits.jerk),
|
.jerk = unitToSteps<I_speed_t>(config::idlerLimits.jerk),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue