#include "ltc2508_driver.h" #include // For memset // 全局变量定义 volatile uint16_t g_adc_data[NUM_LTC2508][LTC2508_DATA_LEN] = {0}; volatile uint8_t g_adc_data_ready_flag = 0; volatile uint8_t g_dma_complete_count = 0; // SPI 句柄指针 static SPI_HandleTypeDef *g_hspi1 = NULL; static SPI_HandleTypeDef *g_hspi2 = NULL; static SPI_HandleTypeDef *g_hspi3 = NULL; /** * @brief 初始化 LTC2508 驱动 * @param hspi1: SPI1 句柄指针 * @param hspi2: SPI2 句柄指针 * @param hspi3: SPI3 句柄指针 * @retval None */ void LTC2508_Init(SPI_HandleTypeDef *hspi1, SPI_HandleTypeDef *hspi2, SPI_HandleTypeDef *hspi3) { g_hspi1 = hspi1; g_hspi2 = hspi2; g_hspi3 = hspi3; g_adc_data_ready_flag = 0; g_dma_complete_count = 0; memset((void*)g_adc_data, 0, sizeof(g_adc_data)); // 可以在这里添加对 LTC2508 的配置,如果需要通过 SPI 发送配置字 // 例如:HAL_SPI_Transmit(g_hspi1, &config_word, 1, 100); } /** * @brief 触发三路 SPI 通过 DMA 读取数据 * @param None * @retval None */ void LTC2508_TriggerDmaRead(void) { if (g_adc_data_ready_flag == 0 && g_dma_complete_count == 0) // 确保上次数据已处理且 DMA 未在进行 { g_dma_complete_count = 0; // 重置计数 // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); // SPI2 和 SPI3 作为从机只接收 if (HAL_SPI_Receive_DMA(g_hspi2, (uint8_t*)g_adc_data[1], LTC2508_DATA_LEN) != HAL_OK) { Error_Handler(); } if (HAL_SPI_Receive_DMA(g_hspi3, (uint8_t*)g_adc_data[2], LTC2508_DATA_LEN) != HAL_OK) { Error_Handler(); } // SPI1 作为主机收发,先发一个 dummy 数据触发时钟 uint16_t dummy_tx[LTC2508_DATA_LEN] = {0}; // 可以是任意值 if (HAL_SPI_TransmitReceive_DMA(g_hspi1, (uint8_t*)dummy_tx, (uint8_t*)g_adc_data[0], LTC2508_DATA_LEN) != HAL_OK) { Error_Handler(); } } } /** * @brief SPI DMA 传输完成回调函数 * @param hspi: SPI 句柄指针 * @retval None */ void LTC2508_DmaComplete_Callback(SPI_HandleTypeDef *hspi) { if (hspi == g_hspi1 || hspi == g_hspi2 || hspi == g_hspi3) { g_dma_complete_count = NUM_LTC2508; if (g_dma_complete_count == NUM_LTC2508) { g_adc_data_ready_flag = 1; g_dma_complete_count = 0; // 为下一次读取做准备 } } } // 需要在 stm32g4xx_it.c 中正确地调用 HAL_SPI_IRQHandler // 并在 stm32g4xx_hal_spi.c 或 stm32g4xx_it.c 中添加以下回调函数的弱定义, // 如果它们还没有被定义的话: /* __weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) { LTC2508_DmaComplete_Callback(hspi); } __weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) { LTC2508_DmaComplete_Callback(hspi); } __weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) { // Handle error Error_Handler(); } */