177 lines
5.2 KiB
C
177 lines
5.2 KiB
C
// File: AD5940_Platform.c
|
|
#include "App_Common.h"
|
|
#include "hardware/spi.h"
|
|
#include "hardware/gpio.h"
|
|
|
|
// --- Platform Interface Implementation ---
|
|
void AD5940_CsClr(void) { gpio_put(PIN_CS, 0); }
|
|
void AD5940_CsSet(void) { gpio_put(PIN_CS, 1); }
|
|
void AD5940_RstClr(void) { gpio_put(PIN_RST, 0); }
|
|
void AD5940_RstSet(void) { gpio_put(PIN_RST, 1); }
|
|
void AD5940_Delay10us(uint32_t time) { sleep_us(time * 10); }
|
|
|
|
void AD5940_ReadWriteNBytes(unsigned char *pSendBuffer, unsigned char *pRecvBuff, unsigned long length) {
|
|
spi_write_read_blocking(spi0, pSendBuffer, pRecvBuff, length);
|
|
}
|
|
|
|
uint32_t AD5940_GetMCUIntFlag(void) {
|
|
return (gpio_get(PIN_INT) == 0);
|
|
}
|
|
|
|
uint32_t AD5940_ClrMCUIntFlag(void) {
|
|
return 1;
|
|
}
|
|
|
|
uint32_t AD5940_MCUResourceInit(void *pCfg) {
|
|
return 0;
|
|
}
|
|
|
|
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; }
|
|
|
|
// --- Hardware Setup ---
|
|
void setup_pins(void) {
|
|
spi_init(spi0, 16000000);
|
|
gpio_set_function(PIN_MISO, GPIO_FUNC_SPI);
|
|
gpio_set_function(PIN_SCK, GPIO_FUNC_SPI);
|
|
gpio_set_function(PIN_MOSI, GPIO_FUNC_SPI);
|
|
|
|
gpio_init(PIN_CS);
|
|
gpio_set_dir(PIN_CS, GPIO_OUT);
|
|
gpio_put(PIN_CS, 1);
|
|
|
|
gpio_init(PIN_RST);
|
|
gpio_set_dir(PIN_RST, GPIO_OUT);
|
|
gpio_put(PIN_RST, 1);
|
|
|
|
gpio_init(PIN_INT);
|
|
gpio_set_dir(PIN_INT, GPIO_IN);
|
|
gpio_pull_up(PIN_INT);
|
|
}
|
|
|
|
int32_t AD5940PlatformCfg(void) {
|
|
CLKCfg_Type clk_cfg;
|
|
FIFOCfg_Type fifo_cfg;
|
|
AGPIOCfg_Type gpio_cfg;
|
|
|
|
clk_cfg.ADCClkDiv = ADCCLKDIV_1;
|
|
clk_cfg.ADCCLkSrc = ADCCLKSRC_HFOSC;
|
|
clk_cfg.SysClkDiv = SYSCLKDIV_1;
|
|
clk_cfg.SysClkSrc = SYSCLKSRC_HFOSC;
|
|
clk_cfg.HfOSC32MHzMode = bFALSE;
|
|
clk_cfg.HFOSCEn = bTRUE;
|
|
clk_cfg.HFXTALEn = bFALSE;
|
|
clk_cfg.LFOSCEn = bTRUE;
|
|
AD5940_CLKCfg(&clk_cfg);
|
|
|
|
fifo_cfg.FIFOEn = bFALSE;
|
|
fifo_cfg.FIFOMode = FIFOMODE_FIFO;
|
|
fifo_cfg.FIFOSize = FIFOSIZE_4KB;
|
|
fifo_cfg.FIFOSrc = FIFOSRC_DFT;
|
|
fifo_cfg.FIFOThresh = 6;
|
|
AD5940_FIFOCfg(&fifo_cfg);
|
|
fifo_cfg.FIFOEn = bTRUE;
|
|
AD5940_FIFOCfg(&fifo_cfg);
|
|
|
|
AD5940_INTCCfg(AFEINTC_1, AFEINTSRC_ALLINT, bTRUE);
|
|
AD5940_INTCClrFlag(AFEINTSRC_ALLINT);
|
|
AD5940_INTCCfg(AFEINTC_0, AFEINTSRC_DATAFIFOTHRESH|AFEINTSRC_CUSTOMINT0, bTRUE);
|
|
AD5940_INTCClrFlag(AFEINTSRC_ALLINT);
|
|
|
|
gpio_cfg.FuncSet = GP0_INT;
|
|
gpio_cfg.InputEnSet = 0;
|
|
gpio_cfg.OutputEnSet = AGPIO_Pin0;
|
|
gpio_cfg.OutVal = 0;
|
|
gpio_cfg.PullEnSet = 0;
|
|
AD5940_AGPIOCfg(&gpio_cfg);
|
|
|
|
AD5940_SleepKeyCtrlS(SLPKEY_UNLOCK);
|
|
return 0;
|
|
}
|
|
|
|
void SystemReset(void) {
|
|
sleep_ms(100);
|
|
AD5940_SoftRst();
|
|
sleep_ms(1);
|
|
AD5940_Initialize();
|
|
AD5940PlatformCfg();
|
|
}
|
|
|
|
// --- Helpers ---
|
|
uint32_t GetHSTIARtia(uint32_t val) {
|
|
switch(val) {
|
|
case 200: return HSTIARTIA_200;
|
|
case 1000: return HSTIARTIA_1K;
|
|
case 5000: return HSTIARTIA_5K;
|
|
case 10000: return HSTIARTIA_10K;
|
|
case 20000: return HSTIARTIA_20K;
|
|
case 40000: return HSTIARTIA_40K;
|
|
case 80000: return HSTIARTIA_80K;
|
|
case 160000: return HSTIARTIA_160K;
|
|
default: return HSTIARTIA_1K;
|
|
}
|
|
}
|
|
|
|
uint32_t GetLPTIARtia(uint32_t val) {
|
|
switch(val) {
|
|
case 200: return LPTIARTIA_200R;
|
|
case 1000: return LPTIARTIA_1K;
|
|
case 2000: return LPTIARTIA_2K;
|
|
case 3000: return LPTIARTIA_3K;
|
|
case 4000: return LPTIARTIA_4K;
|
|
case 6000: return LPTIARTIA_6K;
|
|
case 8000: return LPTIARTIA_8K;
|
|
case 10000: return LPTIARTIA_10K;
|
|
case 12000: return LPTIARTIA_12K;
|
|
case 16000: return LPTIARTIA_16K;
|
|
case 20000: return LPTIARTIA_20K;
|
|
case 24000: return LPTIARTIA_24K;
|
|
case 30000: return LPTIARTIA_30K;
|
|
case 32000: return LPTIARTIA_32K;
|
|
case 40000: return LPTIARTIA_40K;
|
|
case 48000: return LPTIARTIA_48K;
|
|
case 64000: return LPTIARTIA_64K;
|
|
case 85000: return LPTIARTIA_85K;
|
|
case 96000: return LPTIARTIA_96K;
|
|
case 100000: return LPTIARTIA_100K;
|
|
case 120000: return LPTIARTIA_120K;
|
|
case 128000: return LPTIARTIA_128K;
|
|
case 160000: return LPTIARTIA_160K;
|
|
case 196000: return LPTIARTIA_196K;
|
|
case 256000: return LPTIARTIA_256K;
|
|
case 512000: return LPTIARTIA_512K;
|
|
default: return LPTIARTIA_1K;
|
|
}
|
|
}
|
|
|
|
uint32_t GetLPTIARload(uint32_t val) {
|
|
if (val <= 200) return LPTIARLOAD_10R;
|
|
return LPTIARLOAD_100R;
|
|
}
|
|
|
|
void ImpedanceShowResult(uint32_t *pData, uint32_t DataCount) {
|
|
float freq;
|
|
fImpPol_Type *pImp = (fImpPol_Type*)pData;
|
|
AppIMPCtrl(IMPCTRL_GETFREQ, &freq);
|
|
|
|
for(int i=0;i<DataCount;i++) {
|
|
float mag = pImp[i].Magnitude;
|
|
float phase = pImp[i].Phase;
|
|
float real = mag * cosf(phase);
|
|
float imag = mag * sinf(phase);
|
|
printf("DATA,%.2f,%.4f,%.4f,%.4f,%.4f\n", freq, mag, phase * 180.0f / MATH_PI, real, imag);
|
|
}
|
|
}
|
|
|
|
void AmperometricShowResult(float *pData, uint32_t DataCount) {
|
|
for(int i=0;i<DataCount;i++) {
|
|
printf("AMP,%d,%.4f\n", g_AmpIndex++, pData[i]);
|
|
}
|
|
}
|
|
|
|
void RampShowResult(float *pData, uint32_t DataCount) {
|
|
for(int i=0;i<DataCount;i++) {
|
|
printf("RAMP,%d,%.4f\n", g_RampIndex++, pData[i]);
|
|
}
|
|
} |