zephyr/drivers/stepper/adi_tmc/adi_tmc_spi.c

119 lines
2.9 KiB
C

/*
* SPDX-FileCopyrightText: Copyright (c) 2024 Carl Zeiss Meditec AG
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/sys/util.h>
#include "adi_tmc_spi.h"
#define BUFFER_SIZE 5U
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(tmc_spi, CONFIG_SPI_LOG_LEVEL);
static void parse_tmc_spi_status(const uint8_t status_byte)
{
if ((status_byte & BIT_MASK(0)) != 0) {
LOG_WRN("spi dataframe: reset_flag detected");
}
if ((status_byte & BIT_MASK(1)) != 0) {
LOG_WRN("spi dataframe: driver_error(1) detected");
}
if ((status_byte & BIT_MASK(2)) != 0) {
LOG_WRN("spi dataframe: driver_error(2) detected");
}
}
static void print_tx_rx_buffer(const uint8_t *const tx_buffer, const uint8_t *const rx_buffer)
{
LOG_HEXDUMP_DBG(tx_buffer, BUFFER_SIZE, "TX: ");
LOG_HEXDUMP_DBG(rx_buffer, BUFFER_SIZE, "RX: ");
}
int tmc_spi_read_register(const struct spi_dt_spec *bus, const uint8_t read_address_mask,
const uint8_t register_address, uint32_t *data)
{
uint8_t tx_buffer[BUFFER_SIZE] = {read_address_mask & register_address, 0U, 0U, 0U, 0U};
uint8_t rx_buffer[BUFFER_SIZE];
int status;
const struct spi_buf spi_buffer_tx = {
.buf = &tx_buffer,
.len = sizeof(tx_buffer),
};
struct spi_buf_set spi_buffer_array_tx = {
.buffers = &spi_buffer_tx,
.count = 1U,
};
struct spi_buf spi_buffer_rx = {
.buf = &rx_buffer,
.len = sizeof(rx_buffer),
};
struct spi_buf_set spi_buffer_array_rx = {
.buffers = &spi_buffer_rx,
.count = 1U,
};
/** send read with the address byte */
status = spi_transceive_dt(bus, &spi_buffer_array_tx, &spi_buffer_array_rx);
if (status < 0) {
return status;
}
print_tx_rx_buffer(tx_buffer, rx_buffer);
parse_tmc_spi_status(rx_buffer[0]);
/** read the value from the address */
status = spi_transceive_dt(bus, &spi_buffer_array_tx, &spi_buffer_array_rx);
if (status < 0) {
return status;
}
*data = ((uint32_t)rx_buffer[1] << 24) + ((uint32_t)rx_buffer[2] << 16) +
((uint32_t)rx_buffer[3] << 8) + (uint32_t)rx_buffer[4];
print_tx_rx_buffer(tx_buffer, rx_buffer);
parse_tmc_spi_status(rx_buffer[0]);
return status;
}
int tmc_spi_write_register(const struct spi_dt_spec *bus, const uint8_t write_bit,
const uint8_t register_address, const uint32_t data)
{
uint8_t tx_buffer[BUFFER_SIZE] = {write_bit | register_address, data >> 24, data >> 16,
data >> 8, data};
uint8_t rx_buffer[BUFFER_SIZE];
int status;
const struct spi_buf spi_buffer_tx = {
.buf = &tx_buffer,
.len = sizeof(tx_buffer),
};
struct spi_buf_set spi_buffer_array_tx = {
.buffers = &spi_buffer_tx,
.count = 1U,
};
struct spi_buf spi_buffer_rx = {
.buf = &rx_buffer,
.len = sizeof(rx_buffer),
};
struct spi_buf_set spi_buffer_array_rx = {
.buffers = &spi_buffer_rx,
.count = 1U,
};
status = spi_transceive_dt(bus, &spi_buffer_array_tx, &spi_buffer_array_rx);
if (status < 0) {
return status;
}
print_tx_rx_buffer(tx_buffer, rx_buffer);
parse_tmc_spi_status(rx_buffer[0]);
return status;
}