108 lines
3.0 KiB
C
108 lines
3.0 KiB
C
#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();
|
||
}
|
||
*/
|