STM_ATEM/User/ltc2508_driver.c
2026-01-25 17:16:17 +08:00

108 lines
3.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "ltc2508_driver.h"
#include <string.h> // 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();
}
*/