From 250abb4bdaad7b4d9bb961c1c05992e9f3e2cf5e Mon Sep 17 00:00:00 2001 From: qiuxin Date: Wed, 21 May 2025 20:32:02 +0800 Subject: [PATCH] =?UTF-8?q?AD7124=E5=BC=80=E5=8F=91=E5=AE=8C=E6=88=90?= =?UTF-8?q?=EF=BC=8C16=E9=80=9A=E9=81=93=E9=83=BD=E5=8F=AF=E9=87=87?= =?UTF-8?q?=E9=9B=86=E6=95=B0=E6=8D=AE=E5=B9=B6=E5=8F=91=E9=80=81=E5=88=B0?= =?UTF-8?q?=E4=B8=8A=E4=BD=8D=E6=9C=BA=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Inc/spi.h | 2 + Core/Src/freertos.c | 36 ++- Core/Src/gpio.c | 7 + Core/Src/main.c | 2 +- MDK-ARM/controller_pcba.uvoptx | 92 ++----- MDK-ARM/controller_pcba.uvprojx | 5 + User/application/src/communication_protocol.c | 2 +- User/application/src/tcpserverc.c | 20 +- User/driver/ad7124.c | 167 +++++-------- User/driver/ad7124.h | 40 +-- User/driver/delay.c | 43 ++++ User/driver/delay.h | 12 + User/driver/error.h | 13 + User/driver/platform_support.h | 24 ++ User/system/user_spi.c | 228 ++++++++++++------ 15 files changed, 411 insertions(+), 282 deletions(-) create mode 100644 User/driver/delay.c create mode 100644 User/driver/delay.h create mode 100644 User/driver/error.h create mode 100644 User/driver/platform_support.h diff --git a/Core/Inc/spi.h b/Core/Inc/spi.h index 0bd89bb..d777bf2 100644 --- a/Core/Inc/spi.h +++ b/Core/Inc/spi.h @@ -33,12 +33,14 @@ extern "C" { /* USER CODE END Includes */ extern SPI_HandleTypeDef hspi1; +extern SPI_HandleTypeDef hspi2; /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ void MX_SPI1_Init(void); +void MX_SPI2_Init(void); /* USER CODE BEGIN Prototypes */ diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 0ea36a6..0e7c59f 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -94,6 +94,7 @@ void start_ec11_task(void const *argument); void start_ad7124_test_task(void const *argument); void ad7124_multi_channel_init(uint8_t sample_rate); void start_adc_task(void const *argument); +void test_cs_pin(void); extern void MX_LWIP_Init(void); void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ @@ -296,8 +297,8 @@ void start_dac_task(void const *argument) /* USER CODE BEGIN Header_start_adc_task */ /** - * @brief Function implementing the adc_task thread. - * @param argument: Not used + * @brief ADC任务函数实现 + * @param argument: 未使用 * @retval None */ /* USER CODE END Header_start_adc_task */ @@ -308,15 +309,14 @@ void start_adc_task(void const *argument) /* Infinite loop */ for (;;) { - //osThreadSuspend(dac_taskHandle); // 暂停DAC任务,防止ADC采集时产生干????????,因为ADC和DAC采用的是同一路SPI,但是时序不???????? + uint8_t ch = 0; - for (ch = AI_IN0_ADC; ch < AD7124_CHANNEL_EN_MAX; ch++) + for (ch = AD7124_AIN0; ch < AD7124_CHANNEL_EN_MAX; ch++) { ad7124_get_analog(ch); } - //communication_reset_hart(); - //osThreadResume(dac_taskHandle); - vTaskDelay(100); + + vTaskDelay(10); } /* USER CODE END start_adc_task */ } @@ -523,3 +523,25 @@ extern int32_t g_ad7124_id; // /* USER CODE END start_adc_task */ // } /* USER CODE END Application */ +/** + * @brief 测试CS引脚的功能 + * + * 这个函数将不断地尝试拉低和拉高CS引脚,并读取其状态。 + * 它主要用于测试硬件连接和引脚操作的正确性。 + * + * @return 无返回值 + */ +void test_cs_pin(void) +{ + while (1) { + ad7124_cs_on(); // 尝试拉低 + GPIO_PinState state = HAL_GPIO_ReadPin(SPI2_CS_GPIO_Port, SPI2_CS_Pin); + // 打印或观察state值,应该是GPIO_PIN_RESET + HAL_Delay(100); + + ad7124_cs_off(); // 尝试拉高 + state = HAL_GPIO_ReadPin(SPI2_CS_GPIO_Port, SPI2_CS_Pin); + // 打印或观察state值,应该是GPIO_PIN_SET + HAL_Delay(100); + } +} diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index fca96a8..70eb43a 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -149,6 +149,13 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(SPI2_CS_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_SET); // 初始状态不选中 + // CS (PD11) - 配置为输出 + GPIO_InitStruct.Pin = SPI2_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(SPI2_CS2_GPIO_Port, &GPIO_InitStruct); + HAL_GPIO_WritePin(SPI2_CS2_GPIO_Port, SPI2_CS2_Pin, GPIO_PIN_SET); // 初始状态不选中 /*Configure GPIO pins : PCPin PCPin */ GPIO_InitStruct.Pin = DI_CH1_Pin|DI_CH2_Pin; diff --git a/Core/Src/main.c b/Core/Src/main.c index 1d7a437..a32341e 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -137,7 +137,7 @@ int main(void) MX_USART1_UART_Init(); MX_TIM8_Init(); /* USER CODE BEGIN 2 */ - ad7124_spi_init(); //初始化AD7124芯片的SPI2通讯口 + //board_spi_init(AD7124); // Initialize SPI2 for AD7124 using the unified initialization function /*DMA INIT*/ // start HAL_UARTEx_ReceiveToIdle_DMA(&huart4, lcd_uart4.rx_data_temp, ARRAY_LEN(lcd_uart4.rx_data_temp)); diff --git a/MDK-ARM/controller_pcba.uvoptx b/MDK-ARM/controller_pcba.uvoptx index ca988e4..34e7eb9 100644 --- a/MDK-ARM/controller_pcba.uvoptx +++ b/MDK-ARM/controller_pcba.uvoptx @@ -148,24 +148,7 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - - - 0 - 0 - 401 - 1 -
134243228
- 0 - 0 - 0 - 0 - 0 - 1 - ..\User\driver\ad7124.c - - \\semi_finished_product_testing\../User/driver/ad7124.c\401 -
-
+ 0 @@ -190,22 +173,22 @@ 4 1 - wr_buf[0] + FINESH_ID 5 1 - FINESH_ID + ret 6 1 - ret + g_channel_config 7 1 - g_adc_data + ad7124_regs[5].value 8 @@ -215,62 +198,27 @@ 9 1 - g_channel_config + g_adc_data 10 1 - g_channel_status + g_adc_state 11 1 - g_config_0 + g_adc_control 12 1 - g_filter_0 + wr_buf[8] 13 1 - ad7124_regs[5].value - - - 14 - 1 - g_ad7124_id - - - 15 - 1 - g_adc_error - - - 16 - 1 - g_adc_data - - - 17 - 1 - g_adc_state - - - 18 - 1 - g_adc_control - - - 19 - 1 - ad7124_analog[channel_nr] - - - 20 - 1 - read_data,0x10 + ad7124_analog[channel_nr].voltage @@ -347,7 +295,7 @@ Application/User/Core - 0 + 1 0 0 0 @@ -2039,6 +1987,18 @@ 0 0 + + 12 + 136 + 1 + 0 + 0 + 0 + ..\User\driver\delay.c + delay.c + 0 + 0 + @@ -2049,7 +2009,7 @@ 0 13 - 136 + 137 1 0 0 @@ -2061,7 +2021,7 @@ 13 - 137 + 138 1 0 0 @@ -2073,7 +2033,7 @@ 13 - 138 + 139 1 0 0 diff --git a/MDK-ARM/controller_pcba.uvprojx b/MDK-ARM/controller_pcba.uvprojx index 538d73f..6c4095b 100644 --- a/MDK-ARM/controller_pcba.uvprojx +++ b/MDK-ARM/controller_pcba.uvprojx @@ -1113,6 +1113,11 @@ 1 ..\User\driver\uart_lcd.c + + delay.c + 1 + ..\User\driver\delay.c + diff --git a/User/application/src/communication_protocol.c b/User/application/src/communication_protocol.c index a447601..d65fa3d 100644 --- a/User/application/src/communication_protocol.c +++ b/User/application/src/communication_protocol.c @@ -39,7 +39,7 @@ void communication_get_ai(communication_ai_t *ai_data, uint8_t *tx_data, const u { float32_u analog_data; uint8_t tx_data_len = COM_AI_DATA_SIZE; - analog_data.f = S2B_FLOAT32(ad7124_analog[ai_data->channel].current); + analog_data.f = S2B_FLOAT32(ad7124_analog[ai_data->channel].voltage); tx_data[0] = FRAME_HEAD; // 帧头 tx_data[1] = COM_OK; // 状态 tx_data[2] = rx_data[2]; // 设备号 diff --git a/User/application/src/tcpserverc.c b/User/application/src/tcpserverc.c index c02ef8c..a242383 100644 --- a/User/application/src/tcpserverc.c +++ b/User/application/src/tcpserverc.c @@ -411,7 +411,7 @@ uint16_t total_len = 2 + 2 + 2 + 2 + 1 + 22 + 2; // 帧头+帧长+源+目标+类 } uint16_t handle_type_87(const uint8_t *body, uint16_t body_len, uint8_t *tx) { -uint16_t total_len = 2 + 2 + 2 + 2 + 1 + 74 + 2; // 帧头+帧长+源+目标+类型+74字节输出读取+校验 + uint16_t total_len = 2 + 2 + 2 + 2 + 1 + 74 + 2; // 帧头+帧长+源+目标+类型+74字节输出读取+校验 // 1. 读取ID寄存器 // 帧头 @@ -433,9 +433,21 @@ uint16_t total_len = 2 + 2 + 2 + 2 + 1 + 74 + 2; // 帧头+帧长+源+目标+类 // 报文类型 tx[8] = reply_type; - // 7字节使能状态(直接复制 body 到 tx[9]~tx[15]) - //memcpy(&tx[9], body, 74); // 确保 body 是74字节 - + tx[9] = 0x00; //io通道0-15 + tx[10] = 0x00; //io通道0-15 + // 填充AD7124原始数据到tx[11]~tx[75],每通道4字节,MSB格式 + extern ad7124_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX]; + for (int ch = 0; ch < AD7124_CHANNEL_EN_MAX; ++ch) { + int32_t data = ad7124_analog[ch].data; + tx[11 + ch * 4 + 0] = (data >> 24) & 0xFF; + tx[11 + ch * 4 + 1] = (data >> 16) & 0xFF; + tx[11 + ch * 4 + 2] = (data >> 8) & 0xFF; + tx[11 + ch * 4 + 3] = (data) & 0xFF; + } + // 其余tx[73]~tx[82]可按需要填充(如比例阀等),此处保持原样或补零 + for (int i = 11 + AD7124_CHANNEL_EN_MAX * 4; i < 83; ++i) { + tx[i] = 0; + } // 校验和 uint16_t checksum = 0; for (int i = 4; i < 84; ++i) // 4~83(源地址+目标地址+类型+74字节) diff --git a/User/driver/ad7124.c b/User/driver/ad7124.c index 6a276c1..d68f4ba 100644 --- a/User/driver/ad7124.c +++ b/User/driver/ad7124.c @@ -4,7 +4,8 @@ #define COMM_ERR -2 /* Communication error on receive */ #define AD7124_TIMEOUT -3 /* A timeout has occured */ -// 配置ad7124寄存器的值,根据实际项目需求配置 +// 配置ad7124寄存器的值,根据实际项目的电路图进行配置, +//比如单极性测量电压,AINM需要接AVSS,参见AD7124手册P87,AINP=0,AINM=17,需要配置{AD7124_CHANNEL_0, 0x0011, AD7124_SIZE_2, AD7124_RW}, static ad7124_st_reg_t ad7124_regs[AD7124_REG_NO] = { {AD7124_STATUS, 0x00, AD7124_SIZE_1, AD7124_R}, /* AD7124_Status */ {AD7124_ADC_CONTROL, 0x0280, AD7124_SIZE_2, AD7124_RW}, /* AD7124_ADC_Control */ @@ -15,30 +16,30 @@ static ad7124_st_reg_t ad7124_regs[AD7124_REG_NO] = { {AD7124_ERROR, 0x000000, AD7124_SIZE_3, AD7124_R}, /* AD7124_Error */ {AD7124_ERROR_EN, 0x000040, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Error_En */ {AD7124_MCLK_COUNT, 0x00, AD7124_SIZE_1, AD7124_R}, /* AD7124_Mclk_Count */ - {AD7124_CHANNEL_0, 0x0051, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_0 */ - {AD7124_CHANNEL_1, 0x0071, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_1 */ - {AD7124_CHANNEL_2, 0x0091, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_2 */ - {AD7124_CHANNEL_3, 0x00B1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_3 */ - {AD7124_CHANNEL_4, 0x00D1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_4 */ - {AD7124_CHANNEL_5, 0x00F1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_5 */ - {AD7124_CHANNEL_6, 0x0111, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_6 */ - {AD7124_CHANNEL_7, 0x0131, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_7 */ - {AD7124_CHANNEL_8, 0x0151, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_8 */ - {AD7124_CHANNEL_9, 0x0171, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_9 */ - {AD7124_CHANNEL_10, 0x0001, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_10 */ - {AD7124_CHANNEL_11, 0x0001, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_11 */ - {AD7124_CHANNEL_12, 0x0001, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_12 */ - {AD7124_CHANNEL_13, 0x0001, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_13 */ - {AD7124_CHANNEL_14, 0x0001, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_14 */ - {AD7124_CHANNEL_15, 0x0001, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_15 */ - {AD7124_CONFIG_0, 0x00E0, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_0 - 单极性模式 */ + {AD7124_CHANNEL_0, 0x0011, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_0 */ + {AD7124_CHANNEL_1, 0x0031, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_1 */ + {AD7124_CHANNEL_2, 0x0051, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_2 */ + {AD7124_CHANNEL_3, 0x0071, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_3 */ + {AD7124_CHANNEL_4, 0x0091, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_4 */ + {AD7124_CHANNEL_5, 0x00B1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_5 */ + {AD7124_CHANNEL_6, 0x00D1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_6 */ + {AD7124_CHANNEL_7, 0x00F1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_7 */ + {AD7124_CHANNEL_8, 0x0111, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_8 */ + {AD7124_CHANNEL_9, 0x0131, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_9 */ + {AD7124_CHANNEL_10, 0x0151, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_10 */ + {AD7124_CHANNEL_11, 0x0171, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_11 */ + {AD7124_CHANNEL_12, 0x0191, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_12 */ + {AD7124_CHANNEL_13, 0x01B1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_13 */ + {AD7124_CHANNEL_14, 0x01D1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_14 */ + {AD7124_CHANNEL_15, 0x01F1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_15 */ + {AD7124_CONFIG_0, 0x01E0, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_0 */ {AD7124_CONFIG_1, 0x0040, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_1 */ - {AD7124_CONFIG_2, 0x0060, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_2 - 单极性模式 */ - {AD7124_CONFIG_3, 0x0060, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_3 - 单极性模式 */ - {AD7124_CONFIG_4, 0x0060, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_4 - 单极性模式 */ - {AD7124_CONFIG_5, 0x0060, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_5 - 单极性模式 */ - {AD7124_CONFIG_6, 0x0060, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_6 - 单极性模式 */ - {AD7124_CONFIG_7, 0x0060, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_7 - 单极性模式 */ + {AD7124_CONFIG_2, 0x0860, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_2 */ + {AD7124_CONFIG_3, 0x0860, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_3 */ + {AD7124_CONFIG_4, 0x0860, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_4 */ + {AD7124_CONFIG_5, 0x0860, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_5 */ + {AD7124_CONFIG_6, 0x0860, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_6 */ + {AD7124_CONFIG_7, 0x0860, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_7 */ {AD7124_FILTER_0, 0x060020, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Filter_0 */ {AD7124_FILTER_1, 0x060180, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Filter_1 */ {AD7124_FILTER_2, 0x060180, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Filter_2 */ @@ -66,24 +67,25 @@ static ad7124_st_reg_t ad7124_regs[AD7124_REG_NO] = { }; static ad7124_st_reg_t ad7124_channel_regs[AD7124_CHANNEL_EN_MAX] = { - {AD7124_CHANNEL_0, 0x8051, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_0 */ - {AD7124_CHANNEL_1, 0x8071, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_1 */ - {AD7124_CHANNEL_2, 0x8091, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_2 */ - {AD7124_CHANNEL_3, 0x80B1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_3 */ - {AD7124_CHANNEL_4, 0x80D1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_4 */ - {AD7124_CHANNEL_5, 0x80F1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_5 */ - {AD7124_CHANNEL_6, 0x8111, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_6 */ - {AD7124_CHANNEL_7, 0x8131, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_7 */ - {AD7124_CHANNEL_8, 0x8151, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_8 */ - {AD7124_CHANNEL_9, 0x8171, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_9 */ - {AD7124_CHANNEL_10, 0x8001, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_10 */ - {AD7124_CHANNEL_11, 0x8001, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_11 */ - {AD7124_CHANNEL_12, 0x8001, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_12 */ - {AD7124_CHANNEL_13, 0x8001, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_13 */ - {AD7124_CHANNEL_14, 0x8001, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_14 */ - {AD7124_CHANNEL_15, 0x8001, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_15 */ + {AD7124_CHANNEL_0, 0x8011, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_0 */ + {AD7124_CHANNEL_1, 0x8031, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_1 */ + {AD7124_CHANNEL_2, 0x8051, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_2 */ + {AD7124_CHANNEL_3, 0x8071, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_3 */ + {AD7124_CHANNEL_4, 0x8091, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_4 */ + {AD7124_CHANNEL_5, 0x80B1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_5 */ + {AD7124_CHANNEL_6, 0x80D1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_6 */ + {AD7124_CHANNEL_7, 0x80F1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_7 */ + {AD7124_CHANNEL_8, 0x8111, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_8 */ + {AD7124_CHANNEL_9, 0x8131, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_9 */ + {AD7124_CHANNEL_10, 0x8151, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_10 */ + {AD7124_CHANNEL_11, 0x8171, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_11 */ + {AD7124_CHANNEL_12, 0x8191, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_12 */ + {AD7124_CHANNEL_13, 0x81B1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_13 */ + {AD7124_CHANNEL_14, 0x81D1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_14 */ + {AD7124_CHANNEL_15, 0x81F1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_15 */ }; + ad7124_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX] = {NULL}; // AD通道采样结构体数组,用于存放AD通道采样数据 /** * @brief 无校验读取AD7124寄存器 @@ -345,66 +347,25 @@ int32_t ad7124_read_data(void) return read_data; } -/** - * @brief 从AD7124获取模拟信号数据 - * - * 该函数通过SPI接口从AD7124芯片获取模拟信号数据,并将数据保存到ad7124_analog中。 - * - * @details - * - 遍历所有模拟通道,对每个通道执行以下操作: - * - 等待AD7124完成转换。 - * - 读取转换后的数据。 - * - 计算电压值(单极性计算公式)。 - * - 计算电流值(基于电压值和电阻值),有的通道没有电流值可以忽略。 - * - * @note - * - 转换完成后,通过公式计算电压和电流值,并将结果保存到全局数组ad7124_analog中。 - * - 电压计算公式:Code = (0xFFFFFF × AIN × Gain)/VREF,其中VREF为参考电压,GAIN为增益,AD_CODE为AD代码。 - * - 电流计算公式:电流 = 电压 / 电阻 * 1000,其中电阻值为AD7124_RES,单位转换为mA。 - */ -// void ad7124_get_analog(void) -// { -// int32_t read_data; -// uint8_t i; -// uint8_t channel; -// // for (i = STOP_NC_ADC; i < AD7124_CHANNEL_EN_MAX; i++) -// // { -// // ad7124_regs[AD7124_CHANNEL_0].value = ad7124_channel_regs[i].value; -// // ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0]); -// // ad7124_read_register(&ad7124_regs[AD7124_STATUS]); -// while (ad7124_wait_for_conv_ready(AD7124_RDY)) -// ; // 等待转换完成 -// channel = ad7124_regs[AD7124_STATUS].value; -// ad7124_analog[channel].channel = channel; -// read_data = ad7124_read_data(); -// ad7124_analog[channel].data = read_data; -// ad7124_analog[channel].voltage = (float)(read_data * VREF / GAIN / AD_CODE); // AD7124单极性计算公式:Code = (0xFFFFFF × AIN × Gain)/VREF -// ad7124_analog[channel].current = (float)(ad7124_analog[channel].voltage / AD7124_RES * 1000); // 乘1000是为了将单位转换为mA - -// // ad7124_regs[AD7124_CHANNEL_0].value = 0; -// // ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0]); -// // } -// } void ad7124_get_analog(uint8_t channel_nr) { int32_t read_data; // for (i = STOP_NC_ADC; i < AD7124_CHANNEL_EN_MAX; i++) // { - // 保存当前通道的配置 - ad7124_regs[AD7124_CHANNEL_0 + channel_nr].value = ad7124_channel_regs[channel_nr].value; - ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0 + channel_nr]); + ad7124_regs[AD7124_CHANNEL_0].value = ad7124_channel_regs[channel_nr].value; + ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0]); - while (ad7124_wait_for_conv_ready(AD7124_RDY)); // 等待转换完成 + while (ad7124_wait_for_conv_ready(AD7124_RDY)) + ; // 等待转换完成 ad7124_analog[channel_nr].channel = channel_nr; read_data = ad7124_read_data(); ad7124_analog[channel_nr].data = read_data; ad7124_analog[channel_nr].voltage = (float)(read_data * VREF / GAIN / AD_CODE); // AD7124单极性计算公式:Code = (0xFFFFFF × AIN × Gain)/VREF //ad7124_analog[channel_nr].current = (float)(ad7124_analog[channel_nr].voltage / AD7124_RES * 1000); // 乘1000是为了将单位转换为mA - // 关闭当前使用的通道 - ad7124_regs[AD7124_CHANNEL_0 + channel_nr].value = 0; - ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0 + channel_nr]); + ad7124_regs[AD7124_CHANNEL_0].value = 0; + ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0]); // } } /** @@ -424,38 +385,20 @@ int32_t ad7124_setup(void) if (ret < 0) return ret; HAL_Delay(10); - ad7124_read_register(&ad7124_regs[AD7124_ID]);//查看AD7124的ID寄存器,确认是否连接正确 - - // 关闭所有通道 - for (reg_nr = AD7124_CHANNEL_0; reg_nr <= AD7124_CHANNEL_15; reg_nr++) - { - ad7124_regs[reg_nr].value = 0; // 将通道寄存器值设为0,关闭通道 - ret = ad7124_write_register(&ad7124_regs[reg_nr]); - if (ret < 0) - return ret; - } - - // 设置配置寄存器为单极性模式 - ad7124_regs[AD7124_CONFIG_0].value = 0x00E0; // 清除bit 11,设置为单极性模式 - ad7124_regs[AD7124_CONFIG_2].value = 0x0060; // 清除bit 11,设置为单极性模式 - ad7124_regs[AD7124_CONFIG_3].value = 0x0060; // 清除bit 11,设置为单极性模式 - ad7124_regs[AD7124_CONFIG_4].value = 0x0060; // 清除bit 11,设置为单极性模式 - ad7124_regs[AD7124_CONFIG_5].value = 0x0060; // 清除bit 11,设置为单极性模式 - ad7124_regs[AD7124_CONFIG_6].value = 0x0060; // 清除bit 11,设置为单极性模式 - ad7124_regs[AD7124_CONFIG_7].value = 0x0060; // 清除bit 11,设置为单极性模式 - + ad7124_read_register(&ad7124_regs[AD7124_ID]); /* Initialize registers AD7124_ADC_Control through AD7124_Filter_7. */ - for (reg_nr = AD7124_STATUS; reg_nr < AD7124_OFFSET_0; reg_nr++) // 对ad7124的可写寄存器进行配置,不包括只读寄存器 + for (reg_nr = AD7124_STATUS; reg_nr < AD7124_OFFSET_0; reg_nr++) //循环写入寄存器,从AD7124_STATUS到AD7124_OFFSET_0 { - if (ad7124_regs[reg_nr].rw == AD7124_RW)// 只写寄存器才进行写入操作 + // ret = ad7124_read_register(&ad7124_regs[reg_nr]); + if (ad7124_regs[reg_nr].rw == AD7124_RW) { - ret = ad7124_write_register(&ad7124_regs[reg_nr]);// 先写入寄存器值 - ret = ad7124_read_register(&ad7124_regs[reg_nr]); // 读取寄存器值 + ret = ad7124_write_register(&ad7124_regs[reg_nr]);//对AD7124的寄存器进行配置,包括ADC控制寄存器、滤波器配置等。 + ret = ad7124_read_register(&ad7124_regs[reg_nr]); if (ret < 0) break; } } - HAL_GPIO_WritePin(AD7124_SYNC_GPIO_Port, AD7124_SYNC_Pin, GPIO_PIN_SET); // AD7124同步信号一直高电平状态 + HAL_GPIO_WritePin(AD7124_SYNC_GPIO_Port, AD7124_SYNC_Pin, GPIO_PIN_SET); // AD7124同步信号使能 return ret; } diff --git a/User/driver/ad7124.h b/User/driver/ad7124.h index e09a5d1..7b529b6 100644 --- a/User/driver/ad7124.h +++ b/User/driver/ad7124.h @@ -170,7 +170,7 @@ typedef enum AD7124_MCLK_COUNT, // 监控主时钟频率 AD7124_CHANNEL_0, // 设置AD采样通道和所需要的配置,其中的Setup位决定了采用哪种Config、Filter、Offset、Gain寄存器的配置;共有八种配置 AD7124_CHANNEL_1, // 通道寄存器的顺序并不是从AI0引脚读到最后一个引脚,而是通过自己的设置来决定顺序 - AD7124_CHANNEL_2, + AD7124_CHANNEL_2, AD7124_CHANNEL_3, AD7124_CHANNEL_4, AD7124_CHANNEL_5, @@ -242,23 +242,23 @@ typedef struct typedef enum { - - AI_IN0_ADC = 0, // AD7124_CHANNEL_EN_0 - AI_IN1_ADC, // AD7124_CHANNEL_EN_1 - AI_IN2_ADC, // AD7124_CHANNEL_EN_2 - AI_IN3_ADC, // AD7124_CHANNEL_EN_3 - AI_IN4_ADC, // AD7124_CHANNEL_EN_4 - AI_IN5_ADC, // AD7124_CHANNEL_EN_5 - AI_IN6_ADC, // AD7124_CHANNEL_EN_6 - AI_IN7_ADC, // AD7124_CHANNEL_EN_7 - AI_IN8_ADC, // AD7124_CHANNEL_EN_8 - AI_IN9_ADC, // AD7124_CHANNEL_EN_9 - AI_IN10_ADC, // AD7124_CHANNEL_EN_10 - AI_IN11_ADC, // AD7124_CHANNEL_EN_11 - AI_IN12_ADC, // AD7124_CHANNEL_EN_12 - AI_IN13_ADC, // AD7124_CHANNEL_EN_13 - AI_IN14_ADC, // AD7124_CHANNEL_EN_14 - AI_IN15_ADC, // AD7124_CHANNEL_EN_15 + AD7124_AIN0 = 0, // AD7124_CHANNEL_EN_0 + AD7124_AIN1, // AD7124_CHANNEL_EN_1 + AD7124_AIN2, // AD7124_CHANNEL_EN_2 + AD7124_AIN3, // AD7124_CHANNEL_EN_3 + AD7124_AIN4, // AD7124_CHANNEL_EN_4 + AD7124_AIN5, // AD7124_CHANNEL_EN_5 + AD7124_AIN6, // AD7124_CHANNEL_EN_6 + AD7124_AIN7, // AD7124_CHANNEL_EN_7 + AD7124_AIN8, // AD7124_CHANNEL_EN_8 + AD7124_AIN9, // AD7124_CHANNEL_EN_9 + AD7124_AIN10, // AD7124_CHANNEL_EN_10 + AD7124_AIN11, // AD7124_CHANNEL_EN_11 + AD7124_AIN12, // AD7124_CHANNEL_EN_12 + AD7124_AIN13, // AD7124_CHANNEL_EN_13 + AD7124_AIN14, // AD7124_CHANNEL_EN_14 + AD7124_AIN15, // AD7124_CHANNEL_EN_15 + AD7124_CHANNEL_EN_MAX, } ad7124_channel_e; // 该项目所使用的通道 @@ -279,8 +279,8 @@ typedef struct #define AD7124_RES 100 // 采样基准电阻 #define VREF 2.5f // 基准电压 #define GAIN 1 // 增益,该值和配置寄存器有关 -//#define AD_CODE 0XFFFFFF // 24位ADC -#define AD_CODE 0X7FFFFF // 23位ADC +#define AD_CODE 0XFFFFFF // 24位ADC +//#define AD_CODE 0x7FFFFF // 23位ADC /*! Reads the value of the specified register. */ int32_t ad7124_read_register(ad7124_st_reg_t *p_reg); // 读寄存器 diff --git a/User/driver/delay.c b/User/driver/delay.c new file mode 100644 index 0000000..2108f08 --- /dev/null +++ b/User/driver/delay.c @@ -0,0 +1,43 @@ +#include "delay.h" + +static uint32_t fac_us = 0; // us延时倍乘数 +static uint32_t fac_ms = 0; // ms延时倍乘数 + +// 初始化延迟函数 +void delay_init(void) +{ + // 配置SysTick为外部时钟源(HCLK/8) + SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk; // 选择外部时钟源 HCLK/8 + fac_us = SystemCoreClock / 8000000; // 为系统时钟的1/8 + fac_ms = (uint32_t)fac_us * 1000; // 代表每个ms需要的systick时钟数 +} + +// 延时nus微秒 +void delay_us(uint32_t nus) +{ + uint32_t temp; + SysTick->LOAD = nus * fac_us; // 时间加载 + SysTick->VAL = 0x00; // 清空计数器 + SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 开始倒数 + do + { + temp = SysTick->CTRL; + } while ((temp & 0x01) && !(temp & (1 << 16))); // 等待时间到达 + SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭计数器 + SysTick->VAL = 0X00; // 清空计数器 +} + +// 延时nms毫秒 +void delay_ms(uint16_t nms) +{ + uint32_t temp; + SysTick->LOAD = (uint32_t)nms * fac_ms; // 时间加载(SysTick->LOAD为24bit) + SysTick->VAL = 0x00; // 清空计数器 + SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 开始倒数 + do + { + temp = SysTick->CTRL; + } while ((temp & 0x01) && !(temp & (1 << 16))); // 等待时间到达 + SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭计数器 + SysTick->VAL = 0X00; // 清空计数器 +} diff --git a/User/driver/delay.h b/User/driver/delay.h new file mode 100644 index 0000000..4bab3fc --- /dev/null +++ b/User/driver/delay.h @@ -0,0 +1,12 @@ +#ifndef __DELAY_H +#define __DELAY_H + +#include "stm32f4xx_hal.h" +#include "core_cm4.h" +#include "system_stm32f4xx.h" + +void delay_init(void); +void delay_us(uint32_t nus); +void delay_ms(uint16_t nms); + +#endif /* __DELAY_H */ \ No newline at end of file diff --git a/User/driver/error.h b/User/driver/error.h new file mode 100644 index 0000000..3cb24a5 --- /dev/null +++ b/User/driver/error.h @@ -0,0 +1,13 @@ +#ifndef __ERROR_H +#define __ERROR_H + +/** + * @brief 错误码定义 + */ +#define SUCCESS 0 /* 操作成功 */ +#define FAILURE -1 /* 操作失败 */ +#define INVALID_VAL -2 /* 无效参数 */ +#define COMM_ERR -3 /* 通信错误 */ +#define TIMEOUT -4 /* 超时错误 */ + +#endif /* __ERROR_H */ \ No newline at end of file diff --git a/User/driver/platform_support.h b/User/driver/platform_support.h new file mode 100644 index 0000000..447ea8c --- /dev/null +++ b/User/driver/platform_support.h @@ -0,0 +1,24 @@ +#ifndef __PLATFORM_SUPPORT_H +#define __PLATFORM_SUPPORT_H + +/* 包含文件 */ +#include +#include "stm32f4xx_hal.h" + +/* 定义 */ +#define SUCCESS 0 +#define FAILURE -1 + +/* 函数声明 */ + +/** + * @brief 毫秒延时函数 + * @param ms - 延时时间,单位:毫秒 + * @return 无 + */ +static inline void mdelay(uint32_t ms) +{ + HAL_Delay(ms); +} + +#endif /* __PLATFORM_SUPPORT_H */ \ No newline at end of file diff --git a/User/system/user_spi.c b/User/system/user_spi.c index 2adfa7b..45990e8 100644 --- a/User/system/user_spi.c +++ b/User/system/user_spi.c @@ -1,50 +1,126 @@ #include "user_spi.h" +#include "stm32f4xx_hal.h" +#include "main.h" +#include +#include +#include +#include -/* SPI2 Handle */ -SPI_HandleTypeDef hspi2; +#include "spi.h" + +// 移除对platform_support.h的依赖 +// 直接在此处定义需要的常量和函数 +#define SUCCESS 0 +#define FAILURE -1 + +// 声明mdelay函数 +static inline void mdelay(uint32_t ms) +{ + HAL_Delay(ms); +} + +/******************************************************************************/ +/***************************** #defines ***************************************/ +/******************************************************************************/ #define SPI_BUFFER_SIZE 255 + + +/******************************************************************************/ +/************************ Variable Declarations *******************************/ +/******************************************************************************/ + static uint8_t spi_rx_buffer[SPI_BUFFER_SIZE] = {0}; + +/******************************************************************************/ +/************************ Functions Definitions *******************************/ +/******************************************************************************/ + + +#define SPI_BUFFER_SIZE 255 + + +// SPI handle declaration +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) - { - // 如果通信失败,返回 FAIL - return FAIL; - } - /* 将 SPI 接收缓冲区复制到提供的数据缓冲区,以便返回给调用者 */ - memcpy(data_write, spi_rx_buffer, bytes_number); - // 返回 TRUE 表示通信成功 - return TRUE; + // 使用 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; } void ad7124_spi_init(void) { - /* Enable SPI2 clock */ - __HAL_RCC_SPI2_CLK_ENABLE(); + GPIO_InitTypeDef GPIO_InitStruct = {0}; + // Enable GPIO and SPI clocks + __HAL_RCC_SPI2_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); // For MISO and MOSI + __HAL_RCC_GPIOB_CLK_ENABLE(); // For SCK + __HAL_RCC_GPIOD_CLK_ENABLE(); // For CS + + // Configure SPI2 pins + // MISO (PC2) and MOSI (PC3) + GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; + 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_SPI2; // SPI2 alternate function + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + // SCK (PB10) + GPIO_InitStruct.Pin = GPIO_PIN_10; + 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_SPI2; // SPI2 alternate function + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + // CS (PD10) - Configure as output + GPIO_InitStruct.Pin = GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; // Add pull-up to ensure high when not driven + 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 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_HIGH; // CPOL = 1 - hspi2.Init.CLKPhase = SPI_PHASE_2EDGE; // CPHA = 1 + 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_256; hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi2.Init.TIMode = SPI_TIMODE_DISABLE; hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi2.Init.CRCPolynomial = 10; - // 确保CS初始为高电平 - HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(SPI2_CS2_GPIO_Port, SPI2_CS2_Pin, GPIO_PIN_SET); - if (HAL_SPI_Init(&hspi2) != HAL_OK) { Error_Handler(); } + + // Double check CS is high after initialization + HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_SET);//关闭AD7124_CS1 + HAL_GPIO_WritePin(SPI2_CS2_GPIO_Port, SPI2_CS2_Pin, GPIO_PIN_SET);//关闭AD7124_CS2 + HAL_GPIO_WritePin(AD7124_SYNC_GPIO_Port, AD7124_SYNC_Pin, GPIO_PIN_SET);//关闭AD7124_SYNC + HAL_Delay(1); } void dac161s997_spi_init(void) @@ -72,16 +148,18 @@ void dac161s997_spi_init(void) void ad7124_cs_on(void) { - // 激活AD7124 (CS低电平有效) - HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_RESET); - + HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_RESET); // 拉低使能AD7124_CS1 + //HAL_GPIO_WritePin(SPI2_CS2_GPIO_Port, SPI2_CS2_Pin, GPIO_PIN_SET); // 拉高关闭AD7124_CS2 + HAL_Delay(1);//延时1ms } void ad7124_cs_off(void) { - // 禁用AD7124 (CS高电平) - HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_SET); // 拉高关闭AD7124_CS1 + //HAL_GPIO_WritePin(SPI2_CS2_GPIO_Port, SPI2_CS2_Pin, GPIO_PIN_RESET); // 拉低使能AD7124_CS2 + HAL_Delay(1); } + void dac161s997_cs_on(chip_type_e dac_num) { switch (dac_num) @@ -120,57 +198,65 @@ void dac161s997_cs_off(uint8_t dac_num) } void board_spi_init(chip_type_e chip_type) { - switch (chip_type) - { - case AD7124: - ad7124_spi_init(); - break; - case DAC161S997_1: - dac161s997_spi_init(); - break; - case DAC161S997_2: - dac161s997_spi_init(); - break; - default: - dac161s997_spi_init(); - break; - } + switch(chip_type) { + case AD7124: + ad7124_spi_init(); + break; + case DAC161S997_1: + case DAC161S997_2: + dac161s997_spi_init(); + break; + default: + break; + } } void board_spi_cs_on(chip_type_e chip_type) { - switch (chip_type) - { - case AD7124: - ad7124_cs_on(); - break; - case DAC161S997_1: - dac161s997_cs_on(DAC161S997_1); - break; - case DAC161S997_2: - dac161s997_cs_on(DAC161S997_2); - break; - default: - dac161s997_cs_on(DAC161S997_2); - break; - } + switch(chip_type) { + case AD7124: + 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); + break; + default: + break; + } } void board_spi_cs_off(chip_type_e chip_type) { - switch (chip_type) - { - case AD7124: - ad7124_cs_off(); - break; - case DAC161S997_1: - dac161s997_cs_off(DAC161S997_1); - break; - case DAC161S997_2: - dac161s997_cs_off(DAC161S997_2); - break; - default: - dac161s997_cs_off(DAC161S997_2); - break; - } + switch(chip_type) { + case AD7124: + 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); + break; + default: + break; + } } + +// Add helper function for AD7124 SPI communication +int32_t ad7124_spi_transmit_receive(uint8_t *data, uint8_t bytes) +{ + ad7124_cs_on(); + int32_t result = spi_transmit_receive(&hspi2, data, bytes); + ad7124_cs_off(); + return result; +} + + + + +