AutoSpa/main/esp32s3_port.c

100 lines
3.0 KiB
C

/**
* ESP32-S3 port for AD5940 — mirrors the RP2040 port as closely as possible.
* Kept minimal: SPI init, GPIO init, ReadWriteNBytes, CS/RST/Delay.
*/
#include "esp32s3_port.h"
#include "ad5940.h"
#include "driver/gpio.h"
#include "driver/spi_master.h"
#include "esp_log.h"
#include "esp_rom_sys.h"
#include <string.h>
static spi_device_handle_t spi;
static volatile uint32_t ucInterrupted = 0;
static void IRAM_ATTR gpio_isr_handler(void *arg) { ucInterrupted = 1; }
/**
* Mirrors RP2040 setup_pins():
* spi_init(spi0, 16000000);
* gpio_set_function(MISO/SCK/MOSI, GPIO_FUNC_SPI);
* gpio_init(CS/RST) as output high;
* gpio_init(INT) as input with pull-up;
*/
uint32_t AD5940_MCUResourceInit(void *pCfg) {
// --- SPI at 16 MHz, Mode 0 ---
spi_bus_config_t buscfg = {
.miso_io_num = AD5940_MISO_PIN,
.mosi_io_num = AD5940_MOSI_PIN,
.sclk_io_num = AD5940_SCK_PIN,
.quadwp_io_num = -1,
.quadhd_io_num = -1,
.max_transfer_sz = 64,
};
spi_device_interface_config_t devcfg = {
.clock_speed_hz = 16 * 1000 * 1000,
.mode = 0,
.spics_io_num = -1, // Manual CS
.queue_size = 1,
};
ESP_ERROR_CHECK(spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_DISABLED));
ESP_ERROR_CHECK(spi_bus_add_device(SPI2_HOST, &devcfg, &spi));
// --- CS pin: output, high ---
gpio_reset_pin(AD5940_CS_PIN);
gpio_set_direction(AD5940_CS_PIN, GPIO_MODE_OUTPUT);
gpio_set_level(AD5940_CS_PIN, 1);
// --- RST pin: output, high ---
gpio_reset_pin(AD5940_RST_PIN);
gpio_set_direction(AD5940_RST_PIN, GPIO_MODE_OUTPUT);
gpio_set_level(AD5940_RST_PIN, 1);
// --- INT pin: input, pull-up ---
gpio_reset_pin(AD5940_GP0INT_PIN);
gpio_set_direction(AD5940_GP0INT_PIN, GPIO_MODE_INPUT);
gpio_pullup_en(AD5940_GP0INT_PIN);
gpio_install_isr_service(0);
gpio_set_intr_type(AD5940_GP0INT_PIN, GPIO_INTR_NEGEDGE);
gpio_isr_handler_add(AD5940_GP0INT_PIN, gpio_isr_handler,
(void *)AD5940_GP0INT_PIN);
return 0;
}
// --- Platform Interface (same signatures as RP2040 port) ---
void AD5940_CsClr(void) { gpio_set_level(AD5940_CS_PIN, 0); }
void AD5940_CsSet(void) { gpio_set_level(AD5940_CS_PIN, 1); }
void AD5940_RstClr(void) { gpio_set_level(AD5940_RST_PIN, 0); }
void AD5940_RstSet(void) { gpio_set_level(AD5940_RST_PIN, 1); }
void AD5940_Delay10us(uint32_t time) { esp_rom_delay_us(time * 10); }
void AD5940_ReadWriteNBytes(unsigned char *pSendBuffer,
unsigned char *pRecvBuff, unsigned long length) {
spi_transaction_t t = {
.length = length * 8,
.tx_buffer = pSendBuffer,
.rx_buffer = pRecvBuff,
};
spi_device_polling_transmit(spi, &t);
}
uint32_t AD5940_GetMCUIntFlag(void) { return ucInterrupted; }
uint32_t AD5940_ClrMCUIntFlag(void) {
ucInterrupted = 0;
return 1;
}
void AD5940_MCUGpioWrite(uint32_t data) { (void)data; }
uint32_t AD5940_MCUGpioRead(uint32_t pin) {
(void)pin;
return 0;
}
void AD5940_MCUGpioCtrl(uint32_t pin, BoolFlag enable) {
(void)pin;
(void)enable;
}