25#include "driver/gpio.h"
26#include "driver/ledc.h"
27#include "driver/spi_master.h"
28#include "driver/uart.h"
30#include "esp_rom_sys.h"
31#include "freertos/FreeRTOS.h"
32#include "freertos/semphr.h"
33#include "freertos/task.h"
40static const char*
BUS_TAG =
"TMC51x0_Bus";
81 Esp32SpiPinConfig(
int mosi,
int miso,
int sclk,
int cs,
int en,
int dir = -1,
int step = -1) noexcept
151 uint32_t clock_speed_hz = 4000000,
155 host_(host),
mosi_pin_(static_cast<gpio_num_t>(pin_config.spi_mosi)),
156 miso_pin_(static_cast<gpio_num_t>(pin_config.spi_miso)),
157 sclk_pin_(static_cast<gpio_num_t>(pin_config.spi_sclk)),
158 cs_pin_(static_cast<gpio_num_t>(pin_config.spi_cs)),
159 en_pin_(static_cast<gpio_num_t>(pin_config.tmc51x0_pins.en_pin)),
160 dir_pin_(static_cast<gpio_num_t>(pin_config.tmc51x0_pins.dir_pin != -1
161 ? pin_config.tmc51x0_pins.dir_pin
162 : pin_config.tmc51x0_pins.ref_right_pin)),
163 step_pin_(static_cast<gpio_num_t>(pin_config.tmc51x0_pins.step_pin != -1
164 ? pin_config.tmc51x0_pins.step_pin
165 : pin_config.tmc51x0_pins.ref_left_pin)),
168 constexpr gpio_num_t UNMAPPED_PIN =
static_cast<gpio_num_t
>(-1);
254 Esp32SPI(spi_host_device_t host, gpio_num_t mosi_pin, gpio_num_t miso_pin, gpio_num_t sclk_pin, gpio_num_t cs_pin,
260 en_pin_(static_cast<gpio_num_t>(pin_config.en_pin)),
261 dir_pin_(static_cast<gpio_num_t>(pin_config.dir_pin != -1 ? pin_config.dir_pin : pin_config.ref_right_pin)),
262 step_pin_(static_cast<gpio_num_t>(pin_config.step_pin != -1 ? pin_config.step_pin : pin_config.ref_left_pin)),
265 constexpr gpio_num_t UNMAPPED_PIN =
static_cast<gpio_num_t
>(-1);
293 Esp32SPI(spi_host_device_t host, gpio_num_t mosi_pin, gpio_num_t miso_pin, gpio_num_t sclk_pin, gpio_num_t cs_pin,
294 gpio_num_t en_pin, gpio_num_t dir_pin =
static_cast<gpio_num_t
>(-1),
295 gpio_num_t step_pin =
static_cast<gpio_num_t
>(-1), uint32_t clock_speed_hz = 4000000,
303 constexpr gpio_num_t UNMAPPED_PIN =
static_cast<gpio_num_t
>(-1);
310 if (dir_pin != UNMAPPED_PIN) {
314 if (step_pin != UNMAPPED_PIN) {
342 constexpr gpio_num_t UNMAPPED_PIN =
static_cast<gpio_num_t
>(-1);
345 if (pin_config.
en_pin != -1) {
350 gpio_num_t dir_gpio = UNMAPPED_PIN;
351 if (pin_config.
dir_pin != -1) {
352 dir_gpio =
static_cast<gpio_num_t
>(pin_config.
dir_pin);
354 dir_gpio =
static_cast<gpio_num_t
>(pin_config.
ref_right_pin);
356 if (dir_gpio != UNMAPPED_PIN) {
362 gpio_num_t step_gpio = UNMAPPED_PIN;
364 step_gpio =
static_cast<gpio_num_t
>(pin_config.
step_pin);
366 step_gpio =
static_cast<gpio_num_t
>(pin_config.
ref_left_pin);
368 if (step_gpio != UNMAPPED_PIN) {
382 gpio_num_t enca_gpio = UNMAPPED_PIN;
384 enca_gpio =
static_cast<gpio_num_t
>(pin_config.
enc_a_pin);
386 enca_gpio =
static_cast<gpio_num_t
>(pin_config.
dc_in_pin);
388 if (enca_gpio != UNMAPPED_PIN) {
394 gpio_num_t encb_gpio = UNMAPPED_PIN;
396 encb_gpio =
static_cast<gpio_num_t
>(pin_config.
enc_b_pin);
398 encb_gpio =
static_cast<gpio_num_t
>(pin_config.
dc_en_pin);
400 if (encb_gpio != UNMAPPED_PIN) {
406 gpio_num_t encn_gpio = UNMAPPED_PIN;
408 encn_gpio =
static_cast<gpio_num_t
>(pin_config.
enc_n_pin);
410 encn_gpio =
static_cast<gpio_num_t
>(pin_config.
dc_out_pin);
412 if (encn_gpio != UNMAPPED_PIN) {
418 if (pin_config.
clk_pin != -1) {
450 size_t index =
static_cast<size_t>(pin);
456 constexpr gpio_num_t UNMAPPED_PIN =
static_cast<gpio_num_t
>(-1);
458 if (gpio_pin != UNMAPPED_PIN) {
461 gpio_set_direction(gpio_pin, GPIO_MODE_INPUT);
462 gpio_set_pull_mode(gpio_pin, GPIO_PULLUP_ONLY);
467 gpio_set_direction(gpio_pin, GPIO_MODE_INPUT);
468 gpio_set_pull_mode(gpio_pin, GPIO_PULLUP_ONLY);
472 gpio_set_direction(gpio_pin, GPIO_MODE_OUTPUT);
474 gpio_set_direction(gpio_pin, GPIO_MODE_INPUT);
475 gpio_set_pull_mode(gpio_pin, GPIO_PULLUP_ONLY);
479 gpio_set_direction(gpio_pin, GPIO_MODE_INPUT);
480 gpio_set_pull_mode(gpio_pin, GPIO_PULLUP_ONLY);
486 gpio_set_direction(gpio_pin, GPIO_MODE_INPUT);
492 gpio_set_direction(gpio_pin, GPIO_MODE_INPUT);
493 gpio_set_pull_mode(gpio_pin, GPIO_PULLUP_ONLY);
497 gpio_set_direction(gpio_pin, GPIO_MODE_OUTPUT);
509 size_t index =
static_cast<size_t>(pin);
510 constexpr gpio_num_t UNMAPPED_PIN =
static_cast<gpio_num_t
>(-1);
529 ESP_LOGE(
BUS_TAG,
"Failed to create SPI mutex");
535 constexpr gpio_num_t UNMAPPED_PIN =
static_cast<gpio_num_t
>(-1);
537 gpio_set_direction(
en_pin_, GPIO_MODE_OUTPUT);
540 if (!en_result.IsOk()) {
541 ESP_LOGW(
BUS_TAG,
"Failed to set EN pin during initialization (non-critical)");
546 gpio_set_direction(
dir_pin_, GPIO_MODE_OUTPUT);
549 if (!dir_result.IsOk()) {
550 ESP_LOGW(
BUS_TAG,
"Failed to set DIR pin during initialization (non-critical)");
555 gpio_set_direction(
step_pin_, GPIO_MODE_OUTPUT);
558 if (!step_result.IsOk()) {
559 ESP_LOGW(
BUS_TAG,
"Failed to set STEP pin during initialization (non-critical)");
565 spi_bus_config_t bus_config = {};
569 bus_config.quadwp_io_num = -1;
570 bus_config.quadhd_io_num = -1;
573 const int max_transfer_sz_bytes =
575 bus_config.max_transfer_sz = max_transfer_sz_bytes;
576 bus_config.flags = SPICOMMON_BUSFLAG_MASTER;
578 esp_err_t ret = spi_bus_initialize(
host_, &bus_config, SPI_DMA_CH_AUTO);
580 ESP_LOGE(
BUS_TAG,
"Failed to initialize SPI bus: %s", esp_err_to_name(ret));
585 spi_device_interface_config_t dev_config = {};
588 dev_config.spics_io_num =
cs_pin_;
589 dev_config.queue_size = 1;
590 dev_config.cs_ena_pretrans = 2;
591 dev_config.cs_ena_posttrans = 2;
595 ESP_LOGE(
BUS_TAG,
"Failed to add SPI device: %s", esp_err_to_name(ret));
601 ESP_LOGI(
BUS_TAG,
"SPI interface initialized successfully");
625 return result.IsOk();
640 ESP_LOGE(
BUS_TAG,
"Failed to remove SPI device: %s", esp_err_to_name(ret));
646 esp_err_t ret = spi_bus_free(
host_);
648 ESP_LOGE(
BUS_TAG,
"Failed to free SPI bus: %s", esp_err_to_name(ret));
653 ESP_LOGI(
BUS_TAG,
"SPI interface deinitialized");
681 ESP_LOGE(
BUS_TAG,
"SPI interface not initialized");
689 spi_transaction_t trans = {};
690 trans.length = length * 8;
691 trans.tx_buffer = tx;
692 trans.rx_buffer = rx;
700 ESP_LOGE(
BUS_TAG,
"SPI transfer failed: %s", esp_err_to_name(ret));
724 ESP_LOGW(
BUS_TAG,
"Pin is read-only (output from TMC51x0)");
730 ESP_LOGW(
BUS_TAG,
"Encoder pins are read-only (use DCEN/DCIN for DC Step mode)");
735 constexpr gpio_num_t UNMAPPED_PIN =
static_cast<gpio_num_t
>(-1);
736 if (gpio_pin == UNMAPPED_PIN) {
737 ESP_LOGW(
BUS_TAG,
"Pin not mapped: %d",
static_cast<int>(pin));
744 gpio_set_direction(gpio_pin, GPIO_MODE_OUTPUT);
748 gpio_set_level(gpio_pin, level ? 1 : 0);
764 constexpr gpio_num_t UNMAPPED_PIN =
static_cast<gpio_num_t
>(-1);
765 if (gpio_pin == UNMAPPED_PIN) {
766 ESP_LOGW(
BUS_TAG,
"Pin not mapped: %d",
static_cast<int>(pin));
770 int level = gpio_get_level(gpio_pin);
778 void DebugLog(
int level,
const char* tag,
const char* format, va_list args)
noexcept {
779 esp_log_level_t esp_level;
782 esp_level = ESP_LOG_ERROR;
785 esp_level = ESP_LOG_WARN;
788 esp_level = ESP_LOG_INFO;
791 esp_level = ESP_LOG_DEBUG;
794 esp_level = ESP_LOG_VERBOSE;
807 va_copy(args_copy, args);
808 vsnprintf(msg,
sizeof(msg), format, args_copy);
812 size_t len = strlen(msg);
813 while (len > 0 && (msg[len - 1] ==
'\n' || msg[len - 1] ==
'\r')) {
818 ESP_LOG_LEVEL(esp_level, tag,
"%s", msg);
825 vTaskDelay(pdMS_TO_TICKS(ms));
832 esp_rom_delay_us(us);
857 constexpr gpio_num_t UNMAPPED_PIN =
static_cast<gpio_num_t
>(-1);
859 if (clk_pin == UNMAPPED_PIN) {
861 if (frequency_hz == 0) {
864 ESP_LOGW(
BUS_TAG,
"CLK pin not mapped; external clock request unsupported");
868 if (frequency_hz == 0) {
870 gpio_set_direction(clk_pin, GPIO_MODE_OUTPUT);
871 gpio_set_level(clk_pin, 0);
872 ESP_LOGI(
BUS_TAG,
"CLK pin set to GND (internal 12 MHz oscillator enabled)");
877 ESP_LOGW(
BUS_TAG,
"External clock generation not implemented. Provide external clock signal on CLK pin (frequency: %u Hz)", frequency_hz);
961 uint32_t baud_rate = 115200,
966 tx_pin_(static_cast<gpio_num_t>(pin_config.uart_tx)),
967 rx_pin_(static_cast<gpio_num_t>(pin_config.uart_rx)),
968 en_pin_(static_cast<gpio_num_t>(pin_config.tmc51x0_pins.en_pin)),
971 constexpr gpio_num_t UNMAPPED =
static_cast<gpio_num_t
>(-1);
983 constexpr gpio_num_t UNMAPPED =
static_cast<gpio_num_t
>(-1);
986 gpio_num_t dir_gpio = UNMAPPED;
987 if (pc.dir_pin != -1) dir_gpio =
static_cast<gpio_num_t
>(pc.dir_pin);
988 else if (pc.ref_right_pin != -1) dir_gpio =
static_cast<gpio_num_t
>(pc.ref_right_pin);
989 if (dir_gpio != UNMAPPED) {
994 gpio_num_t step_gpio = UNMAPPED;
995 if (pc.step_pin != -1) step_gpio =
static_cast<gpio_num_t
>(pc.step_pin);
996 else if (pc.ref_left_pin != -1) step_gpio =
static_cast<gpio_num_t
>(pc.ref_left_pin);
997 if (step_gpio != UNMAPPED) {
1009 size_t idx =
static_cast<size_t>(pin);
1013 constexpr gpio_num_t UNMAPPED =
static_cast<gpio_num_t
>(-1);
1014 if (gpio_pin != UNMAPPED) {
1016 gpio_set_direction(gpio_pin, GPIO_MODE_INPUT);
1017 gpio_set_pull_mode(gpio_pin, GPIO_PULLUP_ONLY);
1019 gpio_set_direction(gpio_pin, GPIO_MODE_INPUT);
1020 gpio_set_pull_mode(gpio_pin, GPIO_PULLUP_ONLY);
1023 gpio_set_direction(gpio_pin, GPIO_MODE_OUTPUT);
1030 size_t idx =
static_cast<size_t>(pin);
1031 constexpr gpio_num_t UNMAPPED =
static_cast<gpio_num_t
>(-1);
1042 constexpr gpio_num_t UNMAPPED =
static_cast<gpio_num_t
>(-1);
1044 gpio_set_direction(
en_pin_, GPIO_MODE_OUTPUT);
1049 uart_config_t uart_config = {};
1050 uart_config.baud_rate =
static_cast<int>(
baud_rate_);
1051 uart_config.data_bits = UART_DATA_8_BITS;
1052 uart_config.parity = UART_PARITY_DISABLE;
1053 uart_config.stop_bits = UART_STOP_BITS_1;
1054 uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
1055 uart_config.source_clk = UART_SCLK_DEFAULT;
1057 esp_err_t ret = uart_param_config(
uart_num_, &uart_config);
1058 if (ret != ESP_OK) {
1059 ESP_LOGE(
BUS_TAG,
"UART param config failed: %s", esp_err_to_name(ret));
1064 if (ret != ESP_OK) {
1065 ESP_LOGE(
BUS_TAG,
"UART set pin failed: %s", esp_err_to_name(ret));
1069 constexpr int kRxBufSize = 256;
1070 constexpr int kTxBufSize = 0;
1071 ret = uart_driver_install(
uart_num_, kRxBufSize, kTxBufSize, 0,
nullptr, 0);
1072 if (ret != ESP_OK) {
1073 ESP_LOGE(
BUS_TAG,
"UART driver install failed: %s", esp_err_to_name(ret));
1081 ESP_LOGI(
BUS_TAG,
"UART interface initialized (port %d, baud %u, TX=%d, RX=%d)",
1101 int written = uart_write_bytes(
uart_num_, data, length);
1102 if (written < 0 ||
static_cast<size_t>(written) != length) {
1103 ESP_LOGE(
BUS_TAG,
"UART send failed: wrote %d/%zu bytes", written, length);
1107 esp_err_t ret = uart_wait_tx_done(
uart_num_, pdMS_TO_TICKS(50));
1108 if (ret != ESP_OK) {
1109 ESP_LOGW(
BUS_TAG,
"UART TX drain timeout");
1114 vTaskDelay(pdMS_TO_TICKS(2));
1126 constexpr TickType_t kTimeoutTicks = pdMS_TO_TICKS(100);
1128 int received = uart_read_bytes(
uart_num_, data, length, kTimeoutTicks);
1129 if (received < 0 ||
static_cast<size_t>(received) != length) {
1130 ESP_LOGE(
BUS_TAG,
"UART receive failed: got %d/%zu bytes", received, length);
1158 constexpr gpio_num_t UNMAPPED =
static_cast<gpio_num_t
>(-1);
1164 gpio_set_level(gpio, level ? 1 : 0);
1170 constexpr gpio_num_t UNMAPPED =
static_cast<gpio_num_t
>(-1);
1173 int level = gpio_get_level(gpio);
1181 void DebugLog(
int level,
const char* tag,
const char* format, va_list args)
noexcept {
1182 esp_log_level_t esp_level;
1184 case 0: esp_level = ESP_LOG_ERROR;
break;
1185 case 1: esp_level = ESP_LOG_WARN;
break;
1186 case 2: esp_level = ESP_LOG_INFO;
break;
1187 case 3: esp_level = ESP_LOG_DEBUG;
break;
1188 default: esp_level = ESP_LOG_VERBOSE;
break;
1192 va_copy(args_copy, args);
1193 vsnprintf(msg,
sizeof(msg), format, args_copy);
1195 size_t len = strlen(msg);
1196 while (len > 0 && (msg[len - 1] ==
'\n' || msg[len - 1] ==
'\r')) { msg[--len] =
'\0'; }
1197 ESP_LOG_LEVEL(esp_level, tag,
"%s", msg);
1200 void DelayMs(uint32_t ms)
noexcept { vTaskDelay(pdMS_TO_TICKS(ms)); }
1201 void DelayUs(uint32_t us)
noexcept { esp_rom_delay_us(us); }
ESP32 SPI implementation of TMC51x0 communication interface.
Definition esp32_tmc51x0_bus.hpp:120
bool initialized_
Definition esp32_tmc51x0_bus.hpp:894
Esp32SPI(spi_host_device_t host, gpio_num_t mosi_pin, gpio_num_t miso_pin, gpio_num_t sclk_pin, gpio_num_t cs_pin, const tmc51x0::TMC51x0PinConfig &pin_config, uint32_t clock_speed_hz=4000000, const tmc51x0::PinActiveLevels &active_levels=tmc51x0::PinActiveLevels{}) noexcept
Construct ESP32 SPI communication interface with separate SPI pins and TMC51x0 pin config.
Definition esp32_tmc51x0_bus.hpp:254
void DebugLog(int level, const char *tag, const char *format, va_list args) noexcept
Debug logging.
Definition esp32_tmc51x0_bus.hpp:778
gpio_num_t pin_mapping_[16]
Pin mapping array: maps TMC51x0CtrlPin enum to ESP32 GPIO numbers.
Definition esp32_tmc51x0_bus.hpp:902
Esp32SPI(spi_host_device_t host, gpio_num_t mosi_pin, gpio_num_t miso_pin, gpio_num_t sclk_pin, gpio_num_t cs_pin, gpio_num_t en_pin, gpio_num_t dir_pin=static_cast< gpio_num_t >(-1), gpio_num_t step_pin=static_cast< gpio_num_t >(-1), uint32_t clock_speed_hz=4000000, const tmc51x0::PinActiveLevels &active_levels=tmc51x0::PinActiveLevels{}) noexcept
Construct ESP32 SPI communication interface (legacy constructor for backward compatibility)
Definition esp32_tmc51x0_bus.hpp:293
spi_host_device_t host_
Definition esp32_tmc51x0_bus.hpp:883
tmc51x0::GpioSignal GpioLevelToSignal(tmc51x0::TMC51x0CtrlPin pin, bool gpio_level) const noexcept
Convert physical GPIO level to signal state.
Definition esp32_tmc51x0_bus.hpp:204
const tmc51x0::PinActiveLevels & GetActiveLevels() const noexcept
Get current active level configuration.
Definition esp32_tmc51x0_bus.hpp:232
tmc51x0::Result< void > SpiTransfer(const uint8_t *tx, uint8_t *rx, size_t length) noexcept
Perform SPI transfer.
Definition esp32_tmc51x0_bus.hpp:678
tmc51x0::Result< void > GpioSet(tmc51x0::TMC51x0CtrlPin pin, tmc51x0::GpioSignal signal) noexcept
Set GPIO pin state.
Definition esp32_tmc51x0_bus.hpp:720
tmc51x0::Result< void > SetClkFreq(uint32_t frequency_hz) noexcept
Set external clock frequency on CLK pin.
Definition esp32_tmc51x0_bus.hpp:855
void ConfigureActiveLevels(const tmc51x0::PinActiveLevels &active_levels) noexcept
Configure pin active levels from PinActiveLevels struct.
Definition esp32_tmc51x0_bus.hpp:224
tmc51x0::PinActiveLevels active_levels_
Pin active level configuration storage.
Definition esp32_tmc51x0_bus.hpp:185
uint32_t clock_speed_hz_
Definition esp32_tmc51x0_bus.hpp:891
gpio_num_t mosi_pin_
Definition esp32_tmc51x0_bus.hpp:884
gpio_num_t sclk_pin_
Definition esp32_tmc51x0_bus.hpp:886
gpio_num_t en_pin_
Definition esp32_tmc51x0_bus.hpp:888
SemaphoreHandle_t spi_mutex_
Definition esp32_tmc51x0_bus.hpp:893
void DelayUs(uint32_t us) noexcept
Delay microseconds.
Definition esp32_tmc51x0_bus.hpp:831
gpio_num_t GetPinMapping(tmc51x0::TMC51x0CtrlPin pin) const noexcept
Get pin mapping for a TMC51x0 control pin.
Definition esp32_tmc51x0_bus.hpp:508
bool SignalToGpioLevel(tmc51x0::TMC51x0CtrlPin pin, tmc51x0::GpioSignal signal) const noexcept
Convert signal state to physical GPIO level.
Definition esp32_tmc51x0_bus.hpp:193
tmc51x0::Result< void > Initialize() noexcept
Initialize the SPI interface.
Definition esp32_tmc51x0_bus.hpp:521
gpio_num_t dir_pin_
Definition esp32_tmc51x0_bus.hpp:889
bool ApplyPinConfig(const tmc51x0::TMC51x0PinConfig &pin_config) noexcept
Apply pin configuration structure (handles compound pins automatically)
Definition esp32_tmc51x0_bus.hpp:341
~Esp32SPI() noexcept
Destructor - cleans up SPI resources.
Definition esp32_tmc51x0_bus.hpp:323
bool EnsureInitialized() noexcept
Ensure SPI interface is initialized, initializing if necessary.
Definition esp32_tmc51x0_bus.hpp:620
Esp32SPI(spi_host_device_t host, const Esp32SpiPinConfig &pin_config, uint32_t clock_speed_hz=4000000, const tmc51x0::PinActiveLevels &active_levels=tmc51x0::PinActiveLevels{}) noexcept
Construct ESP32 SPI communication interface with complete pin configuration.
Definition esp32_tmc51x0_bus.hpp:150
void DelayMs(uint32_t ms) noexcept
Delay milliseconds.
Definition esp32_tmc51x0_bus.hpp:824
gpio_num_t cs_pin_
Definition esp32_tmc51x0_bus.hpp:887
tmc51x0::Result< void > Deinitialize() noexcept
Deinitialize the SPI interface.
Definition esp32_tmc51x0_bus.hpp:632
gpio_num_t step_pin_
Definition esp32_tmc51x0_bus.hpp:890
bool configureGpioPins() noexcept
Definition esp32_tmc51x0_bus.hpp:904
bool SetPinMapping(tmc51x0::TMC51x0CtrlPin pin, gpio_num_t gpio_pin) noexcept
Set pin mapping for a TMC51x0 control pin.
Definition esp32_tmc51x0_bus.hpp:449
tmc51x0::CommMode GetMode() const noexcept
Get communication mode (always SPI for this interface)
Definition esp32_tmc51x0_bus.hpp:609
spi_device_handle_t device_handle_
Definition esp32_tmc51x0_bus.hpp:892
gpio_num_t miso_pin_
Definition esp32_tmc51x0_bus.hpp:885
tmc51x0::Result< tmc51x0::GpioSignal > GpioRead(tmc51x0::TMC51x0CtrlPin pin) noexcept
Read GPIO pin state.
Definition esp32_tmc51x0_bus.hpp:762
ESP32 UART implementation of TMC51x0 communication interface.
Definition esp32_tmc51x0_bus.hpp:951
bool initialized_
Definition esp32_tmc51x0_bus.hpp:1210
tmc51x0::Result< void > GpioSet(tmc51x0::TMC51x0CtrlPin pin, tmc51x0::GpioSignal signal) noexcept
Definition esp32_tmc51x0_bus.hpp:1153
gpio_num_t rx_pin_
Definition esp32_tmc51x0_bus.hpp:1207
tmc51x0::Result< tmc51x0::GpioSignal > GpioRead(tmc51x0::TMC51x0CtrlPin pin) noexcept
Definition esp32_tmc51x0_bus.hpp:1168
tmc51x0::Result< void > UartReceive(uint8_t *data, size_t length) noexcept
Definition esp32_tmc51x0_bus.hpp:1120
tmc51x0::PinActiveLevels active_levels_
Definition esp32_tmc51x0_bus.hpp:1204
gpio_num_t GetPinMapping(tmc51x0::TMC51x0CtrlPin pin) const noexcept
Definition esp32_tmc51x0_bus.hpp:1029
bool ApplyPinConfig(const tmc51x0::TMC51x0PinConfig &pc) noexcept
Definition esp32_tmc51x0_bus.hpp:982
void DebugLog(int level, const char *tag, const char *format, va_list args) noexcept
Definition esp32_tmc51x0_bus.hpp:1181
gpio_num_t en_pin_
Definition esp32_tmc51x0_bus.hpp:1208
tmc51x0::Result< void > Deinitialize() noexcept
Definition esp32_tmc51x0_bus.hpp:1086
gpio_num_t tx_pin_
Definition esp32_tmc51x0_bus.hpp:1206
~Esp32UART() noexcept
Definition esp32_tmc51x0_bus.hpp:978
tmc51x0::Result< bool > GetNaoPin() noexcept
Definition esp32_tmc51x0_bus.hpp:1144
tmc51x0::Result< void > Initialize() noexcept
Definition esp32_tmc51x0_bus.hpp:1038
bool SetPinMapping(tmc51x0::TMC51x0CtrlPin pin, gpio_num_t gpio_pin) noexcept
Definition esp32_tmc51x0_bus.hpp:1008
tmc51x0::Result< void > UartSend(const uint8_t *data, size_t length) noexcept
Definition esp32_tmc51x0_bus.hpp:1095
tmc51x0::Result< void > SetNaiPin(bool active) noexcept
Definition esp32_tmc51x0_bus.hpp:1138
tmc51x0::CommMode GetMode() const noexcept
Definition esp32_tmc51x0_bus.hpp:1151
void DelayMs(uint32_t ms) noexcept
Definition esp32_tmc51x0_bus.hpp:1200
gpio_num_t pin_mapping_[16]
Definition esp32_tmc51x0_bus.hpp:1211
uart_port_t uart_num_
Definition esp32_tmc51x0_bus.hpp:1205
uint32_t baud_rate_
Definition esp32_tmc51x0_bus.hpp:1209
void DelayUs(uint32_t us) noexcept
Definition esp32_tmc51x0_bus.hpp:1201
Esp32UART(uart_port_t uart_num, const Esp32UartPinConfig &pin_config, uint32_t baud_rate=115200, const tmc51x0::PinActiveLevels &active_levels=tmc51x0::PinActiveLevels{}) noexcept
Construct ESP32 UART communication interface.
Definition esp32_tmc51x0_bus.hpp:960
Result type for operations that return a value.
Definition tmc51x0_result.hpp:90
CRTP-based SPI implementation of TMC5160CommInterface.
Definition tmc51x0_comm_interface.hpp:1660
SpiCommInterface() noexcept
Construct SPI communication interface.
Definition tmc51x0_comm_interface.hpp:1689
CRTP-based UART implementation of TMC5160CommInterface.
Definition tmc51x0_comm_interface.hpp:2935
UartCommInterface() noexcept
Construct UART communication interface with pin active level configuration.
Definition tmc51x0_comm_interface.hpp:2951
static const char * BUS_TAG
Definition esp32_tmc51x0_bus.hpp:40
GpioSignal
GPIO signal states with board-agnostic naming.
Definition tmc51x0_comm_interface.hpp:319
@ ACTIVE
Active signal state (logical high)
@ INACTIVE
Inactive signal state (logical low)
@ NOT_INITIALIZED
Driver not initialized.
@ UNSUPPORTED
Feature not supported by this chip variant.
@ COMM_ERROR
Communication interface error (SPI/UART)
@ INVALID_VALUE
Invalid parameter value.
TMC51x0CtrlPin
TMC51x0 control pin identifiers with board-agnostic naming.
Definition tmc51x0_comm_interface.hpp:258
@ EN
Enable pin (DRV_ENN, pin 28) - Active HIGH disables power stage.
CommMode
Supported physical communication modes for TMC51x0.
Definition tmc51x0_comm_interface.hpp:221
Complete ESP32 SPI bus and TMC51x0 pin configuration structure.
Definition esp32_tmc51x0_bus.hpp:56
Esp32SpiPinConfig()=default
Default constructor - all pins unmapped (-1)
int spi_cs
SPI chip select pin (CS)
Definition esp32_tmc51x0_bus.hpp:61
int spi_mosi
SPI MOSI pin (Master Out, Slave In)
Definition esp32_tmc51x0_bus.hpp:58
Esp32SpiPinConfig(int mosi, int miso, int sclk, int cs, int en, int dir=-1, int step=-1) noexcept
Constructor with SPI pins and basic TMC51x0 pins.
Definition esp32_tmc51x0_bus.hpp:81
int spi_sclk
SPI clock pin (SCLK)
Definition esp32_tmc51x0_bus.hpp:60
int spi_miso
SPI MISO pin (Master In, Slave Out)
Definition esp32_tmc51x0_bus.hpp:59
tmc51x0::TMC51x0PinConfig tmc51x0_pins
TMC51x0 control pin configuration.
Definition esp32_tmc51x0_bus.hpp:64
Esp32SpiPinConfig(int mosi, int miso, int sclk, int cs, const tmc51x0::TMC51x0PinConfig &tmc_pins) noexcept
Constructor with SPI pins and full TMC5160 pin config.
Definition esp32_tmc51x0_bus.hpp:92
ESP32 UART pin configuration structure.
Definition esp32_tmc51x0_bus.hpp:919
tmc51x0::TMC51x0PinConfig tmc51x0_pins
TMC51x0 control pins (EN, DIAG0, DIAG1, etc.)
Definition esp32_tmc51x0_bus.hpp:924
Esp32UartPinConfig(int tx, int rx, const tmc51x0::TMC51x0PinConfig &tmc_pins) noexcept
Definition esp32_tmc51x0_bus.hpp:931
Esp32UartPinConfig()=default
int uart_rx
UART RX pin (ESP32 RX <- TMC5160 SWP/SWIOP)
Definition esp32_tmc51x0_bus.hpp:921
Esp32UartPinConfig(int tx, int rx, int en, int dir=-1, int step=-1) noexcept
Definition esp32_tmc51x0_bus.hpp:928
int uart_tx
UART TX pin (ESP32 TX -> TMC5160 SWN/SWPN)
Definition esp32_tmc51x0_bus.hpp:920
Pin active level configuration structure.
Definition tmc51x0_comm_interface.hpp:352
bool GetActiveLevel(TMC51x0CtrlPin pin) const noexcept
Get active level for a specific pin.
Definition tmc51x0_comm_interface.hpp:398
void SetActiveLevel(TMC51x0CtrlPin pin, bool active_level) noexcept
Set active level for a specific pin.
Definition tmc51x0_comm_interface.hpp:442
TMC51x0 GPIO pin configuration structure.
Definition tmc51x0_comm_interface.hpp:521
int dc_out_pin
DC Step ready output (ENCN_DCO_CFG6, pin 25) - Same as enc_n_pin.
Definition tmc51x0_comm_interface.hpp:549
int clk_pin
Clock input (CLK, pin 12) - Optional.
Definition tmc51x0_comm_interface.hpp:553
int enc_b_pin
Encoder B (ENCB_DCEN_CFG4, pin 23) - Same as dc_en_pin.
Definition tmc51x0_comm_interface.hpp:541
int ref_left_pin
Left reference switch (REFL_STEP, pin 17) - Same as step_pin.
Definition tmc51x0_comm_interface.hpp:530
int diag1_pin
DIAG1 pin (DIAG1_SWP, pin 27) - Optional.
Definition tmc51x0_comm_interface.hpp:537
int dc_en_pin
Definition tmc51x0_comm_interface.hpp:547
int en_pin
EN pin (DRV_ENN, pin 28) - Required.
Definition tmc51x0_comm_interface.hpp:523
int enc_n_pin
Encoder N (ENCN_DCO_CFG6, pin 25) - Same as dc_out_pin.
Definition tmc51x0_comm_interface.hpp:542
int spi_mode_pin
Definition tmc51x0_comm_interface.hpp:560
int dc_in_pin
Definition tmc51x0_comm_interface.hpp:545
int sd_mode_pin
hardwired. HIGH=External step/dir, LOW=Internal ramp
Definition tmc51x0_comm_interface.hpp:562
int ref_right_pin
Right reference switch (REFR_DIR, pin 18) - Same as dir_pin.
Definition tmc51x0_comm_interface.hpp:532
int diag0_pin
DIAG0 pin (DIAG0_SWN, pin 26) - Optional.
Definition tmc51x0_comm_interface.hpp:536
int step_pin
STEP pin (REFL_STEP, pin 17) - Optional, same as ref_left_pin.
Definition tmc51x0_comm_interface.hpp:526
int dir_pin
DIR pin (REFR_DIR, pin 18) - Optional, same as ref_right_pin.
Definition tmc51x0_comm_interface.hpp:524
int enc_a_pin
Encoder A (ENCA_DCIN_CFG5, pin 24) - Same as dc_in_pin.
Definition tmc51x0_comm_interface.hpp:540
Communication interfaces for TMC51x0 stepper motor driver using SPI and UART.
#define TMC51X0_SPI_MAX_CHAIN_DEVICES
Definition tmc51x0_comm_interface.hpp:1672