initial commit

This commit is contained in:
jhChun
2026-04-08 16:58:54 +09:00
commit 82e33d8bf9
2578 changed files with 1590432 additions and 0 deletions

View File

@@ -0,0 +1,265 @@
/*******************************************************************************
* @file meas_pd_48.h
* @brief M48 LED-PD Measurement Module Header for NIRS System
* @author Charles KWON <charleskwon@medithings.co.kr>
* @version V2.0.0
* @date 2025-12-31
*
* Copyright (c) 2025 Medithings Inc.
* All rights reserved.
*
* This header defines the interface for the M48 measurement module which
* controls 24/48 LED-PD pair measurements using SAADC with PPI triggering
* from the ADA2200 Lock-in Amplifier SYNCO signal.
*
* Hardware Configuration:
* - ADC Input: Differential measurement on AIN0/AIN1
* - Trigger: ADA2200 SYNCO pin (P0.17) via GPIOTE/PPI
* - Gain Control: MCP4725 DAC via I2C
* - LED Control: CAT9532 via I2C
******************************************************************************/
#ifndef _MEAS_PD_48_H__
#define _MEAS_PD_48_H__
/*============================================================================*/
/* Includes - Charles KWON */
/*============================================================================*/
#include "sdk_common.h"
#include "nrf_drv_saadc.h"
/*============================================================================*/
/* Hardware Pin Configuration - Charles KWON */
/*============================================================================*/
/**
* @brief ADA2200 Lock-in Amplifier SYNCO output pin
* - Charles KWON
*
* This pin provides the synchronization signal for ADC sampling.
* Connected to GPIOTE for triggering SAADC via PPI.
*/
#ifndef ADA2200_SYNCO_PIN
#define ADA2200_SYNCO_PIN NRF_GPIO_PIN_MAP(0, 17)
#endif
/*============================================================================*/
/* Measurement Configuration Constants - Charles KWON */
/*============================================================================*/
/**
* @brief Number of photodetectors in the system
* - Charles KWON
*
* Currently configured for single PD operation (PD0).
*/
#define m48_PD_NO 1
/**
* @brief Number of LEDs for full measurement sequence
* - Charles KWON
*
* Full measurement uses 24 LEDs (LED0-LED23) with single PD.
* Modified from original 48 LED configuration (cj edit 25/10/14).
*/
#define m48_LED_NO 24
/**
* @brief Number of LEDs for half measurement sequence
* - Charles KWON
*
* Half measurement uses 24 LEDs for either:
* - Part A: LED0-LED23 (ADC_PD_MODE 3)
* - Part B: LED24-LED47 (ADC_PD_MODE 4)
*/
#define m48_LED_NO_H 24
/**
* @brief Number of ADC samples per LED measurement cycle
* - Charles KWON
*
* Each LED measurement consists of 32 consecutive ADC samples
* triggered by SYNCO signal for averaging/processing.
*/
#define m48_CYCLE_CNT 32
/*============================================================================*/
/* PPI Configuration Functions - Charles KWON */
/*============================================================================*/
/**
* @brief Initialize PPI channel for SYNCO-triggered ADC sampling
* - Charles KWON
*
* Configures PPI to connect GPIOTE SYNCO event to SAADC SAMPLE task.
* This enables hardware-triggered ADC sampling synchronized with
* the ADA2200 lock-in amplifier output.
*/
void m48_ppi_init(void);
/**
* @brief Uninitialize PPI channel
* - Charles KWON
*
* Releases PPI resources after measurement completion.
*/
void m48_ppi_uninit(void);
/**
* @brief Enable PPI sampling event
* - Charles KWON
*
* Activates the SYNCO-to-SAADC PPI channel to begin
* hardware-triggered sampling.
*/
void m48_sampling_event_enable(void);
/**
* @brief Disable PPI sampling event
* - Charles KWON
*
* Deactivates the PPI channel to stop hardware-triggered sampling.
*/
void m48_sampling_event_disable(void);
/*============================================================================*/
/* SAADC Functions - Charles KWON */
/*============================================================================*/
/**
* @brief ADC interrupt handler for voltage measurements
* - Charles KWON
*
* Callback function invoked when ADC buffer is full.
* Processes raw ADC values and advances to next LED in sequence.
*
* @param[in] p_event Pointer to SAADC event structure containing
* conversion results and event type
*
* @note This is a static function - declaration kept for documentation
*/
static void m48_voltage_handler(nrf_drv_saadc_evt_t const * p_event);
/**
* @brief Initialize and start first ADC measurement sequence
* - Charles KWON
*
* Entry point for M48 measurement. Initializes hardware,
* configures first LED, and begins ADC sampling.
*/
void m48_adc_start_init(void);
/**
* @brief Start ADC sampling for current LED
* - Charles KWON
*
* Configures ADC buffer and enables sampling for the
* currently selected LED in the measurement sequence.
*/
void m48_adc_start(void);
/**
* @brief Start ADC sampling with secondary buffer
* - Charles KWON
*
* Alternative start function using secondary ADC buffer
* for double-buffered operation.
*/
void m48_adc_start2(void);
/**
* @brief End current LED measurement and advance to next
* - Charles KWON
*
* Called after ADC interrupt to transition to next LED
* in the measurement sequence.
*/
void m48_adc_end(void);
/**
* @brief Finalize measurement sequence
* - Charles KWON
*
* Called when all LEDs have been measured. Sends results
* over BLE and cleans up hardware resources.
*/
void m48_adc_end_final(void);
/**
* @brief Initialize SAADC for differential measurement
* - Charles KWON
*
* Configures SAADC with:
* - Differential input on AIN0 (positive) / AIN1 (negative)
* - Internal reference (0.6V)
* - 1/4 gain for optimal range
* - 14-bit resolution
*/
void m48_adc_init(void);
/**
* @brief Uninitialize SAADC
* - Charles KWON
*
* Releases SAADC resources for use by other modules.
*/
void m48_adc_uninit(void);
/*============================================================================*/
/* GPIO Interrupt Functions - Charles KWON */
/*============================================================================*/
/**
* @brief Initialize GPIOTE for SYNCO signal detection
* - Charles KWON
*
* Configures GPIOTE channel to detect rising edges on
* ADA2200 SYNCO pin for PPI triggering.
*/
void m48_irq_init(void);
/**
* @brief Uninitialize GPIOTE
* - Charles KWON
*
* Releases GPIOTE resources after measurement completion.
*/
void m48_irq_uninit(void);
/*============================================================================*/
/* Measurement Timer Functions - Charles KWON */
/*============================================================================*/
/**
* @brief Measurement check timer callback
* - Charles KWON
*
* Periodic timer callback for monitoring measurement progress
* and handling timeout conditions.
*
* @param[in] p_context Unused timer context parameter
*/
void m48_check_loop(void * p_context);
/**
* @brief Start measurement check timer
* - Charles KWON
*/
void m48_check_timer_start(void);
/**
* @brief Stop measurement check timer
* - Charles KWON
*/
void m48_check_timer_stop(void);
/**
* @brief Initialize measurement check timer
* - Charles KWON
*
* Creates the timer used for measurement monitoring.
* Must be called during system initialization.
*/
void m48_check_timer_init(void);
#endif /* _MEAS_PD_48_H__ */