9#include "libtropic_port.h"
10#include "driver/gpio.h"
11#include "driver/spi_master.h"
13#include "esp_random.h"
14#include "freertos/FreeRTOS.h"
15#include "freertos/task.h"
20static const char*
TAG =
"TR01-SPI";
23 if (!s2 || !s2->device) {
27 lt_dev_esp32_t *device =
static_cast<lt_dev_esp32_t *
>(s2->device);
28 device->spi =
nullptr;
31 gpio_config_t io_conf = {};
32 io_conf.pin_bit_mask = 1ULL << device->cs_pin;
33 io_conf.mode = GPIO_MODE_OUTPUT;
34 io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
35 io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
36 io_conf.intr_type = GPIO_INTR_DISABLE;
37 gpio_config(&io_conf);
38 gpio_set_level(device->cs_pin, 1);
46 spi_device_interface_config_t devcfg = {};
47 devcfg.clock_speed_hz = 10 * 1000 * 1000;
49 devcfg.spics_io_num = -1;
50 devcfg.queue_size = 1;
56 LOG_I(
TAG,
"TROPIC01 SPI initialized (CS=GPIO%d)", device->cs_pin);
61 if (!s2 || !s2->device) {
65 lt_dev_esp32_t *device =
static_cast<lt_dev_esp32_t *
>(s2->device);
67 spi_bus_remove_device(device->spi);
68 device->spi =
nullptr;
70 gpio_set_level(device->cs_pin, 1);
75 if (!s2 || !s2->device) {
78 lt_dev_esp32_t *device =
static_cast<lt_dev_esp32_t *
>(s2->device);
79 gpio_set_level(device->cs_pin, 0);
84 if (!s2 || !s2->device) {
87 lt_dev_esp32_t *device =
static_cast<lt_dev_esp32_t *
>(s2->device);
88 gpio_set_level(device->cs_pin, 1);
93 uint32_t timeout_ms) {
95 if (!s2 || !s2->device) {
98 lt_dev_esp32_t *device =
static_cast<lt_dev_esp32_t *
>(s2->device);
105 spi_transaction_t t = {};
106 t.length =
static_cast<size_t>(tx_len) * 8;
107 t.tx_buffer = s2->buff + offset;
108 t.rx_buffer = s2->buff + offset;
109 esp_err_t err = spi_device_polling_transmit(device->spi, &t);
112 LOG_E(
TAG,
"SPI transmit failed: %d", err);
120 vTaskDelay(pdMS_TO_TICKS(ms));
125extern "C" lt_ret_t lt_port_delay_on_int(lt_l2_state_t *s2, uint32_t ms) {
128 return LT_L1_INT_TIMEOUT;
134 if (!buff || count == 0) {
137 esp_fill_random(buff, count);
146 va_start(args, format);
147 int ret = vprintf(format, args);
CDC Log: logging over TinyUSB CDC and UART.
#define LOG_I(tag, fmt,...)
#define LOG_E(tag, fmt,...)
lt_ret_t lt_port_delay(lt_l2_state_t *s2, uint32_t ms)
int lt_port_log(const char *format,...)
lt_ret_t lt_port_random_bytes(lt_l2_state_t *s2, void *buff, size_t count)
lt_ret_t lt_port_init(lt_l2_state_t *s2)
lt_ret_t lt_port_spi_csn_high(lt_l2_state_t *s2)
lt_ret_t lt_port_spi_transfer(lt_l2_state_t *s2, uint8_t offset, uint16_t tx_len, uint32_t timeout_ms)
lt_ret_t lt_port_deinit(lt_l2_state_t *s2)
lt_ret_t lt_port_spi_csn_low(lt_l2_state_t *s2)
esp_err_t initSharedSpiBus()
Initializes shared SPI bus once for all SPI peripherals.
spi_host_device_t getSharedSpiHost()
Returns shared SPI host identifier.