20#include "driver/spi_master.h"
21#include "driver/uart.h"
22#include "driver/gpio.h"
23#include "freertos/FreeRTOS.h"
24#include "freertos/task.h"
25#include "esp_rom_sys.h"
32static const char*
BUS_TAG =
"TMC9660_Bus";
62 gpio_num_t drv_en_pin,
63 gpio_num_t faultn_pin,
65 uint32_t clock_speed_hz = 10000000,
66 uint8_t
mode = 0) noexcept
93 ESP_LOGE(
BUS_TAG,
"Failed to configure GPIO pins");
98 spi_bus_config_t bus_config = {};
102 bus_config.quadwp_io_num = -1;
103 bus_config.quadhd_io_num = -1;
104 bus_config.max_transfer_sz = 8;
105 bus_config.flags = SPICOMMON_BUSFLAG_MASTER;
107 esp_err_t ret = spi_bus_initialize(
host_, &bus_config, SPI_DMA_CH_AUTO);
109 ESP_LOGE(
BUS_TAG,
"Failed to initialize SPI bus: %s", esp_err_to_name(ret));
114 spi_device_interface_config_t dev_config = {};
116 dev_config.mode =
mode_;
117 dev_config.spics_io_num =
cs_pin_;
118 dev_config.queue_size = 7;
119 dev_config.command_bits = 0;
120 dev_config.address_bits = 0;
121 dev_config.dummy_bits = 0;
122 dev_config.duty_cycle_pos = 128;
123 dev_config.cs_ena_pretrans = 2;
124 dev_config.cs_ena_posttrans = 2;
125 dev_config.flags = 0;
126 dev_config.input_delay_ns = 0;
127 dev_config.pre_cb =
nullptr;
128 dev_config.post_cb =
nullptr;
132 ESP_LOGE(
BUS_TAG,
"Failed to add SPI device: %s", esp_err_to_name(ret));
138 ESP_LOGI(
BUS_TAG,
"SPI interface initialized successfully");
158 ESP_LOGI(
BUS_TAG,
"SPI interface deinitialized");
168 bool spiTransferTMCL(std::array<uint8_t, 8> &tx, std::array<uint8_t, 8> &rx)
noexcept {
170 ESP_LOGE(
BUS_TAG,
"SPI interface not initialized");
174 spi_transaction_t trans = {};
176 trans.tx_buffer = tx.data();
177 trans.rx_buffer = rx.data();
181 ESP_LOGE(
BUS_TAG,
"SPI transfer failed: %s", esp_err_to_name(ret));
190 ESP_LOGE(
BUS_TAG,
"SPI interface not initialized");
194 spi_transaction_t trans = {};
196 trans.tx_buffer = tx.data();
197 trans.rx_buffer = rx.data();
201 ESP_LOGE(
BUS_TAG,
"SPI 5-byte transfer failed: %s", esp_err_to_name(ret));
213 return CommMode::SPI;
224 if (gpio_pin == GPIO_NUM_NC) {
225 ESP_LOGE(
BUS_TAG,
"Invalid GPIO pin for TMC9660 control pin");
232 esp_err_t ret = gpio_set_level(gpio_pin, gpio_level);
234 ESP_LOGE(
BUS_TAG,
"Failed to set GPIO level: %s", esp_err_to_name(ret));
248 if (gpio_pin == GPIO_NUM_NC) {
249 ESP_LOGE(
BUS_TAG,
"Invalid GPIO pin for TMC9660 control pin");
253 int gpio_level = gpio_get_level(gpio_pin);
254 if (gpio_level < 0) {
255 ESP_LOGE(
BUS_TAG,
"Failed to read GPIO level");
270 void debugLog(
int level,
const char* tag,
const char* format, va_list args)
noexcept {
274 esp_log_writev(ESP_LOG_ERROR, tag, format, args);
277 esp_log_writev(ESP_LOG_WARN, tag, format, args);
280 esp_log_writev(ESP_LOG_INFO, tag, format, args);
283 esp_log_writev(ESP_LOG_DEBUG, tag, format, args);
286 esp_log_writev(ESP_LOG_VERBOSE, tag, format, args);
289 esp_log_writev(ESP_LOG_INFO, tag, format, args);
295 vTaskDelay(pdMS_TO_TICKS(ms));
303 vTaskDelay(pdMS_TO_TICKS((us + 999) / 1000));
306 esp_rom_delay_us(us);
317 gpio_config_t output_config = {};
318 output_config.intr_type = GPIO_INTR_DISABLE;
319 output_config.mode = GPIO_MODE_OUTPUT;
321 output_config.pull_down_en = GPIO_PULLDOWN_DISABLE;
322 output_config.pull_up_en = GPIO_PULLUP_DISABLE;
324 esp_err_t ret = gpio_config(&output_config);
326 ESP_LOGE(
BUS_TAG,
"Failed to configure output GPIO pins: %s", esp_err_to_name(ret));
331 gpio_config_t input_config = {};
332 input_config.intr_type = GPIO_INTR_DISABLE;
333 input_config.mode = GPIO_MODE_INPUT;
335 input_config.pull_down_en = GPIO_PULLDOWN_DISABLE;
336 input_config.pull_up_en = GPIO_PULLUP_ENABLE;
338 ret = gpio_config(&input_config);
340 ESP_LOGE(
BUS_TAG,
"Failed to configure input GPIO pin: %s", esp_err_to_name(ret));
359 case TMC9660CtrlPin::RST:
361 case TMC9660CtrlPin::DRV_EN:
363 case TMC9660CtrlPin::FAULTN:
365 case TMC9660CtrlPin::WAKE:
411 gpio_num_t drv_en_pin,
412 gpio_num_t faultn_pin,
414 uint32_t baud_rate = 115200,
415 uint8_t address = 0) noexcept
440 ESP_LOGE(
BUS_TAG,
"Failed to configure GPIO pins");
445 uart_config_t uart_config = {};
447 uart_config.data_bits = UART_DATA_8_BITS;
448 uart_config.parity = UART_PARITY_DISABLE;
449 uart_config.stop_bits = UART_STOP_BITS_1;
450 uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
451 uart_config.source_clk = UART_SCLK_DEFAULT;
453 esp_err_t ret = uart_driver_install(
uart_num_, 1024, 1024, 0,
nullptr, 0);
455 ESP_LOGE(
BUS_TAG,
"Failed to install UART driver: %s", esp_err_to_name(ret));
459 ret = uart_param_config(
uart_num_, &uart_config);
461 ESP_LOGE(
BUS_TAG,
"Failed to configure UART: %s", esp_err_to_name(ret));
468 ESP_LOGE(
BUS_TAG,
"Failed to set UART pins: %s", esp_err_to_name(ret));
474 ESP_LOGI(
BUS_TAG,
"UART interface initialized successfully");
489 ESP_LOGI(
BUS_TAG,
"UART interface deinitialized");
500 ESP_LOGE(
BUS_TAG,
"UART interface not initialized");
504 int bytes_written = uart_write_bytes(
uart_num_, data.data(), data.size());
505 if (bytes_written !=
static_cast<int>(data.size())) {
506 ESP_LOGE(
BUS_TAG,
"UART write failed: expected %zu, wrote %d", data.size(), bytes_written);
511 uart_wait_tx_done(
uart_num_, portMAX_DELAY);
522 ESP_LOGE(
BUS_TAG,
"UART interface not initialized");
526 int bytes_read = uart_read_bytes(
uart_num_, data.data(), data.size(), pdMS_TO_TICKS(10));
527 if (bytes_read !=
static_cast<int>(data.size())) {
528 ESP_LOGE(
BUS_TAG,
"UART read failed: expected %zu, read %d", data.size(), bytes_read);
550 ESP_LOGE(
BUS_TAG,
"UART interface not initialized");
562 std::array<uint8_t, 9> uart_frame;
563 tx.toUart(address, uart_frame);
566 int bytes_written = uart_write_bytes(
uart_num_, uart_frame.data(), uart_frame.size());
567 if (bytes_written !=
static_cast<int>(uart_frame.size())) {
568 ESP_LOGE(
BUS_TAG,
"UART write failed: expected %zu, wrote %d", uart_frame.size(), bytes_written);
573 logDebug(2,
"UART_TMCL",
"[UART TX] %02X %02X %02X %02X %02X %02X %02X %02X %02X",
574 uart_frame[0], uart_frame[1], uart_frame[2], uart_frame[3],
575 uart_frame[4], uart_frame[5], uart_frame[6], uart_frame[7], uart_frame[8]);
578 uart_wait_tx_done(
uart_num_, portMAX_DELAY);
581 std::array<uint8_t, 9> uart_reply;
582 int bytes_read = uart_read_bytes(
uart_num_, uart_reply.data(), uart_reply.size(), pdMS_TO_TICKS(10));
583 if (bytes_read !=
static_cast<int>(uart_reply.size())) {
584 ESP_LOGE(
BUS_TAG,
"UART read failed: expected %zu, read %d", uart_reply.size(), bytes_read);
586 if (bytes_read > 0) {
587 logDebug(2,
"UART_TMCL",
"[UART RX] (partial %d bytes) %02X %02X %02X %02X %02X %02X %02X %02X %02X",
589 bytes_read > 0 ? uart_reply[0] : 0, bytes_read > 1 ? uart_reply[1] : 0,
590 bytes_read > 2 ? uart_reply[2] : 0, bytes_read > 3 ? uart_reply[3] : 0,
591 bytes_read > 4 ? uart_reply[4] : 0, bytes_read > 5 ? uart_reply[5] : 0,
592 bytes_read > 6 ? uart_reply[6] : 0, bytes_read > 7 ? uart_reply[7] : 0,
593 bytes_read > 8 ? uart_reply[8] : 0);
599 logDebug(2,
"UART_TMCL",
"[UART RX] %02X %02X %02X %02X %02X %02X %02X %02X %02X",
600 uart_reply[0], uart_reply[1], uart_reply[2], uart_reply[3],
601 uart_reply[4], uart_reply[5], uart_reply[6], uart_reply[7], uart_reply[8]);
607 ESP_LOGE(
BUS_TAG,
"Failed to parse UART reply (checksum or address mismatch)");
622 ESP_LOGE(
BUS_TAG,
"UART interface not initialized");
630 int bytes_written = uart_write_bytes(
uart_num_, tx.data(), tx.size());
631 if (bytes_written !=
static_cast<int>(tx.size())) {
632 ESP_LOGE(
BUS_TAG,
"UART bootloader write failed: expected %zu, wrote %d", tx.size(), bytes_written);
637 uart_wait_tx_done(
uart_num_, portMAX_DELAY);
640 int bytes_read = uart_read_bytes(
uart_num_, rx.data(), rx.size(), pdMS_TO_TICKS(10));
641 if (bytes_read !=
static_cast<int>(rx.size())) {
642 ESP_LOGE(
BUS_TAG,
"UART bootloader read failed: expected %zu, read %d", rx.size(), bytes_read);
654 return CommMode::UART;
665 if (gpio_pin == GPIO_NUM_NC) {
666 ESP_LOGE(
BUS_TAG,
"Invalid GPIO pin for TMC9660 control pin");
673 esp_err_t ret = gpio_set_level(gpio_pin, gpio_level);
675 ESP_LOGE(
BUS_TAG,
"Failed to set GPIO level: %s", esp_err_to_name(ret));
689 if (gpio_pin == GPIO_NUM_NC) {
690 ESP_LOGE(
BUS_TAG,
"Invalid GPIO pin for TMC9660 control pin");
694 int gpio_level = gpio_get_level(gpio_pin);
695 if (gpio_level < 0) {
696 ESP_LOGE(
BUS_TAG,
"Failed to read GPIO level");
711 void debugLog(
int level,
const char* tag,
const char* format, va_list args)
noexcept {
715 esp_log_writev(ESP_LOG_ERROR, tag, format, args);
718 esp_log_writev(ESP_LOG_WARN, tag, format, args);
721 esp_log_writev(ESP_LOG_INFO, tag, format, args);
724 esp_log_writev(ESP_LOG_DEBUG, tag, format, args);
727 esp_log_writev(ESP_LOG_VERBOSE, tag, format, args);
730 esp_log_writev(ESP_LOG_INFO, tag, format, args);
736 vTaskDelay(pdMS_TO_TICKS(ms));
744 vTaskDelay(pdMS_TO_TICKS((us + 999) / 1000));
747 esp_rom_delay_us(us);
758 gpio_config_t output_config = {};
759 output_config.intr_type = GPIO_INTR_DISABLE;
760 output_config.mode = GPIO_MODE_OUTPUT;
762 output_config.pull_down_en = GPIO_PULLDOWN_DISABLE;
763 output_config.pull_up_en = GPIO_PULLUP_DISABLE;
765 esp_err_t ret = gpio_config(&output_config);
767 ESP_LOGE(
BUS_TAG,
"Failed to configure output GPIO pins: %s", esp_err_to_name(ret));
772 gpio_config_t input_config = {};
773 input_config.intr_type = GPIO_INTR_DISABLE;
774 input_config.mode = GPIO_MODE_INPUT;
776 input_config.pull_down_en = GPIO_PULLDOWN_DISABLE;
777 input_config.pull_up_en = GPIO_PULLUP_ENABLE;
779 ret = gpio_config(&input_config);
781 ESP_LOGE(
BUS_TAG,
"Failed to configure input GPIO pin: %s", esp_err_to_name(ret));
800 case TMC9660CtrlPin::RST:
802 case TMC9660CtrlPin::DRV_EN:
804 case TMC9660CtrlPin::FAULTN:
806 case TMC9660CtrlPin::WAKE:
834 spi_host_device_t
host = SPI2_HOST;
876 config.gpio.drv_en_pin,
877 config.gpio.faultn_pin,
878 config.gpio.wake_pin,
879 config.spi.clock_speed_hz,
883 if (!interface->initialize()) {
884 ESP_LOGE(
BUS_TAG,
"Failed to initialize SPI interface");
900 config.uart.uart_num,
904 config.gpio.drv_en_pin,
905 config.gpio.faultn_pin,
906 config.gpio.wake_pin,
907 config.uart.baud_rate,
911 if (!interface->initialize()) {
912 ESP_LOGE(
BUS_TAG,
"Failed to initialize UART interface");
ESP32 SPI implementation of TMC9660CommInterface.
Definition esp32_tmc9660_bus.hpp:40
bool initialized_
Definition esp32_tmc9660_bus.hpp:384
void delayUs(uint32_t us) noexcept
Definition esp32_tmc9660_bus.hpp:298
void debugLog(int level, const char *tag, const char *format, va_list args) noexcept
Debug logging function that routes logs through ESP-IDF logging system.
Definition esp32_tmc9660_bus.hpp:270
~Esp32Tmc9660SpiBus() noexcept
Destructor - cleans up SPI resources.
Definition esp32_tmc9660_bus.hpp:78
bool gpioRead(TMC9660CtrlPin pin, GpioSignal &signal) noexcept
Read GPIO pin level for TMC9660 status pins.
Definition esp32_tmc9660_bus.hpp:246
gpio_num_t miso_pin_
Definition esp32_tmc9660_bus.hpp:374
Esp32Tmc9660SpiBus(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 rst_pin, gpio_num_t drv_en_pin, gpio_num_t faultn_pin, gpio_num_t wake_pin, uint32_t clock_speed_hz=10000000, uint8_t mode=0) noexcept
Construct ESP32 SPI communication interface.
Definition esp32_tmc9660_bus.hpp:56
bool configureGpioPins() noexcept
Configure GPIO pins for TMC9660 control and status.
Definition esp32_tmc9660_bus.hpp:315
gpio_num_t drv_en_pin_
Definition esp32_tmc9660_bus.hpp:378
bool gpioSet(TMC9660CtrlPin pin, GpioSignal signal) noexcept
Set GPIO pin signal state for TMC9660 control pins.
Definition esp32_tmc9660_bus.hpp:222
bool spiTransferBootloader(std::array< uint8_t, 5 > &tx, std::array< uint8_t, 5 > &rx) noexcept
Definition esp32_tmc9660_bus.hpp:188
CommMode mode() const noexcept
Get communication mode.
Definition esp32_tmc9660_bus.hpp:212
gpio_num_t mosi_pin_
Definition esp32_tmc9660_bus.hpp:373
void delayMs(uint32_t ms) noexcept
Definition esp32_tmc9660_bus.hpp:294
gpio_num_t sclk_pin_
Definition esp32_tmc9660_bus.hpp:375
uint32_t clock_speed_hz_
Definition esp32_tmc9660_bus.hpp:381
spi_host_device_t host_
Definition esp32_tmc9660_bus.hpp:372
bool initialize() noexcept
Initialize the SPI interface.
Definition esp32_tmc9660_bus.hpp:86
bool spiTransferTMCL(std::array< uint8_t, 8 > &tx, std::array< uint8_t, 8 > &rx) noexcept
Perform SPI transfer for TMC9660 TMCL parameter mode communication.
Definition esp32_tmc9660_bus.hpp:168
gpio_num_t wake_pin_
Definition esp32_tmc9660_bus.hpp:380
spi_device_handle_t device_handle_
Definition esp32_tmc9660_bus.hpp:383
uint8_t mode_
Definition esp32_tmc9660_bus.hpp:382
gpio_num_t faultn_pin_
Definition esp32_tmc9660_bus.hpp:379
bool deinitialize() noexcept
Deinitialize the SPI interface.
Definition esp32_tmc9660_bus.hpp:146
gpio_num_t getGpioPin(TMC9660CtrlPin pin) const noexcept
Map TMC9660 control pins to ESP32 GPIO pins.
Definition esp32_tmc9660_bus.hpp:357
gpio_num_t cs_pin_
Definition esp32_tmc9660_bus.hpp:376
gpio_num_t rst_pin_
Definition esp32_tmc9660_bus.hpp:377
ESP32 UART implementation of TMC9660CommInterface.
Definition esp32_tmc9660_bus.hpp:393
bool deinitialize() noexcept
Deinitialize the UART interface.
Definition esp32_tmc9660_bus.hpp:482
bool configureGpioPins() noexcept
Configure GPIO pins for TMC9660 control and status.
Definition esp32_tmc9660_bus.hpp:756
gpio_num_t drv_en_pin_
Definition esp32_tmc9660_bus.hpp:817
uint32_t baud_rate_
Definition esp32_tmc9660_bus.hpp:820
uart_port_t uart_num_
Definition esp32_tmc9660_bus.hpp:813
gpio_num_t rst_pin_
Definition esp32_tmc9660_bus.hpp:816
gpio_num_t getGpioPin(TMC9660CtrlPin pin) const noexcept
Map TMC9660 control pins to ESP32 GPIO pins.
Definition esp32_tmc9660_bus.hpp:798
~Esp32Tmc9660UartBus() noexcept
Destructor - cleans up UART resources.
Definition esp32_tmc9660_bus.hpp:425
bool gpioRead(TMC9660CtrlPin pin, GpioSignal &signal) noexcept
Read GPIO pin level for TMC9660 status pins.
Definition esp32_tmc9660_bus.hpp:687
void delayMs(uint32_t ms) noexcept
Definition esp32_tmc9660_bus.hpp:735
CommMode mode() const noexcept
Get communication mode.
Definition esp32_tmc9660_bus.hpp:653
bool transferTMCL(const TMCLFrame &tx, TMCLReply &reply, uint8_t address, TMCLReply *firstReply, const TMCLFrame *secondCommand) noexcept
Transfer TMCL frame over UART for parameter mode communication.
Definition esp32_tmc9660_bus.hpp:544
uint8_t address_
Definition esp32_tmc9660_bus.hpp:821
bool uartSendTMCL(const std::array< uint8_t, 9 > &data) noexcept
Send raw 9-byte UART TMCL datagram for parameter mode communication.
Definition esp32_tmc9660_bus.hpp:498
gpio_num_t tx_pin_
Definition esp32_tmc9660_bus.hpp:814
gpio_num_t wake_pin_
Definition esp32_tmc9660_bus.hpp:819
gpio_num_t rx_pin_
Definition esp32_tmc9660_bus.hpp:815
void debugLog(int level, const char *tag, const char *format, va_list args) noexcept
Debug logging function that routes logs through ESP-IDF logging system.
Definition esp32_tmc9660_bus.hpp:711
bool gpioSet(TMC9660CtrlPin pin, GpioSignal signal) noexcept
Set GPIO pin signal state for TMC9660 control pins.
Definition esp32_tmc9660_bus.hpp:663
Esp32Tmc9660UartBus(uart_port_t uart_num, gpio_num_t tx_pin, gpio_num_t rx_pin, gpio_num_t rst_pin, gpio_num_t drv_en_pin, gpio_num_t faultn_pin, gpio_num_t wake_pin, uint32_t baud_rate=115200, uint8_t address=0) noexcept
Construct ESP32 UART communication interface.
Definition esp32_tmc9660_bus.hpp:407
bool uartReceiveTMCL(std::array< uint8_t, 9 > &data) noexcept
Receive raw 9-byte UART TMCL datagram for parameter mode communication.
Definition esp32_tmc9660_bus.hpp:520
gpio_num_t faultn_pin_
Definition esp32_tmc9660_bus.hpp:818
bool initialize() noexcept
Initialize the UART interface.
Definition esp32_tmc9660_bus.hpp:433
bool initialized_
Definition esp32_tmc9660_bus.hpp:822
void delayUs(uint32_t us) noexcept
Definition esp32_tmc9660_bus.hpp:739
bool uartTransferBootloader(const std::array< uint8_t, 8 > &tx, std::array< uint8_t, 8 > &rx) noexcept
Transfer 8-byte UART bootloader datagram (send and receive)
Definition esp32_tmc9660_bus.hpp:620
void logDebug(int level, const char *tag, const char *format,...) noexcept
Public debug logging wrapper for external classes.
Definition tmc9660_comm_interface.hpp:795
bool signalToGpioLevel(TMC9660CtrlPin pin, GpioSignal signal) const noexcept
Convert signal state to physical GPIO level.
Definition tmc9660_comm_interface.hpp:598
GpioSignal gpioLevelToSignal(TMC9660CtrlPin pin, bool gpio_level) const noexcept
Convert physical GPIO level to signal state.
Definition tmc9660_comm_interface.hpp:609
CRTP-based SPI implementation of TMC9660CommInterface.
Definition tmc9660_comm_interface.hpp:855
CRTP-based UART implementation of TMC9660CommInterface.
Definition tmc9660_comm_interface.hpp:1066
static const char * BUS_TAG
Definition esp32_tmc9660_bus.hpp:32
std::unique_ptr< Esp32Tmc9660UartBus > CreateEsp32Tmc9660UartBus(const Esp32Tmc9660BusConfig &config=Esp32Tmc9660BusConfig{}) noexcept
Create and initialize UART communication interface.
Definition esp32_tmc9660_bus.hpp:896
std::unique_ptr< Esp32Tmc9660SpiBus > CreateEsp32Tmc9660SpiBus(const Esp32Tmc9660BusConfig &config=Esp32Tmc9660BusConfig{}) noexcept
Create and initialize SPI communication interface.
Definition esp32_tmc9660_bus.hpp:866
Definition bootloader_config.hpp:9
TMC9660CtrlPin
TMC9660 control pin identifiers with board-agnostic naming.
Definition tmc9660_comm_interface.hpp:126
CommMode
Supported physical communication modes for TMC9660.
Definition tmc9660_comm_interface.hpp:113
GpioSignal
GPIO signal states with board-agnostic naming.
Definition tmc9660_comm_interface.hpp:140
Common bus configuration for ESP32 TMC9660 tests.
Definition esp32_tmc9660_bus.hpp:831
gpio_num_t drv_en_pin
Definition esp32_tmc9660_bus.hpp:855
gpio_num_t sclk_pin
Definition esp32_tmc9660_bus.hpp:837
gpio_num_t mosi_pin
Definition esp32_tmc9660_bus.hpp:835
gpio_num_t faultn_pin
Definition esp32_tmc9660_bus.hpp:856
gpio_num_t rx_pin
Definition esp32_tmc9660_bus.hpp:847
gpio_num_t cs_pin
Definition esp32_tmc9660_bus.hpp:838
struct Esp32Tmc9660BusConfig::@22 uart
gpio_num_t miso_pin
Definition esp32_tmc9660_bus.hpp:836
uint8_t address
Definition esp32_tmc9660_bus.hpp:849
struct Esp32Tmc9660BusConfig::@23 gpio
struct Esp32Tmc9660BusConfig::@21 spi
uart_port_t uart_num
Definition esp32_tmc9660_bus.hpp:845
gpio_num_t wake_pin
Definition esp32_tmc9660_bus.hpp:857
uint8_t mode
Definition esp32_tmc9660_bus.hpp:840
uint32_t baud_rate
Definition esp32_tmc9660_bus.hpp:848
gpio_num_t tx_pin
Definition esp32_tmc9660_bus.hpp:846
gpio_num_t rst_pin
Definition esp32_tmc9660_bus.hpp:854
spi_host_device_t host
Definition esp32_tmc9660_bus.hpp:834
uint32_t clock_speed_hz
Definition esp32_tmc9660_bus.hpp:839
Frame structure for TMCL commands.
Definition tmc9660_comm_interface.hpp:369
Reply structure returned by TMCL command operations.
Definition tmc9660_comm_interface.hpp:189
static bool fromUart(std::span< const uint8_t, 9 > in, uint8_t addr, TMCLReply &r, uint8_t sent_opcode=0, uint16_t sent_type=0) noexcept
Decode and validate reply from UART TMCL datagram.
Definition tmc9660_comm_interface.hpp:320
Communication interfaces for TMC9660 Parameter Mode devices using TMCL protocol over SPI.