From 3bcc5b8927553b57fb829151e40bac6bca37a900 Mon Sep 17 00:00:00 2001 From: qiuxin Date: Thu, 29 May 2025 17:36:09 +0800 Subject: [PATCH] =?UTF-8?q?DAC8568=5FSPI=E6=9C=89=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Inc/main.h | 25 ++++-- Core/Src/freertos.c | 94 ++++++++++--------- Core/Src/gpio.c | 6 +- Core/Src/main.c | 1 + Core/Src/spi.c | 3 +- Core/Src/usart.c | 10 +-- MDK-ARM/controller_pcba.uvoptx | 28 ++++-- MDK-ARM/controller_pcba.uvprojx | 5 ++ User/driver/DAC8568.c | 96 ++++++++++++++++++++ User/driver/DAC8568.h | 62 +++++++++++++ User/driver/ad7124.c | 3 +- User/driver/dac161s997.c | 5 +- User/system/user_spi.c | 155 +++++++++++++++++++++++--------- User/system/user_spi.h | 4 +- 14 files changed, 381 insertions(+), 116 deletions(-) create mode 100644 User/driver/DAC8568.c create mode 100644 User/driver/DAC8568.h diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 2d441d6..ecb59b3 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -139,10 +139,10 @@ extern "C" #define DO_CH3_GPIO_Port GPIOD #define DO_CH1_Pin GPIO_PIN_13 #define DO_CH1_GPIO_Port GPIOD -#define DO_CH2_Pin GPIO_PIN_14 -#define DO_CH2_GPIO_Port GPIOD -#define DO_EN_Pin GPIO_PIN_15 -#define DO_EN_GPIO_Port GPIOD +// #define DO_CH2_Pin GPIO_PIN_14 +// #define DO_CH2_GPIO_Port GPIOD +// #define DO_EN_Pin GPIO_PIN_15 +// #define DO_EN_GPIO_Port GPIOD #define DI_CH1_Pin GPIO_PIN_8 #define DI_CH1_GPIO_Port GPIOC #define DI_CH2_Pin GPIO_PIN_9 @@ -157,8 +157,8 @@ extern "C" #define DI_CH4_GPIO_Port GPIOA //LCD串口引脚 -#define LCD_TX_Pin GPIO_PIN_10 -#define LCD_TX_GPIO_Port GPIOC +// #define LCD_TX_Pin GPIO_PIN_10 +// #define LCD_TX_GPIO_Port GPIOC #define LCD_RX_Pin GPIO_PIN_11 #define LCD_RX_GPIO_Port GPIOC //hart1发送引脚 @@ -168,8 +168,8 @@ extern "C" #define HART_CLK_GPIO_Port GPIOA #define HART1_RST_Pin GPIO_PIN_8 #define HART1_RST_GPIO_Port GPIOC -#define HART1_TX_Pin GPIO_PIN_12 -#define HART1_TX_GPIO_Port GPIOC +// #define HART1_TX_Pin GPIO_PIN_12 +// #define HART1_TX_GPIO_Port GPIOC #define HART_RTS_Pin GPIO_PIN_1 #define HART_RTS_GPIO_Port GPIOD #define HART1_OCD_Pin GPIO_PIN_0 @@ -197,6 +197,15 @@ extern "C" #define DAC1_MOSI_GPIO_Port GPIOB #define DAC1_MISO_Pin GPIO_PIN_4 #define DAC1_MISO_GPIO_Port GPIOB +//DAC8568引脚定义 +#define DAC8568_CS_Pin GPIO_PIN_15 +#define DAC8568_CS_GPIO_Port GPIOD +#define DAC8568_SCLK_Pin GPIO_PIN_10 +#define DAC8568_SCLK_GPIO_Port GPIOC +#define DAC8568_DIN_Pin GPIO_PIN_12 +#define DAC8568_DIN_GPIO_Port GPIOC +#define DAC8568_LD_Pin GPIO_PIN_14 +#define DAC8568_LD_GPIO_Port GPIOD #define ADC_CS_Pin GPIO_PIN_0 #define ADC_CS_GPIO_Port GPIOE diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 8a372c1..21fd991 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -44,6 +44,7 @@ #include // 添加string.h用于字符串操作 #include "ht1200m.h" #include "TCA6416.h" // 添加TCA6416头文件 +#include "DAC8568.h" // 声明外部变量 extern ad7124_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX]; @@ -76,6 +77,7 @@ osThreadId ad7124_test_taskHandle; osThreadId usart6_test_taskHandle; // 添加USART6测试任务句柄 osThreadId tca6416_taskHandle; // 添加TCA6416任务句柄 osThreadId dac161s997_test_taskHandle; // 添加DAC161S997测试任务句柄 +osThreadId dac8568_test_taskHandle; // 添加DAC8568测试任务句柄 // 添加调试变量 static volatile uint32_t uart6_dr_raw = 0; // UART数据寄存器的原始值 @@ -145,6 +147,7 @@ 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测试任务函数声明 +void start_dac8568_test_task(void const *argument); // 添加DAC8568测试任务函数声明 /* USER CODE END FunctionPrototypes */ void start_tcp_task(void const *argument); @@ -186,54 +189,15 @@ void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ - /* USER CODE END Init */ - - /* USER CODE BEGIN RTOS_MUTEX */ - /* add mutexes, ... */ - /* USER CODE END RTOS_MUTEX */ - - /* USER CODE BEGIN RTOS_SEMAPHORES */ - /* add semaphores, ... */ - /* USER CODE END RTOS_SEMAPHORES */ - - /* USER CODE BEGIN RTOS_TIMERS */ - /* start timers, add new ones, ... */ - /* USER CODE END RTOS_TIMERS */ - - /* USER CODE BEGIN RTOS_QUEUES */ - /* add queues, ... */ - /* USER CODE END RTOS_QUEUES */ - /* Create the thread(s) */ /* definition and creation of lwip_task */ osThreadDef(lwip_task, start_tcp_task, osPriorityHigh, 0, 512); lwip_taskHandle = osThreadCreate(osThread(lwip_task), NULL); - /* definition and creation of led_task */ - // osThreadDef(led_task, start_led_toggle_task, osPriorityLow, 0, 128); - // led_taskHandle = osThreadCreate(osThread(led_task), NULL); - /* definition and creation of dac_task */ - // osThreadDef(dac_task, start_dac_task, osPriorityNormal, 0, 512); - // dac_taskHandle = osThreadCreate(osThread(dac_task), NULL); osThreadDef(adc_task, start_adc_task, osPriorityBelowNormal, 0, 128); adc_taskHandle = osThreadCreate(osThread(adc_task), NULL); - /* definition and creation of adc_task */ - // osThreadDef(adc_task, start_adc_task, osPriorityBelowNormal, 0, 128); - // adc_taskHandle = osThreadCreate(osThread(adc_task), NULL); - - /* definition and creation of gpio_di_do_task */ - //osThreadDef(gpio_di_do_task, start_gpio_di_do_task, osPriorityNormal, 0, 128); - //gpio_di_do_taskHandle = osThreadCreate(osThread(gpio_di_do_task), NULL); - - /* definition and creation of ec11_task */ - // osThreadDef(ec11_task, start_ec11_task, osPriorityNormal, 0, 512); - // ec11_taskHandle = osThreadCreate(osThread(ec11_task), NULL); - - /* definition and creation of ad7124_test_task */ - // osThreadDef(ad7124_test_task, start_ad7124_test_task, osPriorityNormal, 0, 512); - // ad7124_test_taskHandle = osThreadCreate(osThread(ad7124_test_task), NULL); /* HART测试任务 */ osThreadDef(usart6_test_task, start_usart6_test_task, osPriorityNormal, 0, 128); @@ -244,12 +208,15 @@ void MX_FREERTOS_Init(void) // tca6416_taskHandle = osThreadCreate(osThread(tca6416_task), NULL); /* TCA6416测试任务 */ - 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); + // osThreadDef(dac161s997_test_task, start_dac161s997_test_task, osPriorityNormal, 0, 128); + // dac161s997_test_taskHandle = osThreadCreate(osThread(dac161s997_test_task), NULL); + + /* DAC8568测试任务 */ + osThreadDef(dac8568_test_task, start_dac8568_test_task, osPriorityLow, 0, 256); + dac8568_test_taskHandle = osThreadCreate(osThread(dac8568_test_task), NULL); + /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ /* USER CODE END RTOS_THREADS */ @@ -824,4 +791,45 @@ void start_dac161s997_test_task(void const *argument) osDelay(100); } /* USER CODE END start_dac161s997_test_task */ +} + +/* USER CODE BEGIN Header_start_dac8568_test_task */ +/** + * @brief Function implementing the dac8568_test_task thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_start_dac8568_test_task */ +void start_dac8568_test_task(void const *argument) +{ + /* USER CODE BEGIN start_dac8568_test_task */ + static float test_voltage = 0.0f; // 测试电压值 + static uint8_t channel = 0; // 当前测试通道 + static TickType_t last_update_time = 0; + TickType_t current_time; + + // 等待系统稳定 + osDelay(100); + // // 初始化DAC8568 + DAC8568_Init(); + osDelay(100); + // SPI3裸发测试 + uint8_t test_tx[4] = {0xAA, 0x55, 0xFF, 0x00}; + uint8_t test_rx[4] = {0}; + + for (;;) { + // 拉低CS + HAL_GPIO_WritePin(DAC8568_CS_GPIO_Port, DAC8568_CS_Pin, GPIO_PIN_RESET); + // 发送数据 + HAL_SPI_TransmitReceive(&hspi3, test_tx, test_rx, 4, 1000); + // 拉高CS + HAL_GPIO_WritePin(DAC8568_CS_GPIO_Port, DAC8568_CS_Pin, GPIO_PIN_SET); + + osDelay(10); + } + + + /* Infinite loop */ + + /* USER CODE END start_dac8568_test_task */ } \ No newline at end of file diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index 8c5dcf6..14afa10 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -112,7 +112,7 @@ void MX_GPIO_Init(void) HAL_GPIO_Init(ENCODE_Z_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pins : PDPin PDPin PDPin PDPin */ - GPIO_InitStruct.Pin = DO_CH4_Pin|DO_CH3_Pin|DO_CH1_Pin|DO_CH2_Pin; +// GPIO_InitStruct.Pin = DO_CH4_Pin|DO_CH3_Pin|DO_CH1_Pin|DO_CH2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; @@ -222,14 +222,14 @@ void MX_GPIO_Init(void) /* USER CODE BEGIN 2 */ void gpio_do_test(uint8_t gpio_num, GPIO_PinState state) { - HAL_GPIO_WritePin(DO_EN_GPIO_Port, DO_EN_Pin, GPIO_PIN_RESET); +// HAL_GPIO_WritePin(DO_EN_GPIO_Port, DO_EN_Pin, GPIO_PIN_RESET); switch (gpio_num) { case DO_1: HAL_GPIO_WritePin(DO_CH1_GPIO_Port, DO_CH1_Pin, state); break; case DO_2: - HAL_GPIO_WritePin(DO_CH2_GPIO_Port, DO_CH2_Pin, state); + //HAL_GPIO_WritePin(DO_CH2_GPIO_Port, DO_CH2_Pin, state); break; case DO_3: HAL_GPIO_WritePin(DO_CH3_GPIO_Port, DO_CH3_Pin, state); diff --git a/Core/Src/main.c b/Core/Src/main.c index 871d920..40409d9 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -127,6 +127,7 @@ int main(void) MX_GPIO_Init(); //MX_DMA_Init(); dac161s997_spi_init(); + dac8568_spi_init(); //MX_TIM3_Init(); //MX_SPI1_Init(); MX_USART6_UART_Init(); diff --git a/Core/Src/spi.c b/Core/Src/spi.c index bccf76a..674e53e 100644 --- a/Core/Src/spi.c +++ b/Core/Src/spi.c @@ -25,7 +25,8 @@ /* USER CODE END 0 */ SPI_HandleTypeDef hspi1; - +SPI_HandleTypeDef hspi2; +SPI_HandleTypeDef hspi3; /* SPI1 init function */ void MX_SPI1_Init(void) { diff --git a/Core/Src/usart.c b/Core/Src/usart.c index b9a5aa1..8275f49 100644 --- a/Core/Src/usart.c +++ b/Core/Src/usart.c @@ -236,7 +236,7 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) PC10 ------> UART4_TX PC11 ------> UART4_RX */ - GPIO_InitStruct.Pin = LCD_TX_Pin|LCD_RX_Pin; + //GPIO_InitStruct.Pin = LCD_TX_Pin|LCD_RX_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; @@ -301,12 +301,12 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) PC12 ------> UART5_TX PD2 ------> UART5_RX */ - GPIO_InitStruct.Pin = HART1_TX_Pin; + //GPIO_InitStruct.Pin = HART1_TX_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_AF8_UART5; - HAL_GPIO_Init(HART1_TX_GPIO_Port, &GPIO_InitStruct); + //HAL_GPIO_Init(HART1_TX_GPIO_Port, &GPIO_InitStruct); GPIO_InitStruct.Pin = HART1_RX_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; @@ -632,7 +632,7 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) PC10 ------> UART4_TX PC11 ------> UART4_RX */ - HAL_GPIO_DeInit(GPIOC, LCD_TX_Pin|LCD_RX_Pin); + //HAL_GPIO_DeInit(GPIOC, LCD_TX_Pin|LCD_RX_Pin); /* UART4 DMA DeInit */ HAL_DMA_DeInit(uartHandle->hdmarx); @@ -656,7 +656,7 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) PC12 ------> UART5_TX PD2 ------> UART5_RX */ - HAL_GPIO_DeInit(HART1_TX_GPIO_Port, HART1_TX_Pin); + //HAL_GPIO_DeInit(HART1_TX_GPIO_Port, HART1_TX_Pin); HAL_GPIO_DeInit(HART1_RX_GPIO_Port, HART1_RX_Pin); diff --git a/MDK-ARM/controller_pcba.uvoptx b/MDK-ARM/controller_pcba.uvoptx index 2ae31ec..8b02664 100644 --- a/MDK-ARM/controller_pcba.uvoptx +++ b/MDK-ARM/controller_pcba.uvoptx @@ -1973,6 +1973,18 @@ 0 0 + + 11 + 133 + 1 + 0 + 0 + 0 + ..\User\driver\DAC8568.c + DAC8568.c + 0 + 0 + @@ -1983,7 +1995,7 @@ 0 12 - 133 + 134 1 0 0 @@ -1995,7 +2007,7 @@ 12 - 134 + 135 1 0 0 @@ -2007,7 +2019,7 @@ 12 - 135 + 136 1 0 0 @@ -2019,7 +2031,7 @@ 12 - 136 + 137 1 0 0 @@ -2031,7 +2043,7 @@ 12 - 137 + 138 1 0 0 @@ -2051,7 +2063,7 @@ 0 13 - 138 + 139 1 0 0 @@ -2063,7 +2075,7 @@ 13 - 139 + 140 1 0 0 @@ -2075,7 +2087,7 @@ 13 - 140 + 141 1 0 0 diff --git a/MDK-ARM/controller_pcba.uvprojx b/MDK-ARM/controller_pcba.uvprojx index cf98f24..9d4f4f2 100644 --- a/MDK-ARM/controller_pcba.uvprojx +++ b/MDK-ARM/controller_pcba.uvprojx @@ -1093,6 +1093,11 @@ 1 ..\User\application\src\TCA6416.c + + DAC8568.c + 1 + ..\User\driver\DAC8568.c + diff --git a/User/driver/DAC8568.c b/User/driver/DAC8568.c new file mode 100644 index 0000000..f0cee06 --- /dev/null +++ b/User/driver/DAC8568.c @@ -0,0 +1,96 @@ +#include "DAC8568.h" +#include "stm32f4xx_hal.h" // 添加HAL库头文件 +#include "main.h" +#include "user_spi.h" +#include // 添加标准整型定义 + +#define DAC_MAX_VALUE 65535 + +/** + * @brief DAC8568通用写函数 + * @param cmd 命令类型:0-初始化内部参考电压,1-写入并更新DAC值 + * @param channel 通道号(0-7),仅在cmd=1时有效 + * @param value DAC值(0-65535)或命令值,根据cmd决定 + * @return void + */ +void DAC8568_Write(uint8_t cmd, uint8_t channel, uint32_t value) +{ + uint8_t tx_data[4]; + uint8_t rx_data[4] = {0}; // Initialize receive buffer + uint32_t send_data; + + // 根据命令类型准备发送数据 + if(cmd == 0) // 初始化内部参考电压 + { + send_data = DAC8568_EN_INTER_REF_STATIC; + } + else // 写入并更新DAC值 + { + // 输入参数合法性检查 + if(channel > 7) + { + channel = 7; + } + if(value > DAC_MAX_VALUE) + { + value = DAC_MAX_VALUE; + } + + send_data = DAC8568_WRITE_UPDATE_SEL_DAC; + send_data |= (channel << 20); + send_data |= (value << 4); + } + + // 准备发送数据 + tx_data[0] = (uint8_t)(send_data >> 24); + tx_data[1] = (uint8_t)(send_data >> 16); + tx_data[2] = (uint8_t)(send_data >> 8); + tx_data[3] = (uint8_t)(send_data & 0xFF); + + // 开始SPI传输 + DAC8568_CS_L; // 拉低CS,使能SPI接口 + extern SPI_HandleTypeDef hspi3; // 声明外部SPI句柄 + spi_transmit_receive(&hspi3, tx_data, rx_data, 4); // 使用hspi3发送4字节数据 + DAC8568_CS_H; // 拉高CS,禁止SPI接口 +} + +/** + * @brief 初始化DAC8568芯片 + * @return void + */ +void DAC8568_Init(void) +{ + //初始化GPIO和SPI + dac8568_spi_init(); + // 将LDAC置低,DAC8568处于同步模式 + DAC8568_LD_L; + // 初始化内部参考电压 + DAC8568_Write(0, 0, 0); + +} + +/** + * @brief 设置DAC8568指定通道的电压值 + * @param mCh 通道号(0-7) + * @param mVol 电压值(0-2.5V) + * @return void + */ +void dac8568_set_voltage(unsigned char mCh, float mVol) +{ + float mDatafloat; + uint16_t mDtashort; + + // 将电压值转换为DAC值 + mDatafloat = mVol * (65536/(5*1.91)); + mDtashort = (uint16_t)mDatafloat; + mDtashort &= 0xffff; + + // 限制DAC值范围 + if(mDtashort > 65535) + mDtashort = 65535; + + // 写入并更新DAC值 + DAC8568_Write(1, mCh, mDtashort); +} + + diff --git a/User/driver/DAC8568.h b/User/driver/DAC8568.h new file mode 100644 index 0000000..d297f02 --- /dev/null +++ b/User/driver/DAC8568.h @@ -0,0 +1,62 @@ +#include "stm32f4xx_hal.h" // 添加HAL库头文件 +#include "main.h" + +/************************DA8568寄存器SR的值*****************************/ + +#define PrefixControlbyte 0x03//前缀控制字节 +#define AddressOutA 0x0//通道A地址 +#define AddressOutB 0x1//通道B地址 +#define AddressOutC 0x2//通道C地址 +#define AddressOutD 0x3//通道D地址 +#define AddressOutE 0x4//通道E地址 +#define AddressOutF 0x5//通道F地址 +#define AddressOutG 0x6//通道G地址 +#define AddressOutH 0x7//通道H地址 +#define Featurebyte 0x0//特征字节 + +/*****DA8568寄存器SR的值-结尾*************************************/ + +/****************************DAC8568命令************************/ +#define SETUP_INTERNAL_REGISTER 0 +#define POWER_UP 1 +#define RESET 2 +/*****DAC8568命令-结尾*******************************************/ + +//---------------------------------------- Pin definition + +//---------------------------------------- Command definition +#define DAC8568_EN_INTER_REF_STATIC 0x08000001 +#define DAC8568_WRITE_UPDATE_SEL_DAC 0x03000000 + +//---------------------------------------- Reference Voltage +#define DAC8568_REF_VOLTAGE 2.5 + +void DAC8568_Init(void); +void DAC8568_Write_Update_Sel_DAC(uint32_t ChannelNum, uint32_t DACValue); + + +// #define DAC8568_SYNC_H GPIO_SetBits(GPIOA,GPIO_Pin_15) +// #define DAC8568_SYNC_L GPIO_ResetBits(GPIOA,GPIO_Pin_15) +// #define DAC8568_SCLK_H GPIO_SetBits(GPIOC,GPIO_Pin_10) +// #define DAC8568_SCLK_L GPIO_ResetBits(GPIOC,GPIO_Pin_10) +// #define DAC8568_DIN_H GPIO_SetBits(GPIOC,GPIO_Pin_12) +// #define DAC8568_DIN_L GPIO_ResetBits(GPIOC,GPIO_Pin_12) +//引脚拉高拉低 +#define DAC8568_CS_H HAL_GPIO_WritePin(DAC8568_CS_GPIO_Port, DAC8568_CS_Pin, GPIO_PIN_SET) +#define DAC8568_CS_L HAL_GPIO_WritePin(DAC8568_CS_GPIO_Port, DAC8568_CS_Pin, GPIO_PIN_RESET) +#define DAC8568_SCLK_H HAL_GPIO_WritePin(DAC8568_SCLK_GPIO_Port, DAC8568_SCLK_Pin, GPIO_PIN_SET) +#define DAC8568_SCLK_L HAL_GPIO_WritePin(DAC8568_SCLK_GPIO_Port, DAC8568_SCLK_Pin, GPIO_PIN_RESET) +#define DAC8568_DIN_H HAL_GPIO_WritePin(DAC8568_DIN_GPIO_Port, DAC8568_DIN_Pin, GPIO_PIN_SET) +#define DAC8568_DIN_L HAL_GPIO_WritePin(DAC8568_DIN_GPIO_Port, DAC8568_DIN_Pin, GPIO_PIN_RESET) +#define DAC8568_LD_H HAL_GPIO_WritePin(DAC8568_LD_GPIO_Port, DAC8568_LD_Pin, GPIO_PIN_SET) +#define DAC8568_LD_L HAL_GPIO_WritePin(DAC8568_LD_GPIO_Port, DAC8568_LD_Pin, GPIO_PIN_RESET) + +void dac8568_init(void); +void dac8568_set_voltage(unsigned char mCh,float mVol); +void SPI_SendByte(uint8_t m); +void DAC8568_Write_passageway(uint8_t Addressbyte, uint16_t Datashort); +void DAC8568_Write_Command(uint8_t command); +void dac8568_set_voltage(unsigned char mCh, float mVol); +void dac8568_spi_init(void); +void DAC8568_Init(void); +void dac8568_output_ch0_1v5(void); \ No newline at end of file diff --git a/User/driver/ad7124.c b/User/driver/ad7124.c index d68f4ba..219d0ad 100644 --- a/User/driver/ad7124.c +++ b/User/driver/ad7124.c @@ -415,9 +415,10 @@ int32_t ad7124_setup(void) int32_t ad7124_read_write_spi(uint8_t *buff, uint8_t length) { int32_t ret; + uint8_t rx_buff[8] = {0}; // Add receive buffer board_spi_init(AD7124); // 初始化SPI,因为DAC161的SPI要和AD7124共用,并且时序不一样,所以要先初始化SPI接口。 board_spi_cs_on(AD7124); - ret = spi_transmit_receive(&hspi1, buff, length); + ret = spi_transmit_receive(&hspi1, buff, rx_buff, length); board_spi_cs_off(AD7124); return ret; } diff --git a/User/driver/dac161s997.c b/User/driver/dac161s997.c index 4d84978..3c18d45 100644 --- a/User/driver/dac161s997.c +++ b/User/driver/dac161s997.c @@ -35,11 +35,12 @@ volatile uint32_t dac161s997_spi_retry_count = 0; // 添加SPI通信辅助函数 static int32_t dac161s997_spi_transaction(uint8_t *data, uint8_t bytes, uint32_t timeout) { + uint8_t rx_data[4] = {0}; // Add receive buffer // 拉低CS HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_RESET); osDelay(5); // SPI传输 - int32_t status = spi_transmit_receive(&hspi1, data, bytes); + int32_t status = spi_transmit_receive(&hspi1, data, rx_data, bytes); // 拉高CS HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_SET); @@ -199,7 +200,7 @@ void dac161s997_output(dac_type_t dac_type, float current) data_buffer[2] = dac_code; dac161s997_init(dac_type, current); HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_RESET); - spi_transmit_receive(&hspi1, data_buffer, 3); + spi_transmit_receive(&hspi1, data_buffer, data_buffer, 3); HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_SET); } diff --git a/User/system/user_spi.c b/User/system/user_spi.c index 41969c5..524cdbf 100644 --- a/User/system/user_spi.c +++ b/User/system/user_spi.c @@ -1,23 +1,58 @@ #include "user_spi.h" #include "stm32f4xx_hal.h" +#include "stm32f4xx_hal_gpio_ex.h" // GPIO复用功能定义 +#include "stm32f4xx_hal_spi.h" // SPI外设定义 +#include "stm32f4xx_hal_rcc.h" // RCC时钟定义 +#include "stm32f4xx_hal_def.h" // 基本类型定义 +#include "stm32f4xx_hal_rcc_ex.h" // RCC扩展定义 +#include "stm32f4xx_hal_gpio.h" // GPIO定义 +#include "stm32f4xx_hal_conf.h" // HAL配置 #include "main.h" #include #include -#include -#include - +#include "DAC8568.h" #include "spi.h" -// 移除对platform_support.h的依赖 -// 直接在此处定义需要的常量和函数 +// 定义基本类型 +typedef volatile uint32_t __IO; + +// 定义常量 #define SUCCESS 0 #define FAILURE -1 -// 声明mdelay函数 -static inline void mdelay(uint32_t ms) -{ - HAL_Delay(ms); -} +// 定义SPI缓冲区 +static uint8_t spi_rx_buffer[256]; // 接收缓冲区 + +// SPI句柄声明 +extern SPI_HandleTypeDef hspi1; // 在spi.c中定义 +extern SPI_HandleTypeDef hspi2; // 在main.c中定义 +extern SPI_HandleTypeDef hspi3; // 在main.c中定义 + +// 定义GPIO端口 +// #define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) +// #define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400) +// #define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00) +// #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +// #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +// #define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) + +// // 定义SPI外设 +// #define SPI2_BASE (APB1PERIPH_BASE + 0x3800) +// #define SPI2 ((SPI_TypeDef *) SPI2_BASE) + +// // 定义SPI寄存器位 +// #define SPI_CR1_MSTR_Pos 2 +// #define SPI_CR1_CPOL_Pos 1 +// #define SPI_CR1_CPHA_Pos 0 +// #define SPI_CR1_SSI_Pos 8 +// #define SPI_CR1_SSM_Pos 9 +// #define SPI_CR1_BR_Pos 3 +// #define SPI_CR1_MSTR (1 << SPI_CR1_MSTR_Pos) +// #define SPI_CR1_CPOL (1 << SPI_CR1_CPOL_Pos) +// #define SPI_CR1_CPHA (1 << SPI_CR1_CPHA_Pos) +// #define SPI_CR1_SSI (1 << SPI_CR1_SSI_Pos) +// #define SPI_CR1_SSM (1 << SPI_CR1_SSM_Pos) +// #define SPI_CR1_BR_2 (1 << (SPI_CR1_BR_Pos + 2)) /******************************************************************************/ /***************************** #defines ***************************************/ @@ -30,44 +65,19 @@ static inline void mdelay(uint32_t ms) /************************ Variable Declarations *******************************/ /******************************************************************************/ -static uint8_t spi_rx_buffer[SPI_BUFFER_SIZE] = {0}; +// SPI handle declaration +extern SPI_HandleTypeDef hspi1; // 在spi.c中定义 /******************************************************************************/ /************************ Functions Definitions *******************************/ /******************************************************************************/ - -#define SPI_BUFFER_SIZE 255 - - -// SPI handle declaration -extern SPI_HandleTypeDef hspi1; // 在spi.c中定义 -SPI_HandleTypeDef hspi2; - -// Define return values -#define SUCCESS 0 -#define FAILURE -1 - -// int32_t spi_transmit_receive(SPI_HandleTypeDef *hspi, uint8_t *data_write, uint8_t bytes_number) -// { -// // 使用 HAL_SPI_TransmitReceive 函数进行 SPI 通信 -// if (HAL_SPI_TransmitReceive(&hspi2, data_write, (uint8_t *)spi_rx_buffer, bytes_number, 1000) != HAL_OK) -// { -// // 如果通信失败,返回 FAILURE -// return FAILURE; -// } -// /* 将 SPI 接收缓冲区复制到提供的数据缓冲区,以便返回给调用者 */ -// memcpy(data_write, spi_rx_buffer, bytes_number); -// // 返回 SUCCESS 表示通信成功 -// return SUCCESS; -// } -int32_t spi_transmit_receive(SPI_HandleTypeDef *hspi, uint8_t *data_write, uint8_t bytes_number) +int32_t spi_transmit_receive(SPI_HandleTypeDef *hspi, uint8_t *data_write, uint8_t *data_read, uint8_t bytes_number) { - if (HAL_SPI_TransmitReceive(hspi, data_write, (uint8_t *)spi_rx_buffer, bytes_number, 1000) != HAL_OK) + if (HAL_SPI_TransmitReceive(hspi, data_write, data_read, bytes_number, 1000) != HAL_OK) { return FAILURE; } - memcpy(data_write, spi_rx_buffer, bytes_number); return SUCCESS; } @@ -105,9 +115,7 @@ void ad7124_spi_init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - // Ensure CS is high before SPI initialization - - // Configure SPI2 with the working configuration + // Configure SPI2 hspi2.Instance = SPI2; hspi2.Init.Mode = SPI_MODE_MASTER; hspi2.Init.Direction = SPI_DIRECTION_2LINES; @@ -115,7 +123,7 @@ void ad7124_spi_init(void) hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH; // CPOL = 1 hspi2.Init.CLKPhase = SPI_PHASE_2EDGE; // CPHA = 1 hspi2.Init.NSS = SPI_NSS_SOFT; - hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; + hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi2.Init.TIMode = SPI_TIMODE_DISABLE; hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; @@ -133,6 +141,65 @@ void ad7124_spi_init(void) HAL_Delay(1); } +void dac8568_spi_init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + // 使能SPI3和GPIO时钟 + __HAL_RCC_SPI3_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + + // 配置SPI3引脚 (PC10-SCK, PC12-MOSI) + GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + // 配置CS引脚 (PD15) + GPIO_InitStruct.Pin = DAC8568_CS_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; // 添加上拉 + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + // 配置LDAC引脚 (PD14) + GPIO_InitStruct.Pin = DAC8568_LD_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; // 添加上拉 + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + // 配置SPI3 + hspi3.Instance = SPI3; + hspi3.Init.Mode = SPI_MODE_MASTER; + hspi3.Init.Direction = SPI_DIRECTION_2LINES; + hspi3.Init.DataSize = SPI_DATASIZE_8BIT; + hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL = 0 + hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA = 0 + hspi3.Init.NSS = SPI_NSS_SOFT; + hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; // 提高SPI速度 + hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi3.Init.TIMode = SPI_TIMODE_DISABLE; + hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi3.Init.CRCPolynomial = 10; + + if (HAL_SPI_Init(&hspi3) != HAL_OK) + { + Error_Handler(); + } + + // 初始化CS和LDAC引脚状态 + HAL_GPIO_WritePin(DAC8568_CS_GPIO_Port, DAC8568_CS_Pin, GPIO_PIN_SET); // CS初始为高电平 + HAL_GPIO_WritePin(DAC8568_LD_GPIO_Port, DAC8568_LD_Pin, GPIO_PIN_RESET); // LDAC初始为低电平 + + // 等待一段时间确保DAC8568稳定 + HAL_Delay(10); +} + void dac161s997_spi_init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; @@ -272,7 +339,7 @@ void board_spi_cs_off(chip_type_e chip_type) int32_t ad7124_spi_transmit_receive(uint8_t *data, uint8_t bytes) { ad7124_cs_on(); - int32_t result = spi_transmit_receive(&hspi2, data, bytes); + int32_t result = spi_transmit_receive(&hspi2, data, spi_rx_buffer, bytes); ad7124_cs_off(); return result; } diff --git a/User/system/user_spi.h b/User/system/user_spi.h index 1b997bc..597b76d 100644 --- a/User/system/user_spi.h +++ b/User/system/user_spi.h @@ -12,9 +12,10 @@ typedef enum DAC8568 = 2, } chip_type_e; // 芯片类型 -extern int32_t spi_transmit_receive(SPI_HandleTypeDef *hspi, uint8_t *data_write, uint8_t bytes_number); +extern int32_t spi_transmit_receive(SPI_HandleTypeDef *hspi, uint8_t *data_write, uint8_t *data_read, uint8_t bytes_number); extern SPI_HandleTypeDef hspi1; extern SPI_HandleTypeDef hspi2; +extern SPI_HandleTypeDef hspi3; extern void board_spi_init(chip_type_e chip_type); extern void board_spi_cs_on(chip_type_e chip_type); extern void board_spi_cs_off(chip_type_e chip_type); @@ -22,6 +23,7 @@ extern void board_spi_cs_off(chip_type_e chip_type); void dac161s997_cs_on(uint8_t dac_num); void dac161s997_cs_off(uint8_t dac_num); void dac161s997_spi_init(void); +void dac8568_spi_init(void); void ad7124_cs_off(void); void ad7124_cs_on(void);