/** ****************************************************************************** * @file ltc2508_example.c * @brief LTC2508 双缓冲驱动使用示例 ****************************************************************************** */ #include "ltc2508_driver.h" #include "main.h" // 外部SPI句柄声明(需要在main.c中定义) extern SPI_HandleTypeDef hspi1; extern SPI_HandleTypeDef hspi2; extern SPI_HandleTypeDef hspi3; /** * @brief LTC2508 双缓冲使用示例 * @param None * @retval None */ void LTC2508_Example_Usage(void) { LTC2508_StatusTypeDef status; LTC2508_BufferTypeDef *ready_buffer = NULL; // 1. 初始化LTC2508驱动 status = LTC2508_Init(&hspi1, &hspi2, &hspi3); if (status != LTC2508_OK) { // 处理初始化错误 return; } // 2. 主循环中的数据采集和处理 while (1) { // 触发DMA读取(非阻塞) status = LTC2508_TriggerDmaRead(); if (status == LTC2508_OK) { // DMA传输已启动,可以继续执行其他任务 } // 检查是否有准备好的数据 status = LTC2508_GetReadyBuffer(&ready_buffer); if (status == LTC2508_OK && ready_buffer != NULL) { // 处理数据 LTC2508_ProcessData(ready_buffer); // 获取当前读取缓冲区索引并释放 uint8_t current_read_idx = LTC2508_GetCurrentReadBuffer(); LTC2508_ReleaseBuffer(current_read_idx); } // 其他任务... HAL_Delay(1); } } /** * @brief 处理LTC2508数据的示例函数 * @param buffer: 包含ADC数据的缓冲区 * @retval None */ void LTC2508_ProcessData(LTC2508_BufferTypeDef *buffer) { if (buffer == NULL) return; // 验证每个通道的数据 for (uint8_t channel = 0; channel < NUM_LTC2508; channel++) { if (LTC2508_ValidateData(buffer, channel) == LTC2508_OK) { // 获取32位ADC数据 uint32_t adc_value = ((uint32_t)buffer->data[channel][0] << 16) | buffer->data[channel][1]; // 处理数据(例如:转换为电压值、滤波、存储等) float voltage = LTC2508_ConvertToVoltage(adc_value); // 可以在这里添加数据处理逻辑 // 例如:数字滤波、数据存储、通信发送等 } } // 记录时间戳 uint32_t timestamp = buffer->timestamp; // 可以用于计算采样率或数据同步 } /** * @brief 将ADC原始数据转换为电压值 * @param adc_value: 32位ADC原始数据 * @retval float: 对应的电压值 */ float LTC2508_ConvertToVoltage(uint32_t adc_value) { // LTC2508是32位ADC,假设参考电压为5V const float VREF = 5.0f; const uint32_t ADC_MAX = 0xFFFFFFFF; return (float)adc_value * VREF / ADC_MAX; } /** * @brief SPI DMA传输完成中断回调函数 * @param hspi: SPI句柄 * @retval None */ void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) { // 调用LTC2508的DMA完成回调 LTC2508_DmaComplete_Callback(hspi); } /** * @brief SPI DMA接收完成中断回调函数 * @param hspi: SPI句柄 * @retval None */ void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) { // 调用LTC2508的DMA完成回调 LTC2508_DmaComplete_Callback(hspi); } /** * @brief SPI错误中断回调函数 * @param hspi: SPI句柄 * @retval None */ void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) { // 调用LTC2508的错误回调 LTC2508_ErrorCallback(hspi); } /** * @brief 获取并打印LTC2508统计信息 * @param None * @retval None */ void LTC2508_PrintStats(void) { LTC2508_StatsTypeDef stats; LTC2508_GetStats(&stats); // 可以通过UART或其他方式输出统计信息 // printf("Total samples: %lu\n", stats.total_samples); // printf("Error count: %lu\n", stats.error_count); // printf("DMA errors: %lu\n", stats.dma_error_count); // printf("Buffer overflows: %lu\n", stats.buffer_overflow_count); }