#ifndef LTC2508_DRIVER_H #define LTC2508_DRIVER_H #include "main.h" // 包含 main.h 以获取 SPI 和 GPIO 等的句柄 // 定义每个 ADC 采样的数据长度 (32-bit) #define LTC2508_DATA_LEN 2 // 2个 16bit 数据 // 假设我们有3个 LTC2508 #define NUM_LTC2508 3 // 双缓冲区定义 #define LTC2508_BUFFER_COUNT 128 // 缓冲区状态定义 typedef enum { LTC2508_BUFFER_EMPTY = 0, LTC2508_BUFFER_FILLING, LTC2508_BUFFER_READY, LTC2508_BUFFER_PROCESSING } LTC2508_BufferStateTypeDef; // LTC2508错误状态定义 typedef enum { LTC2508_OK = 0, LTC2508_ERROR_INIT, LTC2508_ERROR_SPI, LTC2508_ERROR_DMA, LTC2508_ERROR_TIMEOUT, LTC2508_ERROR_DATA_INVALID, LTC2508_ERROR_BUFFER_OVERFLOW } LTC2508_StatusTypeDef; // LTC2508统计信息 typedef struct { uint32_t total_samples; uint32_t error_count; uint32_t timeout_count; uint32_t dma_error_count; uint32_t buffer_overflow_count; uint8_t last_error; uint8_t current_buffer_index; } LTC2508_StatsTypeDef; // 双缓冲区数据结构 typedef struct { uint16_t data[NUM_LTC2508][LTC2508_DATA_LEN]; uint32_t timestamp; LTC2508_BufferStateTypeDef state; uint8_t dma_complete_count; // 记录完成的DMA传输数量 } LTC2508_BufferTypeDef; // 用于存储三路 ADC 数据的双缓冲区 extern volatile LTC2508_BufferTypeDef g_adc_buffers[LTC2508_BUFFER_COUNT]; // ADC 数据准备就绪标志 extern volatile uint8_t g_adc_data_ready_flag; // 当前写入缓冲区索引 extern volatile uint8_t g_current_write_buffer; // 当前读取缓冲区索引 extern volatile uint8_t g_current_read_buffer; // 错误统计信息 extern LTC2508_StatsTypeDef g_ltc2508_stats; // 函数原型 uint32_t LTC2508_IsInited(); LTC2508_StatusTypeDef LTC2508_Init(SPI_HandleTypeDef *hspi1, SPI_HandleTypeDef *hspi2, SPI_HandleTypeDef *hspi3); LTC2508_StatusTypeDef LTC2508_TriggerDmaRead(void); void LTC2508_DmaComplete_Callback(SPI_HandleTypeDef *hspi); void LTC2508_ErrorCallback(SPI_HandleTypeDef *hspi); LTC2508_StatusTypeDef LTC2508_ValidateData(LTC2508_BufferTypeDef *buffer, uint8_t channel); void LTC2508_GetStats(LTC2508_StatsTypeDef *stats); void LTC2508_ResetStats(void); // 双缓冲区相关函数 LTC2508_StatusTypeDef LTC2508_GetReadyBuffer(LTC2508_BufferTypeDef **buffer); void LTC2508_ReleaseBuffer(uint8_t buffer_index); LTC2508_StatusTypeDef LTC2508_SwapBuffers(void); uint8_t LTC2508_GetCurrentWriteBuffer(void); uint8_t LTC2508_GetCurrentReadBuffer(void); LTC2508_StatusTypeDef LTC2508_IsBufferReady(uint8_t buffer_index); #endif // LTC2508_DRIVER_H