From 5656a65d401299dba97401fcf7d744c4b8394828 Mon Sep 17 00:00:00 2001 From: qiuxin Date: Tue, 27 May 2025 16:51:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EDAC161=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Inc/main.h | 11 +++-- Core/Src/freertos.c | 82 +++++++++++++++++++++--------- User/driver/dac161s997.c | 38 ++++++++------ User/driver/dac161s997.h | 3 ++ User/system/user_spi.c | 104 ++++++++++++++++++++++----------------- User/system/user_spi.h | 5 +- 6 files changed, 154 insertions(+), 89 deletions(-) diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 14f8dc8..f52de2b 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -177,7 +177,6 @@ extern "C" #define HART1_OCD_EXTI_IRQn EXTI1_IRQn #define HART1_RX_Pin GPIO_PIN_2 #define HART1_RX_GPIO_Port GPIOD - #define HART2_OCD_Pin GPIO_PIN_3 #define HART2_OCD_GPIO_Port GPIOD #define HART2_OCD_EXTI_IRQn EXTI3_IRQn @@ -189,10 +188,16 @@ extern "C" #define HART2_RX_GPIO_Port GPIOD #define HART2_RST_Pin GPIO_PIN_7 #define HART2_RST_GPIO_Port GPIOD + #define DAC1_CS_Pin GPIO_PIN_6 #define DAC1_CS_GPIO_Port GPIOB -#define DAC2_CS_Pin GPIO_PIN_7 -#define DAC2_CS_GPIO_Port GPIOB +#define DAC1_SCK_Pin GPIO_PIN_3 +#define DAC1_SCK_GPIO_Port GPIOB +#define DAC1_MOSI_Pin GPIO_PIN_5 +#define DAC1_MOSI_GPIO_Port GPIOB +#define DAC1_MISO_Pin GPIO_PIN_4 +#define DAC1_MISO_GPIO_Port GPIOB + #define ADC_CS_Pin GPIO_PIN_0 #define ADC_CS_GPIO_Port GPIOE /* PCBA测试盒AD7124同步信号引脚定义 */ diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 674e2fc..d76378e 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -75,6 +75,7 @@ osThreadId ec11_taskHandle; osThreadId ad7124_test_taskHandle; osThreadId usart6_test_taskHandle; // 添加USART6测试任务句柄 osThreadId tca6416_taskHandle; // 添加TCA6416任务句柄 +osThreadId dac161s997_test_taskHandle; // 添加DAC161S997测试任务句柄 // 添加调试变量 static volatile uint32_t uart6_dr_raw = 0; // UART数据寄存器的原始值 @@ -143,6 +144,7 @@ extern void tcp_abort(struct tcp_pcb *pcb); void start_usart6_test_task(void const *argument); // 添加USART6测试任务函数声明 void start_tca6416_task(void const *argument); // 添加TCA6416任务函数声明 void test_tca6416_task(void const *argument); // 添加TCA6416测试任务函数声明 +void start_dac161s997_test_task(void const *argument); // 添加DAC161S997测试任务函数声明 /* USER CODE END FunctionPrototypes */ void start_tcp_task(void const *argument); @@ -244,6 +246,10 @@ void MX_FREERTOS_Init(void) osThreadDef(tca6416_task, test_tca6416_task, osPriorityNormal, 0, 128); tca6416_taskHandle = osThreadCreate(osThread(tca6416_task), NULL); + + /* DAC161S997测试任务 */ + osThreadDef(dac161s997_test_task, start_dac161s997_test_task, osPriorityNormal, 0, 128); + dac161s997_test_taskHandle = osThreadCreate(osThread(dac161s997_test_task), NULL); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ /* USER CODE END RTOS_THREADS */ @@ -343,29 +349,6 @@ void start_led_toggle_task(void const *argument) /* USER CODE END start_led_toggle_task */ } -/* USER CODE BEGIN Header_start_dac_task */ -/** - * @brief Function implementing the dac_task thread. - * @param argument: Not used - * @retval None - */ -/* USER CODE END Header_start_dac_task */ -void start_dac_task(void const *argument) -{ - /* USER CODE BEGIN start_dac_task */ - dac161s997_init(); - /* Infinite loop */ - for (;;) - { - osThreadSuspend(adc_taskHandle); // 暂停ADC任务,防止DAC采集时产生干????????,因为ADC和DAC采用的是同一路SPI,但是时序不???????? - dac161s997_output(DAC161S997_1, current_buff[0]); - dac161s997_output(DAC161S997_2, current_buff[1]); - osThreadResume(adc_taskHandle); - vTaskDelay(100); - } - /* USER CODE END start_dac_task */ -} - /* USER CODE BEGIN Header_start_adc_task */ /** * @brief ADC任务函数实现 @@ -788,4 +771,57 @@ void test_tca6416_task(void const *argument) osDelay(800); } /* USER CODE END test_tca6416_task */ +} + +/* USER CODE BEGIN Header_start_dac161s997_test_task */ +/** + * @brief Function implementing the dac161s997_test_task thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_start_dac161s997_test_task */ +void start_dac161s997_test_task(void const *argument) +{ + /* USER CODE BEGIN start_dac161s997_test_task */ + float test_current = 4.0f; // 起始电流4mA + float current_step = 0.5f; // 每次增加0.5mA + uint8_t direction = 1; // 1表示递增,0表示递减 + + // 等待系统稳定 + osDelay(1000); + + // 初始化DAC161S997 + dac161s997_init(); + + /* Infinite loop */ + for(;;) + { + // 只输出到DAC1(因为只有一块DAC161S997) + dac161s997_output(DAC161S997, test_current); + osDelay(200); + + // 更新电流值 + if (direction == 1) + { + test_current += current_step; + if (test_current >= 20.0f) // 达到20mA时开始递减 + { + test_current = 20.0f; + direction = 0; + } + } + else + { + test_current -= current_step; + if (test_current <= 4.0f) // 达到4mA时开始递增 + { + test_current = 4.0f; + direction = 1; + } + } + + // 每个周期延时1秒 + osDelay(800); + } + /* USER CODE END start_dac161s997_test_task */ } \ No newline at end of file diff --git a/User/driver/dac161s997.c b/User/driver/dac161s997.c index 645eed4..54956a0 100644 --- a/User/driver/dac161s997.c +++ b/User/driver/dac161s997.c @@ -10,16 +10,16 @@ * @param reg 要写入的寄存器地址 * @param data 要写入的数据,16位 */ -void dac161s997_write_reg(chip_type_e dac_num, uint8_t reg, uint16_t data) +void dac161s997_write_reg(uint8_t dac_num, uint8_t reg, uint16_t data) { uint8_t data_buffer[3] = {0, 0, 0}; data_buffer[0] = reg; data_buffer[1] = data >> 8; data_buffer[2] = data; - board_spi_init(dac_num); // 初始化SPI,因为ADC芯片也用SPI1,但是时序不同 - board_spi_cs_on(dac_num); - spi_transmit_receive(&hspi1, data_buffer, 3); - board_spi_cs_off(dac_num); + + HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_RESET); // CS拉低 + HAL_SPI_Transmit(&hspi1, data_buffer, 3, 1000); + HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_SET); // CS拉高 } /** @@ -27,11 +27,19 @@ void dac161s997_write_reg(chip_type_e dac_num, uint8_t reg, uint16_t data) */ void dac161s997_init(void) { - dac161s997_write_reg(DAC161S997_1, DAC161S997_ERR_LOW_REG, 0xFFFF); - dac161s997_write_reg(DAC161S997_1, DAC161S997_ERR_CONFIG_REG, 0x070E); - - dac161s997_write_reg(DAC161S997_2, DAC161S997_ERR_LOW_REG, 0xFFFF); - dac161s997_write_reg(DAC161S997_2, DAC161S997_ERR_CONFIG_REG, 0x070E); + // 初始化CS引脚 + GPIO_InitTypeDef GPIO_InitStruct = {0}; + __HAL_RCC_GPIOB_CLK_ENABLE(); + GPIO_InitStruct.Pin = DAC1_CS_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + HAL_GPIO_Init(DAC1_CS_GPIO_Port, &GPIO_InitStruct); + HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_SET); + + // 初始化DAC161S997芯片寄存器 + dac161s997_write_reg(1, DAC161S997_ERR_LOW_REG, 0xFFFF); + dac161s997_write_reg(1, DAC161S997_ERR_CONFIG_REG, 0x070E); } /** @@ -42,15 +50,15 @@ void dac161s997_init(void) * @param dac_num DAC芯片类型 * @param current 需要设置的电流值,单位:毫安 */ -void dac161s997_output(chip_type_e dac_num, float current) +void dac161s997_output(uint8_t dac_num, float current) { uint32_t dac_code = (uint32_t)((current * 65535.0f) / 24.0f); uint8_t data_buffer[3] = {0, 0, 0}; data_buffer[0] = DAC161S997_DACCODE_REG; data_buffer[1] = dac_code >> 8; data_buffer[2] = dac_code; - board_spi_init(dac_num); // 初始化SPI,因为ADC芯片也用SPI1,但是时序不同 - board_spi_cs_on(dac_num); - spi_transmit_receive(&hspi1, data_buffer, 3); - board_spi_cs_off(dac_num); + + HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_RESET); // CS拉低 + HAL_SPI_Transmit(&hspi1, data_buffer, 3, 1000); + HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_SET); // CS拉高 } diff --git a/User/driver/dac161s997.h b/User/driver/dac161s997.h index 6947e5a..5333fac 100644 --- a/User/driver/dac161s997.h +++ b/User/driver/dac161s997.h @@ -25,4 +25,7 @@ uint16_t dac161s997_read(uint8_t reg); extern void dac161s997_init(void); extern void dac161s997_output(uint8_t dac_num, float current); +// 定义DAC芯片编号(只有一块DAC161S997) +#define DAC161S997 1 + #endif diff --git a/User/system/user_spi.c b/User/system/user_spi.c index 45990e8..517be1f 100644 --- a/User/system/user_spi.c +++ b/User/system/user_spi.c @@ -41,6 +41,7 @@ static uint8_t spi_rx_buffer[SPI_BUFFER_SIZE] = {0}; // SPI handle declaration +extern SPI_HandleTypeDef hspi1; // 在spi.c中定义 SPI_HandleTypeDef hspi2; // Define return values @@ -125,25 +126,51 @@ void ad7124_spi_init(void) void dac161s997_spi_init(void) { - /* Enable SPI2 clock */ - __HAL_RCC_SPI2_CLK_ENABLE(); - - hspi2.Instance = SPI2; - hspi2.Init.Mode = SPI_MODE_MASTER; - hspi2.Init.Direction = SPI_DIRECTION_2LINES; - hspi2.Init.DataSize = SPI_DATASIZE_8BIT; - hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi2.Init.NSS = SPI_NSS_SOFT; - hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; - hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi2.Init.TIMode = SPI_TIMODE_DISABLE; - hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi2.Init.CRCPolynomial = 10; - if (HAL_SPI_Init(&hspi2) != HAL_OK) - { - Error_Handler(); - } + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + // Enable clocks + __HAL_RCC_SPI1_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + // Configure SPI1 pins for DAC161S997 + // SCK (PB3), MISO (PB4), MOSI (PB5) + GPIO_InitStruct.Pin = DAC1_SCK_Pin | DAC1_MISO_Pin | DAC1_MOSI_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; // SPI1 alternate function + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + // CS (PB6) - Configure as output + GPIO_InitStruct.Pin = DAC1_CS_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + HAL_GPIO_Init(DAC1_CS_GPIO_Port, &GPIO_InitStruct); + + // Ensure CS is high initially + HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_SET); + + // Configure SPI1 for DAC161S997 + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_8BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL = 0 + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA = 0 + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; // 适中的时钟频率 + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 10; + + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { + Error_Handler(); + } + + HAL_Delay(1); } void ad7124_cs_on(void) @@ -164,16 +191,14 @@ void dac161s997_cs_on(chip_type_e dac_num) { switch (dac_num) { - case DAC161S997_1: + case DAC161S997: HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_RESET); - HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC2_CS_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_SET); break; - case DAC161S997_2: - HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC2_CS_Pin, GPIO_PIN_RESET); - HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_SET); + case DAC8568: + //HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_RESET); break; + + default: break; } @@ -182,16 +207,10 @@ void dac161s997_cs_off(uint8_t dac_num) { switch (dac_num) { - case DAC161S997_1: + case DAC161S997: HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC2_CS_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_SET); - break; - case DAC161S997_2: - HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC2_CS_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_SET); break; + case DAC8568: default: break; } @@ -202,8 +221,7 @@ void board_spi_init(chip_type_e chip_type) case AD7124: ad7124_spi_init(); break; - case DAC161S997_1: - case DAC161S997_2: + case DAC161S997: dac161s997_spi_init(); break; default: @@ -218,11 +236,8 @@ void board_spi_cs_on(chip_type_e chip_type) HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_RESET); // AD7124_CS1打开 HAL_Delay(1); break; - case DAC161S997_1: - dac161s997_cs_on(DAC161S997_1); - break; - case DAC161S997_2: - dac161s997_cs_on(DAC161S997_2); + case DAC161S997: + dac161s997_cs_on(DAC161S997); break; default: break; @@ -236,11 +251,8 @@ void board_spi_cs_off(chip_type_e chip_type) HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_SET); // AD7124_CS1关闭 HAL_Delay(1); break; - case DAC161S997_1: - dac161s997_cs_off(DAC161S997_1); - break; - case DAC161S997_2: - dac161s997_cs_off(DAC161S997_2); + case DAC161S997: + dac161s997_cs_off(DAC161S997); break; default: break; diff --git a/User/system/user_spi.h b/User/system/user_spi.h index 82505e4..1b997bc 100644 --- a/User/system/user_spi.h +++ b/User/system/user_spi.h @@ -8,11 +8,12 @@ typedef enum { AD7124 = 0, - DAC161S997_1 = 1, - DAC161S997_2 = 2, + DAC161S997 = 1, + DAC8568 = 2, } chip_type_e; // 芯片类型 extern int32_t spi_transmit_receive(SPI_HandleTypeDef *hspi, uint8_t *data_write, uint8_t bytes_number); +extern SPI_HandleTypeDef hspi1; extern SPI_HandleTypeDef hspi2; extern void board_spi_init(chip_type_e chip_type); extern void board_spi_cs_on(chip_type_e chip_type);