0: AD5941 EIS project init — driver, ESP32-S3 port, chip ID read

This commit is contained in:
pszsh 2026-03-08 23:16:56 -07:00
commit 397e7efacb
13 changed files with 12060 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
.cache/
build/
sdkconfig.old
.espport
managed_components/
dependencies.lock

6
CMakeLists.txt Normal file
View File

@ -0,0 +1,6 @@
# The following five lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.16)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(eis4)

44
Makefile Normal file
View File

@ -0,0 +1,44 @@
IDF_PATH ?= $(HOME)/esp/esp-idf
PORT := $(or $(ESP_PORT),$(shell cat .espport 2>/dev/null),/dev/cu.usbmodem1101)
IDF = . $(IDF_PATH)/export.sh > /dev/null 2>&1 && idf.py
.PHONY: all flash monitor clean menuconfig size erase select
all:
$(IDF) build
flash:
$(IDF) -p $(PORT) flash
monitor:
$(IDF) -p $(PORT) monitor
clean:
$(IDF) fullclean
menuconfig:
$(IDF) menuconfig
size:
$(IDF) size
erase:
$(IDF) -p $(PORT) erase-flash
select:
@devs=($$(ls /dev/cu.usb* 2>/dev/null)); \
if [ $${#devs[@]} -eq 0 ]; then \
echo "No USB devices found."; exit 1; \
fi; \
echo ""; \
i=1; for d in $${devs[@]}; do echo " $$i) $$d"; i=$$((i+1)); done; \
echo ""; \
printf "Select device [1-$${#devs[@]}]: "; read n; \
if [ "$$n" -ge 1 ] 2>/dev/null && [ "$$n" -le $${#devs[@]} ] 2>/dev/null; then \
sel=$${devs[$$((n-1))]}; \
echo "$$sel" > .espport; \
echo "=> $$sel"; \
else \
echo "Invalid selection."; exit 1; \
fi

View File

@ -0,0 +1,8 @@
idf_component_register(SRCS "ad5940.c"
INCLUDE_DIRS ".")
# Vendor library suppress warnings we can't fix
target_compile_options(${COMPONENT_LIB} PRIVATE
-Wno-maybe-uninitialized
-Wno-unused-variable
-Wno-unused-but-set-variable)

4422
components/ad5941/ad5940.c Normal file

File diff suppressed because it is too large Load Diff

4939
components/ad5941/ad5940.h Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,3 @@
idf_component_register(SRCS "ad5941_port.c" "ad5941_bridge.c"
INCLUDE_DIRS "."
REQUIRES ad5941 driver esp_rom)

View File

@ -0,0 +1,67 @@
/*
* AD5940 library ESP32-S3 bridge.
* Implements the platform functions the ad5940 library expects to find at link time.
*/
#include "ad5940.h"
#include "ad5941_port.h"
#include "esp_rom_sys.h"
static volatile uint8_t int_flag;
static void IRAM_ATTR gp0_isr(void *arg)
{
int_flag = 1;
}
/* ---- SPI ---- */
void AD5940_ReadWriteNBytes(unsigned char *pSendBuffer, unsigned char *pRecvBuff, unsigned long length)
{
ad5941_port_spi_rw(pSendBuffer, pRecvBuff, length);
}
/* ---- CS ---- */
void AD5940_CsClr(void) { gpio_set_level(AD5940_CS_PIN, 0); }
void AD5940_CsSet(void) { gpio_set_level(AD5940_CS_PIN, 1); }
/* ---- Reset ---- */
void AD5940_RstSet(void) { gpio_set_level(AD5940_RST_PIN, 1); }
void AD5940_RstClr(void) { gpio_set_level(AD5940_RST_PIN, 0); }
/* ---- Timing ---- */
void AD5940_Delay10us(uint32_t time)
{
if (time < 100)
esp_rom_delay_us(time * 10);
else
vTaskDelay(pdMS_TO_TICKS(time / 100));
}
/* ---- Interrupt ---- */
uint32_t AD5940_GetMCUIntFlag(void) { return int_flag; }
uint32_t AD5940_ClrMCUIntFlag(void)
{
int_flag = 0;
return 1;
}
/* ---- Resource init (called by AD5940_MCUResourceInit) ---- */
uint32_t AD5940_MCUResourceInit(void *pCfg)
{
ad5941_port_init_spi();
ad5941_port_init_gpio();
AD5940_CsSet();
AD5940_RstSet();
gpio_install_isr_service(0);
gpio_isr_handler_add(AD5940_GP0INT_PIN, gp0_isr, NULL);
return 0;
}

View File

@ -0,0 +1,58 @@
#include "ad5941_port.h"
static const char *TAG = "ad5941-port";
static spi_device_handle_t spi;
void ad5941_port_init_spi(void)
{
if (spi) return;
spi_bus_config_t bus = {
.mosi_io_num = PIN_NUM_MOSI,
.miso_io_num = PIN_NUM_MISO,
.sclk_io_num = PIN_NUM_CLK,
.quadwp_io_num = -1,
.quadhd_io_num = -1,
.max_transfer_sz = SOC_SPI_MAXIMUM_BUFFER_SIZE,
};
spi_device_interface_config_t dev = {
.clock_source = SPI_CLK_SRC_DEFAULT,
.queue_size = 1,
.mode = 0,
.clock_speed_hz = SPI_MASTER_FREQ_16M,
.spics_io_num = -1, /* CS managed manually */
};
ESP_ERROR_CHECK(spi_bus_initialize(AD594x_HOST, &bus, SPI_DMA_CH_AUTO));
ESP_ERROR_CHECK(spi_bus_add_device(AD594x_HOST, &dev, &spi));
ESP_LOGI(TAG, "SPI%d initialised", AD594x_HOST + 1);
}
void ad5941_port_init_gpio(void)
{
gpio_reset_pin(AD5940_CS_PIN);
gpio_set_direction(AD5940_CS_PIN, GPIO_MODE_OUTPUT);
gpio_set_level(AD5940_CS_PIN, 1);
gpio_reset_pin(AD5940_RST_PIN);
gpio_set_direction(AD5940_RST_PIN, GPIO_MODE_OUTPUT);
gpio_set_level(AD5940_RST_PIN, 1);
gpio_reset_pin(AD5940_GP0INT_PIN);
gpio_set_direction(AD5940_GP0INT_PIN, GPIO_MODE_INPUT);
gpio_set_pull_mode(AD5940_GP0INT_PIN, GPIO_PULLUP_ONLY);
gpio_set_intr_type(AD5940_GP0INT_PIN, GPIO_INTR_NEGEDGE);
}
void ad5941_port_spi_rw(uint8_t *tx, uint8_t *rx, unsigned long len)
{
if (!len) return;
spi_transaction_t t = {
.length = len * 8,
.tx_buffer = tx,
.rx_buffer = rx,
};
ESP_ERROR_CHECK(spi_device_polling_transmit(spi, &t));
}

View File

@ -0,0 +1,29 @@
#ifndef AD5941_PORT_H
#define AD5941_PORT_H
#include <stdint.h>
#include "driver/spi_master.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
/* SPI host */
#define AD594x_HOST SPI2_HOST
/* SPI pins — match PCB net EIS_IC */
#define PIN_NUM_MISO 13
#define PIN_NUM_MOSI 11
#define PIN_NUM_CLK 12
#define PIN_NUM_CS 10
/* AD5941 control pins */
#define AD5940_CS_PIN PIN_NUM_CS
#define AD5940_RST_PIN 5 /* ESP32-S3 GPIO5 → AD5941 ~RESET */
#define AD5940_GP0INT_PIN 4 /* ESP32-S3 GPIO4 → AD5941 GPIO0 */
void ad5941_port_init_spi(void);
void ad5941_port_init_gpio(void);
void ad5941_port_spi_rw(uint8_t *tx, uint8_t *rx, unsigned long len);
#endif

3
main/CMakeLists.txt Normal file
View File

@ -0,0 +1,3 @@
idf_component_register(SRCS "eis4.c"
INCLUDE_DIRS "."
REQUIRES ad5941 ad5941_port)

28
main/eis4.c Normal file
View File

@ -0,0 +1,28 @@
#include <stdio.h>
#include "ad5940.h"
#include "ad5941_port.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define AD5941_EXPECTED_ADIID 0x4144
void app_main(void)
{
printf("EIS4: AD5941 bring-up\n");
AD5940_MCUResourceInit(NULL);
AD5940_HWReset();
AD5940_Initialize();
uint32_t adiid = AD5940_ReadReg(REG_AFECON_ADIID);
uint32_t chipid = AD5940_ReadReg(REG_AFECON_CHIPID);
printf("ADIID : 0x%04lX %s\n", adiid,
adiid == AD5941_EXPECTED_ADIID ? "(OK)" : "(UNEXPECTED)");
printf("CHIPID: 0x%04lX\n", chipid);
if (adiid != AD5941_EXPECTED_ADIID)
printf("FAIL: cannot communicate with AD5941 — check SPI wiring\n");
else
printf("AD5941 alive and responding\n");
}

2447
sdkconfig Normal file

File diff suppressed because it is too large Load Diff