From 69b41c5f5f80beef7e53a08839399d86a177da4f Mon Sep 17 00:00:00 2001 From: qiuxin Date: Mon, 19 May 2025 19:29:08 +0800 Subject: [PATCH] DEV --- Core/Src/freertos.c | 233 ++++++++-------- MDK-ARM/controller_pcba.uvoptx | 64 +---- ...emi-finished_product_testing.build_log.htm | 57 ---- User/application/src/tcpserverc.c | 5 +- User/driver/ad7124.c | 248 ++++++----------- User/driver/ad7124.h | 257 ++++++++++-------- User/system/user_spi.c | 2 +- 7 files changed, 362 insertions(+), 504 deletions(-) delete mode 100644 MDK-ARM/semi-finished_product_testing/semi-finished_product_testing.build_log.htm diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 41ad9d4..0ea36a6 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -93,6 +93,7 @@ void start_gpio_di_do_task(void const *argument); 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); extern void MX_LWIP_Init(void); void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ @@ -152,6 +153,8 @@ void MX_FREERTOS_Init(void) /* 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); @@ -166,8 +169,8 @@ void MX_FREERTOS_Init(void) // 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); + // osThreadDef(ad7124_test_task, start_ad7124_test_task, osPriorityNormal, 0, 512); + // ad7124_test_taskHandle = osThreadCreate(osThread(ad7124_test_task), NULL); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ @@ -305,15 +308,15 @@ void start_adc_task(void const *argument) /* Infinite loop */ for (;;) { - osThreadSuspend(dac_taskHandle); // 暂停DAC任务,防止ADC采集时产生干????????,因为ADC和DAC采用的是同一路SPI,但是时序不???????? + //osThreadSuspend(dac_taskHandle); // 暂停DAC任务,防止ADC采集时产生干????????,因为ADC和DAC采用的是同一路SPI,但是时序不???????? uint8_t ch = 0; - for (ch = STOP_NC_ADC; ch < AD7124_CHANNEL_EN_MAX; ch++) + for (ch = AI_IN0_ADC; ch < AD7124_CHANNEL_EN_MAX; ch++) { ad7124_get_analog(ch); } - communication_reset_hart(); - osThreadResume(dac_taskHandle); - vTaskDelay(10); + //communication_reset_hart(); + //osThreadResume(dac_taskHandle); + vTaskDelay(100); } /* USER CODE END start_adc_task */ } @@ -377,128 +380,146 @@ volatile uint16_t g_config_0 = 0; // 用于观察配置寄存器0 volatile uint32_t g_filter_0 = 0; // 用于观察滤波器配置 extern int32_t g_ad7124_id; -void start_ad7124_test_task(const void *argument) -{ - vTaskDelay(1000); +// void start_ad7124_test_task(const void *argument) +// { +// vTaskDelay(1000); - // 初始化AD7124 - ad7124_setup(); - vTaskDelay(100); +// // 初始化AD7124 +// ad7124_setup(); +// vTaskDelay(100); - while(1) - { - // 遍历所有启用的通道 - for(uint8_t ch = STOP_NC_ADC; ch < AD7124_CHANNEL_EN_MAX; ch++) - { - // 1. 将ADC设置为掉电模式 - ad7124_regs[AD7124_ADC_CONTROL].value = 0x0600; // Power-down mode - ad7124_write_register(&ad7124_regs[AD7124_ADC_CONTROL]); - vTaskDelay(1); +// while(1) +// { +// // 遍历所有启用的通道 +// for(uint8_t ch = STOP_NC_ADC; ch < AD7124_CHANNEL_EN_MAX; ch++) +// { +// // 1. 将ADC设置为掉电模式 +// ad7124_regs[AD7124_ADC_CONTROL].value = 0x0600; // Power-down mode +// ad7124_write_register(&ad7124_regs[AD7124_ADC_CONTROL]); +// vTaskDelay(1); - // 2. 配置当前通道 - ad7124_regs[AD7124_CHANNEL_0].value = ad7124_channel_regs[ch].value; - ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0]); +// // 2. 配置当前通道 +// ad7124_regs[AD7124_CHANNEL_0].value = ad7124_channel_regs[ch].value; +// ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0]); - // 3. 读取并保存通道配置状态 - ad7124_read_register(&ad7124_regs[AD7124_CHANNEL_0]); - g_channel_config = ad7124_regs[AD7124_CHANNEL_0].value; +// // 3. 读取并保存通道配置状态 +// ad7124_read_register(&ad7124_regs[AD7124_CHANNEL_0]); +// g_channel_config = ad7124_regs[AD7124_CHANNEL_0].value; - // 4. 设置为单次转换模式并启动转换 - ad7124_regs[AD7124_ADC_CONTROL].value = 0x0684; // Single conversion mode - ad7124_write_register(&ad7124_regs[AD7124_ADC_CONTROL]); +// // 4. 设置为单次转换模式并启动转换 +// ad7124_regs[AD7124_ADC_CONTROL].value = 0x0684; // Single conversion mode +// ad7124_write_register(&ad7124_regs[AD7124_ADC_CONTROL]); - // 5. 立即读取状态寄存器确认转换开始 - ad7124_read_register(&ad7124_regs[AD7124_STATUS]); - g_channel_status = ad7124_regs[AD7124_STATUS].value; +// // 5. 立即读取状态寄存器确认转换开始 +// ad7124_read_register(&ad7124_regs[AD7124_STATUS]); +// g_channel_status = ad7124_regs[AD7124_STATUS].value; - // 6. 等待转换完成 - uint16_t timeout = 1000; - while(timeout--) { - int32_t ret = ad7124_read_register(&ad7124_regs[AD7124_STATUS]); - if(ret >= 0) { - g_channel_status = ad7124_regs[AD7124_STATUS].value; - if(!(g_channel_status & AD7124_STATUS_REG_RDY)) { - // 转换完成,立即读取数据 - g_adc_data = ad7124_read_data(); - break; - } - } - vTaskDelay(1); - } +// // 6. 等待转换完成 +// uint16_t timeout = 1000; +// while(timeout--) { +// int32_t ret = ad7124_read_register(&ad7124_regs[AD7124_STATUS]); +// if(ret >= 0) { +// g_channel_status = ad7124_regs[AD7124_STATUS].value; +// if(!(g_channel_status & AD7124_STATUS_REG_RDY)) { +// // 转换完成,立即读取数据 +// g_adc_data = ad7124_read_data(); +// break; +// } +// } +// vTaskDelay(1); +// } - // 7. 读取错误寄存器检查是否有错误 - ad7124_read_register(&ad7124_regs[AD7124_ERROR]); - g_adc_error = ad7124_regs[AD7124_ERROR].value; +// // 7. 读取错误寄存器检查是否有错误 +// ad7124_read_register(&ad7124_regs[AD7124_ERROR]); +// g_adc_error = ad7124_regs[AD7124_ERROR].value; - // 8. 保存最终的控制寄存器状态 - ad7124_read_register(&ad7124_regs[AD7124_ADC_CONTROL]); - g_adc_control = ad7124_regs[AD7124_ADC_CONTROL].value; +// // 8. 保存最终的控制寄存器状态 +// ad7124_read_register(&ad7124_regs[AD7124_ADC_CONTROL]); +// g_adc_control = ad7124_regs[AD7124_ADC_CONTROL].value; - // 9. 如果发生错误,重置ADC - if(g_adc_error != 0) { - ad7124_reset(); - vTaskDelay(100); - ad7124_setup(); - vTaskDelay(10); - } +// // 9. 如果发生错误,重置ADC +// if(g_adc_error != 0) { +// ad7124_reset(); +// vTaskDelay(100); +// ad7124_setup(); +// vTaskDelay(10); +// } - // 10. 如果超时或出错,增加延时方便调试 - if(timeout == 0 || g_adc_error != 0) { - vTaskDelay(100); - } - } +// // 10. 如果超时或出错,增加延时方便调试 +// if(timeout == 0 || g_adc_error != 0) { +// vTaskDelay(100); +// } +// } - vTaskDelay(pdMS_TO_TICKS(10)); - } -} +// vTaskDelay(pdMS_TO_TICKS(10)); +// } +// } /** * @brief Initialize AD7124 with multiple channels * @param sample_rate: Sample rate selection (2Hz to 1kHz) * @retval None */ -void ad7124_multi_channel_init(uint8_t sample_rate) -{ - // Reset AD7124 - ad7124_reset(); - vTaskDelay(pdMS_TO_TICKS(100)); // 复位后延时 +// void ad7124_multi_channel_init(uint8_t sample_rate) +// { +// // Reset AD7124 +// ad7124_reset(); +// vTaskDelay(pdMS_TO_TICKS(100)); // 复位后延时 - // 配置ADC控制寄存器 - ad7124_regs[AD7124_ADC_CONTROL].value = - AD7124_ADC_CTRL_REG_DATA_STATUS | // Enable status register - AD7124_ADC_CTRL_REG_CS_EN | // Enable chip select - AD7124_ADC_CTRL_REG_REF_EN | // Enable internal reference - AD7124_ADC_CTRL_REG_POWER_MODE(3); // Full power mode - ad7124_write_register(&ad7124_regs[AD7124_ADC_CONTROL]); +// // 配置ADC控制寄存器 +// ad7124_regs[AD7124_ADC_CONTROL].value = +// AD7124_ADC_CTRL_REG_DATA_STATUS | // Enable status register +// AD7124_ADC_CTRL_REG_CS_EN | // Enable chip select +// AD7124_ADC_CTRL_REG_REF_EN | // Enable internal reference +// AD7124_ADC_CTRL_REG_POWER_MODE(3); // Full power mode +// ad7124_write_register(&ad7124_regs[AD7124_ADC_CONTROL]); - // 配置Setup 0 - ad7124_regs[AD7124_CONFIG_0].value = - AD7124_CFG_REG_BIPOLAR | // Bipolar mode - AD7124_CFG_REG_BURNOUT(0) | // Burnout current source off - AD7124_CFG_REG_REF_BUFP | // Reference buffer positive enabled - AD7124_CFG_REG_REF_BUFM | // Reference buffer negative enabled - AD7124_CFG_REG_AIN_BUFP | // Enable positive input buffer - AD7124_CFG_REG_AINN_BUFM | // Enable negative input buffer - AD7124_CFG_REG_REF_SEL(2) | // Use internal reference - AD7124_CFG_REG_PGA(0); // Gain = 1 - ad7124_write_register(&ad7124_regs[AD7124_CONFIG_0]); +// // 配置Setup 0 +// ad7124_regs[AD7124_CONFIG_0].value = +// AD7124_CFG_REG_BIPOLAR | // Bipolar mode +// AD7124_CFG_REG_BURNOUT(0) | // Burnout current source off +// AD7124_CFG_REG_REF_BUFP | // Reference buffer positive enabled +// AD7124_CFG_REG_REF_BUFM | // Reference buffer negative enabled +// AD7124_CFG_REG_AIN_BUFP | // Enable positive input buffer +// AD7124_CFG_REG_AINN_BUFM | // Enable negative input buffer +// AD7124_CFG_REG_REF_SEL(2) | // Use internal reference +// AD7124_CFG_REG_PGA(0); // Gain = 1 +// ad7124_write_register(&ad7124_regs[AD7124_CONFIG_0]); - // 初始禁用所有通道 - for(uint8_t ch = 0; ch < AD7124_CHANNEL_EN_MAX; ch++) { - ad7124_regs[AD7124_CHANNEL_0 + ch].value = 0; - ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0 + ch]); - } +// // 初始禁用所有通道 +// for(uint8_t ch = 0; ch < AD7124_CHANNEL_EN_MAX; ch++) { +// ad7124_regs[AD7124_CHANNEL_0 + ch].value = 0; +// ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0 + ch]); +// } - // 配置滤波器 - ad7124_regs[AD7124_FILTER_0].value = - AD7124_FILT_REG_FILTER(0) | // SINC4 filter - AD7124_FILT_REG_REJ60 | // Enable 60Hz rejection - AD7124_FILT_REG_POST_FILTER(3) | // Post filter enabled - AD7124_FILT_REG_FS(1); // Output data rate - ad7124_write_register(&ad7124_regs[AD7124_FILTER_0]); -} +// // 配置滤波器 +// ad7124_regs[AD7124_FILTER_0].value = +// AD7124_FILT_REG_FILTER(0) | // SINC4 filter +// AD7124_FILT_REG_REJ60 | // Enable 60Hz rejection +// AD7124_FILT_REG_POST_FILTER(3) | // Post filter enabled +// AD7124_FILT_REG_FS(1); // Output data rate +// ad7124_write_register(&ad7124_regs[AD7124_FILTER_0]); +// } /* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application */ - +// void start_adc_task(void const *argument) +// { +// /* USER CODE BEGIN start_adc_task */ +// ad7124_setup(); +// /* Infinite loop */ +// for (;;) +// { +// osThreadSuspend(dac_taskHandle); // 暂停DAC任务,防止ADC采集时产生干�????????,因为ADC和DAC采用的是同一路SPI,但是时序不�???????? +// uint8_t ch = 0; +// for (ch = STOP_NC_ADC; ch < AD7124_CHANNEL_EN_MAX; ch++) +// { +// ad7124_get_analog(ch); +// } +// communication_reset_hart(); +// osThreadResume(dac_taskHandle); +// vTaskDelay(10); +// } +// /* USER CODE END start_adc_task */ +// } /* USER CODE END Application */ diff --git a/MDK-ARM/controller_pcba.uvoptx b/MDK-ARM/controller_pcba.uvoptx index e05981f..ca988e4 100644 --- a/MDK-ARM/controller_pcba.uvoptx +++ b/MDK-ARM/controller_pcba.uvoptx @@ -152,9 +152,9 @@ 0 0 - 147 + 401 1 -
134243296
+
134243228
0 0 0 @@ -163,55 +163,7 @@ 1 ..\User\driver\ad7124.c - \\semi_finished_product_testing\../User/driver/ad7124.c\147 -
- - 1 - 0 - 439 - 1 -
134271122
- 0 - 0 - 0 - 0 - 0 - 1 - ../Core/Src/freertos.c - - \\semi_finished_product_testing\../Core/Src/freertos.c\439 -
- - 2 - 0 - 422 - 1 -
134271054
- 0 - 0 - 0 - 0 - 0 - 1 - ../Core/Src/freertos.c - - \\semi_finished_product_testing\../Core/Src/freertos.c\422 -
- - 3 - 0 - 419 - 1 -
134271036
- 0 - 0 - 0 - 0 - 0 - 1 - ../Core/Src/freertos.c - - \\semi_finished_product_testing\../Core/Src/freertos.c\419 + \\semi_finished_product_testing\../User/driver/ad7124.c\401
@@ -310,6 +262,16 @@ 1 g_adc_control + + 19 + 1 + ad7124_analog[channel_nr] + + + 20 + 1 + read_data,0x10 + 0 diff --git a/MDK-ARM/semi-finished_product_testing/semi-finished_product_testing.build_log.htm b/MDK-ARM/semi-finished_product_testing/semi-finished_product_testing.build_log.htm deleted file mode 100644 index c4e3684..0000000 --- a/MDK-ARM/semi-finished_product_testing/semi-finished_product_testing.build_log.htm +++ /dev/null @@ -1,57 +0,0 @@ - - -
-

Vision Build Log

-

Tool Versions:

-IDE-Version: Vision V5.36.0.0 -Copyright (C) 2021 ARM Ltd and ARM Germany GmbH. All rights reserved. -License Information: 1 admin, 1, LIC=UJWP0-B9JWK-458T5-GZZVK-L22WW-E2L2W - -Tool Versions: -Toolchain: MDK-ARM Plus Version: 5.36.0.0 -Toolchain Path: C:\Keil_v5\ARM\ARMCC\Bin -C Compiler: Armcc.exe V5.06 update 7 (build 960) -Assembler: Armasm.exe V5.06 update 7 (build 960) -Linker/Locator: ArmLink.exe V5.06 update 7 (build 960) -Library Manager: ArmAr.exe V5.06 update 7 (build 960) -Hex Converter: FromElf.exe V5.06 update 7 (build 960) -CPU DLL: SARMCM3.DLL V5.36.0.0 -Dialog DLL: DCM.DLL V1.17.3.0 -Target DLL: STLink\ST-LINKIII-KEIL_SWO.dll V3.0.9.0 -Dialog DLL: TCM.DLL V1.53.0.0 - -

Project:

-C:\Users\qiuxin.JS250402\Desktop\PCBA\controller_pcba_rtos\MDK-ARM\controller_pcba.uvprojx -Project File Date: 05/14/2025 - -

Output:

-*** Using Compiler 'V5.06 update 7 (build 960)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin' -Build target 'controller_pcba' -"semi-finished_product_testing\semi-finished_product_testing.axf" - 0 Error(s), 0 Warning(s). - -

Software Packages used:

- -Package Vendor: ARM - http://www.keil.com/pack/ARM.CMSIS.5.8.0.pack - ARM.CMSIS.5.8.0 - CMSIS (Common Microcontroller Software Interface Standard) - * Component: CORE Version: 5.5.0 - -Package Vendor: Keil - http://www.keil.com/pack/Keil.STM32F4xx_DFP.2.14.0.pack - Keil.STM32F4xx_DFP.2.14.0 - STMicroelectronics STM32F4 Series Device Support, Drivers and Examples - -

Collection of Component include folders:

- .\RTE\_controller_pcba - C:\Users\qiuxin.JS250402\AppData\Local\Arm\Packs\ARM\CMSIS\5.8.0\CMSIS\Core\Include - C:\Users\qiuxin.JS250402\AppData\Local\Arm\Packs\Keil\STM32F4xx_DFP\2.14.0\Drivers\CMSIS\Device\ST\STM32F4xx\Include - -

Collection of Component Files used:

- - * Component: ARM::CMSIS:CORE:5.5.0 - Include file: CMSIS\Core\Include\tz_context.h -Build Time Elapsed: 00:00:01 -
- - diff --git a/User/application/src/tcpserverc.c b/User/application/src/tcpserverc.c index 9788cfd..c02ef8c 100644 --- a/User/application/src/tcpserverc.c +++ b/User/application/src/tcpserverc.c @@ -413,8 +413,7 @@ 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字节输出读取+校验 // 1. 读取ID寄存器 - ad7124_read_register(&ad7124_regs[AD7124_ID]); - uint8_t id = (uint8_t)(ad7124_regs[AD7124_ID].value & 0xFF); + // 帧头 tx[0] = head_00; tx[1] = head_01; @@ -433,7 +432,7 @@ uint16_t total_len = 2 + 2 + 2 + 2 + 1 + 74 + 2; // 帧头+帧长+源+目标+类 // 报文类型 tx[8] = reply_type; - tx[9] = id; + // 7字节使能状态(直接复制 body 到 tx[9]~tx[15]) //memcpy(&tx[9], body, 74); // 确保 body 是74字节 diff --git a/User/driver/ad7124.c b/User/driver/ad7124.c index c26ffbf..6a276c1 100644 --- a/User/driver/ad7124.c +++ b/User/driver/ad7124.c @@ -1,19 +1,13 @@ #include "ad7124.h" -#include "user_spi.h" -#include "usart.h" -#include -#include -#include /* Error codes */ #define INVALID_VAL -1 /* Invalid argument */ #define COMM_ERR -2 /* Communication error on receive */ #define AD7124_TIMEOUT -3 /* A timeout has occured */ -int32_t FINESH_ID; -int32_t g_ad7124_id; + // 配置ad7124寄存器的值,根据实际项目需求配置 -ad7124_st_reg_t ad7124_regs[AD7124_REG_NO] = { +static ad7124_st_reg_t ad7124_regs[AD7124_REG_NO] = { {AD7124_STATUS, 0x00, AD7124_SIZE_1, AD7124_R}, /* AD7124_Status */ - {AD7124_ADC_CONTROL, 0x0680, AD7124_SIZE_2, AD7124_RW}, /* AD7124_ADC_Control - Enable reference, chip select, and data status */ + {AD7124_ADC_CONTROL, 0x0280, AD7124_SIZE_2, AD7124_RW}, /* AD7124_ADC_Control */ {AD7124_DATA, 0x000000, AD7124_SIZE_3, AD7124_R}, /* AD7124_Data */ {AD7124_IOCON1, 0x000000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_IOCon1 */ {AD7124_IOCON2, 0x0000, AD7124_SIZE_2, AD7124_RW}, /* AD7124_IOCon2 */ @@ -37,14 +31,14 @@ ad7124_st_reg_t ad7124_regs[AD7124_REG_NO] = { {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, 0x0DE0, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_0 - Enable buffers and internal reference */ + {AD7124_CONFIG_0, 0x00E0, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_0 - 单极性模式 */ {AD7124_CONFIG_1, 0x0040, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Config_1 */ - {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_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_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 */ @@ -71,7 +65,7 @@ ad7124_st_reg_t ad7124_regs[AD7124_REG_NO] = { {AD7124_GAIN_7, 0x500000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Gain_7 */ }; -ad7124_st_reg_t ad7124_channel_regs[AD7124_CHANNEL_EN_MAX] = { +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 */ @@ -82,6 +76,12 @@ ad7124_st_reg_t ad7124_channel_regs[AD7124_CHANNEL_EN_MAX] = { {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_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX] = {NULL}; // AD通道采样结构体数组,用于存放AD通道采样数据 @@ -98,54 +98,45 @@ int32_t ad7124_no_check_read_register(ad7124_st_reg_t *p_reg) { int32_t ret = 0; uint8_t buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + uint8_t i = 0; uint8_t add_status_length = 0; - uint8_t i = 0; // 添加变量声明 - // 构建命令字 - buffer[0] = AD7124_COMM_REG_RD | AD7124_COMM_REG_RA(p_reg->addr); - - // 打印调试信息 - // char uart_buf[100]; - // sprintf(uart_buf, "Reading register 0x%02X, command: 0x%02X\r\n", p_reg->addr, buffer[0]); - // HAL_UART_Transmit(&huart1, (uint8_t*)uart_buf, strlen(uart_buf), 100); + /* Build the Command word */ + buffer[0] = AD7124_COMM_REG_WEN | AD7124_COMM_REG_RD | + AD7124_COMM_REG_RA(p_reg->addr); + /* + * If this is an AD7124_DATA register read, and the DATA_STATUS bit is set + * in ADC_CONTROL, need to read 4, not 3 bytes for DATA with STATUS + */ if ((p_reg->addr == AD7124_DATA) && (ad7124_regs[AD7124_ADC_CONTROL].value & AD7124_ADC_CTRL_REG_DATA_STATUS)) { - add_status_length = 1; + add_status_length = 1; // 此处是根据寄存器配置而决定,根据AD7124_ADC_CONTROL第10位决定 } - // 从设备读取数据 + /* Read data from the device */ ret = ad7124_read_write_spi(buffer, p_reg->size + 1 + add_status_length); if (ret < 0) return ret; - // 解析数据(buffer[1]开始为有效数据) - // if (p_reg->size == 1) { - // p_reg->value = buffer[1]; - // } else if (p_reg->size == 2) { - // p_reg->value = ((uint16_t)buffer[1] << 8) | buffer[2]; - // } else if (p_reg->size == 3) { - // p_reg->value = ((uint32_t)buffer[1] << 16) | ((uint32_t)buffer[2] << 8) | buffer[3]; - // } else { - // p_reg->value = 0; - // } - p_reg->value = 0; - for (i = 1; i < p_reg->size + 1; i++) - { - p_reg->value <<= 8; - p_reg->value += buffer[i]; - } - + /* + * if reading Data with 4 bytes, need to copy the status byte to the STATUS + * register struct value member + */ if (add_status_length) { ad7124_regs[AD7124_STATUS].value = buffer[p_reg->size + 1]; } - // 仅用于调试:如果是ID寄存器,赋值到全局变量 - if (p_reg->addr == AD7124_ID) { - g_ad7124_id = p_reg->value; + /* Build the result */ + p_reg->value = 0; + for (i = 1; i < p_reg->size + 1; i++) + { + p_reg->value <<= 8; + p_reg->value += buffer[i]; } + return ret; } @@ -178,7 +169,7 @@ int32_t ad7124_no_check_write_register(ad7124_st_reg_t *reg) /* Write data to the device */ ret = ad7124_read_write_spi(wr_buf, reg->size + 1); - FINESH_ID = ret; + return ret; } @@ -197,17 +188,13 @@ int32_t ad7124_read_register(ad7124_st_reg_t *p_reg) { int32_t ret; - // 检查寄存器地址是否不是错误地址,并且检查ERROR寄存器的SPI_IGNORE_ERR位是否被设置 if (p_reg->addr != AD7124_ERROR && (ad7124_regs[AD7124_ERROR_EN].value & AD7124_ERREN_REG_SPI_IGNORE_ERR_EN)) { - // 读寄存器之前检查ERROR寄存器的SPI_IGNORE_ERR位 - ret = ad7124_wait_for_spi_ready(AD7124_RDY); + ret = ad7124_wait_for_spi_ready(AD7124_RDY); // 读寄存器之前检查ERROR寄存器的SPI_IGNORE_ERR位 - // 如果等待SPI就绪失败,则返回错误码 if (ret < 0) return ret; } - // 不检查ERROR寄存器的SPI_IGNORE_ERR位,直接读取寄存器 ret = ad7124_no_check_read_register(p_reg); return ret; @@ -352,7 +339,7 @@ int32_t ad7124_read_data(void) { int32_t read_data; /* Read the value of the Status Register */ - ad7124_read_register(&ad7124_regs[AD7124_DATA]);//读取数据寄存器 + ad7124_read_register(&ad7124_regs[AD7124_DATA]); /* Get the read result */ read_data = ad7124_regs[AD7124_DATA].value; @@ -402,32 +389,22 @@ int32_t ad7124_read_data(void) void ad7124_get_analog(uint8_t channel_nr) { int32_t read_data; - - // 设置AD7124寄存器,选择指定通道 // for (i = STOP_NC_ADC; i < AD7124_CHANNEL_EN_MAX; i++) // { - ad7124_regs[AD7124_CHANNEL_0].value = ad7124_channel_regs[channel_nr].value; - ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0]); + // 保存当前通道的配置 + ad7124_regs[AD7124_CHANNEL_0 + channel_nr].value = ad7124_channel_regs[channel_nr].value; + ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0 + channel_nr]); - // 等待转换完成 - 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单极性计算公式:Code = (0xFFFFFF × AIN × Gain)/VREF - ad7124_analog[channel_nr].voltage = (float)(read_data * VREF / GAIN / AD_CODE); - - // 计算电流值,乘1000是为了将单位转换为mA - ad7124_analog[channel_nr].current = (float)(ad7124_analog[channel_nr].voltage / AD7124_RES * 1000); - - // 恢复通道0寄存器为默认值 - ad7124_regs[AD7124_CHANNEL_0].value = 0; - ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0]); + // 关闭当前使用的通道 + ad7124_regs[AD7124_CHANNEL_0 + channel_nr].value = 0; + ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0 + channel_nr]); // } } /** @@ -441,85 +418,45 @@ int32_t ad7124_setup(void) { int32_t ret; uint8_t reg_nr; - - // Initialize SPI - board_spi_init(AD7124); - HAL_Delay(10); // Wait for SPI to stabilize - - // Reset device + // board_spi_init(AD7124); // 初始化SPI,因为DAC161的SPI要和AD7124共用,并且时序不一样,所以要先初始化SPI接口。 + /* Reset the device interface.*/ ret = ad7124_reset(); if (ret < 0) return ret; + HAL_Delay(10); + ad7124_read_register(&ad7124_regs[AD7124_ID]);//查看AD7124的ID寄存器,确认是否连接正确 - // Wait after reset - HAL_Delay(100); - - // Wait for power-on - ret = ad7124_wait_to_power_on(AD7124_RDY); - if (ret < 0) - return ret; - - // Read and verify ID register - ret = ad7124_read_register(&ad7124_regs[AD7124_ID]); - if (ret < 0) - return ret; - - if ((ad7124_regs[AD7124_ID].value & 0xF0) != 0x40) { - return COMM_ERR; // Invalid ID - } - - // Initialize registers in sequence - // First ADC Control register - Set to standby mode initially - ad7124_regs[AD7124_ADC_CONTROL].value = - AD7124_ADC_CTRL_REG_POWER_MODE(3) | // Full power mode - AD7124_ADC_CTRL_REG_CS_EN | // Enable chip select - AD7124_ADC_CTRL_REG_DATA_STATUS | // Enable status register - AD7124_ADC_CTRL_REG_REF_EN | // Enable reference - AD7124_ADC_CTRL_REG_MODE(0); // Continuous conversion mode initially - - ret = ad7124_write_register(&ad7124_regs[AD7124_ADC_CONTROL]); - if (ret < 0) - return ret; - - // Then Configuration registers - ad7124_regs[AD7124_CONFIG_0].value = - AD7124_CFG_REG_BIPOLAR | // Bipolar mode - AD7124_CFG_REG_REF_BUFP | // Reference buffer positive enabled - AD7124_CFG_REG_REF_BUFM | // Reference buffer negative enabled - AD7124_CFG_REG_AIN_BUFP | // Enable positive input buffer - AD7124_CFG_REG_AINN_BUFM | // Enable negative input buffer - AD7124_CFG_REG_REF_SEL(2) | // Use internal reference - AD7124_CFG_REG_PGA(0); // Gain = 1 - - ret = ad7124_write_register(&ad7124_regs[AD7124_CONFIG_0]); - if (ret < 0) - return ret; - - // Then Filter registers - Set for 50Hz rejection - ad7124_regs[AD7124_FILTER_0].value = - AD7124_FILT_REG_FILTER(0) | // SINC4 filter - AD7124_FILT_REG_REJ60 | // Enable 60Hz rejection - AD7124_FILT_REG_POST_FILTER(3) | // Post filter enabled - AD7124_FILT_REG_FS(1); // Output data rate - - ret = ad7124_write_register(&ad7124_regs[AD7124_FILTER_0]); - if (ret < 0) - return ret; - - // Initialize all channels to disabled state - for(reg_nr = AD7124_CHANNEL_0; reg_nr <= AD7124_CHANNEL_15; reg_nr++) { - ad7124_regs[reg_nr].value = 0x0000; // Disable channel + // 关闭所有通道 + 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; } - - // Verify ADC Control register - ret = ad7124_read_register(&ad7124_regs[AD7124_ADC_CONTROL]); - if (ret < 0) - return ret; - return 0; + // 设置配置寄存器为单极性模式 + 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,设置为单极性模式 + + /* Initialize registers AD7124_ADC_Control through AD7124_Filter_7. */ + for (reg_nr = AD7124_STATUS; reg_nr < AD7124_OFFSET_0; reg_nr++) // 对ad7124的可写寄存器进行配置,不包括只读寄存器 + { + if (ad7124_regs[reg_nr].rw == AD7124_RW)// 只写寄存器才进行写入操作 + { + ret = ad7124_write_register(&ad7124_regs[reg_nr]);// 先写入寄存器值 + 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同步信号一直高电平状态 + return ret; } /** @@ -535,30 +472,9 @@ int32_t ad7124_setup(void) int32_t ad7124_read_write_spi(uint8_t *buff, uint8_t length) { int32_t ret; - - // 确保CS信号在传输前是高的 - board_spi_cs_off(AD7124); - HAL_Delay(1); // 添加短暂延时 - - // 确保SPI配置正确 - board_spi_init(AD7124); - - // 拉低CS开始传输 + board_spi_init(AD7124); // 初始化SPI,因为DAC161的SPI要和AD7124共用,并且时序不一样,所以要先初始化SPI接口。 board_spi_cs_on(AD7124); - HAL_Delay(1); // 添加短暂延时 - - // 执行SPI传输 - ret = spi_transmit_receive(&hspi2, buff, length); - - // 等待最后一个字节传输完成 - HAL_Delay(1); - - // 拉高CS结束传输 + ret = spi_transmit_receive(&hspi1, buff, length); board_spi_cs_off(AD7124); - HAL_Delay(1); // 确保CS保持高电平足够长时间 - return ret; } - -// 修改SPI初始化函数 - diff --git a/User/driver/ad7124.h b/User/driver/ad7124.h index 68b5261..e09a5d1 100644 --- a/User/driver/ad7124.h +++ b/User/driver/ad7124.h @@ -6,28 +6,14 @@ /******************************************************************************/ #include "main.h" #include "user_spi.h" - /******************************************************************************/ /******************* Register map and register definitions ********************/ /******************************************************************************/ -// 常量定义 -#define AD7124_CRC8_POLYNOMIAL_REPRESENTATION 0x07 /* x8 + x2 + x + 1 */ -#define AD7124_DISABLE_CRC 0 -#define AD7124_USE_CRC 1 -#define AD7124_RDY 10000 -#define AD7124_RES 100 -#define VREF 2.5f -#define GAIN 1 -#define AD_CODE 0XFFFFFF - -//#define AD7124_4 0x00 -#define AD7124_8 0x01 - /* Communication Register bits */ #define AD7124_COMM_REG_WEN (0 << 7) #define AD7124_COMM_REG_WR (0 << 6) -#define AD7124_COMM_REG_RD (1 << 6) //0x40 +#define AD7124_COMM_REG_RD (1 << 6) #define AD7124_COMM_REG_RA(x) ((x) & 0x3F) /* Status Register bits */ @@ -151,7 +137,6 @@ /* Configuration Registers 0-7 bits */ #define AD7124_CFG_REG_BIPOLAR (1 << 11) -#define AD7124_CFG_REG_UNIPOLAR (0 << 11) // 单极性 #define AD7124_CFG_REG_BURNOUT(x) (((x) & 0x3) << 9) #define AD7124_CFG_REG_REF_BUFP (1 << 8) #define AD7124_CFG_REG_REF_BUFM (1 << 7) @@ -174,127 +159,159 @@ /*! AD7124 registers list*/ typedef enum { - AD7124_STATUS = 0X00,//状态寄存器 - AD7124_ADC_CONTROL,//ADC控制寄存器 - AD7124_DATA,//数据寄存器 - AD7124_IOCON1,//IO控制寄存器1 - AD7124_IOCON2,//IO控制寄存器2 - AD7124_ID,//ID寄存器 - AD7124_ERROR,//错误寄存器 - AD7124_ERROR_EN,//错误使能寄存器 - AD7124_MCLK_COUNT,//MCLK计数寄存器 - AD7124_CHANNEL_0,//通道0 - AD7124_CHANNEL_1,//通道1 - AD7124_CHANNEL_2,//通道2 - AD7124_CHANNEL_3,//通道3 - AD7124_CHANNEL_4,//通道4 - AD7124_CHANNEL_5,//通道5 - AD7124_CHANNEL_6,//通道6 - AD7124_CHANNEL_7,//通道7 - AD7124_CHANNEL_8,//通道8 - AD7124_CHANNEL_9,//通道9 - AD7124_CHANNEL_10,//通道10 - AD7124_CHANNEL_11,//通道11 - AD7124_CHANNEL_12,//通道12 - AD7124_CHANNEL_13,//通道13 - AD7124_CHANNEL_14,//通道14 - AD7124_CHANNEL_15,//通道15 - AD7124_CONFIG_0,//配置寄存器0 - AD7124_CONFIG_1,//配置寄存器1 - AD7124_CONFIG_2,//配置寄存器2 - AD7124_CONFIG_3,//配置寄存器3 - AD7124_CONFIG_4,//配置寄存器4 - AD7124_CONFIG_5,//配置寄存器5 - AD7124_CONFIG_6,//配置寄存器6 - AD7124_CONFIG_7,//配置寄存器7 - AD7124_FILTER_0,//滤波寄存器0 - AD7124_FILTER_1,//滤波寄存器1 - AD7124_FILTER_2,//滤波寄存器2 - AD7124_FILTER_3,//滤波寄存器3 - AD7124_FILTER_4,//滤波寄存器4 - AD7124_FILTER_5,//滤波寄存器5 - AD7124_FILTER_6,//滤波寄存器6 - AD7124_FILTER_7,//滤波寄存器7 - AD7124_OFFSET_0,//偏移寄存器0 - AD7124_OFFSET_1,//偏移寄存器1 - AD7124_OFFSET_2,//偏移寄存器2 - AD7124_OFFSET_3,//偏移寄存器3 - AD7124_OFFSET_4,//偏移寄存器4 - AD7124_OFFSET_5,//偏移寄存器5 - AD7124_OFFSET_6,//偏移寄存器6 - AD7124_OFFSET_7,//偏移寄存器7 - AD7124_GAIN_0,//增益寄存器0 - AD7124_GAIN_1,//增益寄存器1 - AD7124_GAIN_2,//增益寄存器2 - AD7124_GAIN_3,//增益寄存器3 - AD7124_GAIN_4,//增益寄存器4 - AD7124_GAIN_5,//增益寄存器5 - AD7124_GAIN_6,//增益寄存器6 - AD7124_GAIN_7,//增益寄存器7 - AD7124_REG_NO//寄存器数量 -} ad7124_registers_addr_e; - + AD7124_STATUS = 0X00, // 只读的状态寄存器,读取芯片状态 + AD7124_ADC_CONTROL, // 控制寄存器,设置采样速率等 + AD7124_DATA, // 数据寄存器,读取采样数据 + AD7124_IOCON1, // 设置激励电流等参数,用作RTD测试时可用 + AD7124_IOCON2, // 使能偏置电压 + AD7124_ID, // ID寄存器,部分芯片的ID和手册上有所区别,可用此寄存器测试SPI通讯 + AD7124_ERROR, // 错误寄存器,读取错误信息,读写寄存器之前先读下该寄存器,检测芯片状态是否支持读写 + AD7124_ERROR_EN, // 通过使能该寄存器的相应位来使能或者禁用诊断功能 + AD7124_MCLK_COUNT, // 监控主时钟频率 + AD7124_CHANNEL_0, // 设置AD采样通道和所需要的配置,其中的Setup位决定了采用哪种Config、Filter、Offset、Gain寄存器的配置;共有八种配置 + AD7124_CHANNEL_1, // 通道寄存器的顺序并不是从AI0引脚读到最后一个引脚,而是通过自己的设置来决定顺序 + AD7124_CHANNEL_2, + AD7124_CHANNEL_3, + AD7124_CHANNEL_4, + AD7124_CHANNEL_5, + AD7124_CHANNEL_6, + AD7124_CHANNEL_7, + AD7124_CHANNEL_8, + AD7124_CHANNEL_9, + AD7124_CHANNEL_10, + AD7124_CHANNEL_11, + AD7124_CHANNEL_12, + AD7124_CHANNEL_13, + AD7124_CHANNEL_14, + AD7124_CHANNEL_15, + AD7124_CONFIG_0, // 配置极性,增益,基准选择等参数 + AD7124_CONFIG_1, + AD7124_CONFIG_2, + AD7124_CONFIG_3, + AD7124_CONFIG_4, + AD7124_CONFIG_5, + AD7124_CONFIG_6, + AD7124_CONFIG_7, + AD7124_FILTER_0, + AD7124_FILTER_1, // 配置滤波器 + AD7124_FILTER_2, + AD7124_FILTER_3, + AD7124_FILTER_4, + AD7124_FILTER_5, + AD7124_FILTER_6, + AD7124_FILTER_7, + AD7124_OFFSET_0, + AD7124_OFFSET_1, + AD7124_OFFSET_2, + AD7124_OFFSET_3, + AD7124_OFFSET_4, + AD7124_OFFSET_5, + AD7124_OFFSET_6, + AD7124_OFFSET_7, + AD7124_GAIN_0, + AD7124_GAIN_1, + AD7124_GAIN_2, + AD7124_GAIN_3, + AD7124_GAIN_4, + AD7124_GAIN_5, + AD7124_GAIN_6, + AD7124_GAIN_7, + AD7124_REG_NO +} ad7124_registers_addr_e; // 寄存器地址 typedef enum { + AD7124_SIZE_1 = 1, AD7124_SIZE_2 = 2, AD7124_SIZE_3 = 3, -} ad7124_registers_size_e; - +} ad7124_registers_size_e; // 寄存器字节大小 typedef enum { - AD7124_RW = 1,//读写 - AD7124_R = 2,//读 - AD7124_W = 3,//写 -} ad7124_registers_rw_e; + AD7124_RW = 1, + AD7124_R = 2, + AD7124_W = 3, +} ad7124_registers_rw_e; // 寄存器读写操作 typedef struct { - int addr; - int value; - int size; - int rw; -} ad7124_st_reg_t; + int addr; // 寄存器地址,ad7124_registers_e + int value; // 寄存器值 + int size; // 寄存器字节大小 + int rw; // 寄存器可执行的操作,ad7124_registers_rw_e +} ad7124_st_reg_t; // AD7124寄存器结构体 typedef enum { - STOP_NC_ADC = 0, - STOP_NO_ADC, - AI_IN1_ADC, - AI_IN2_ADC, - P1_DI2_ADC, - P1_DI1_ADC, - P1_AI_ADC, - P2_DI2_ADC, - P2_DI1_ADC, - P2_AI_ADC, + + 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_CHANNEL_EN_MAX, -} ad7124_channel_e; +} ad7124_channel_e; // 该项目所使用的通道 typedef struct { uint8_t channel; - int32_t data; - float voltage; - float current; -} ad7124_analog_t; + int32_t data; // 采样数据 + float voltage; // 电压值 + float current; // 电流值 +} ad7124_analog_t; // 采样数据结构体 -// 声明外部变量 -extern ad7124_st_reg_t ad7124_regs[AD7124_REG_NO]; -extern ad7124_st_reg_t ad7124_channel_regs[AD7124_CHANNEL_EN_MAX]; -extern int32_t g_ad7124_id; -// 函数声明 -int32_t ad7124_read_register(ad7124_st_reg_t *p_reg);//读取寄存器 -int32_t ad7124_write_register(ad7124_st_reg_t *reg);//写入寄存器 -int32_t ad7124_no_check_read_register(ad7124_st_reg_t *p_reg);//不检查读取寄存器 -int32_t ad7124_no_check_write_register(ad7124_st_reg_t *reg);//不检查写入寄存器 -int32_t ad7124_reset(void);//复位 -int32_t ad7124_wait_for_spi_ready(uint32_t timeout);//等待SPI准备好 -int32_t ad7124_wait_to_power_on(uint32_t timeout);//等待电源开启 -int32_t ad7124_wait_for_conv_ready(uint32_t timeout);//等待转换准备好 -int32_t ad7124_read_data(void);//读取数据 -void ad7124_get_analog(uint8_t channel_nr);//获取模拟量 -int32_t ad7124_setup(void);//设置 -int32_t ad7124_read_write_spi(uint8_t *buff, uint8_t length);//读写SPI +#define AD7124_CRC8_POLYNOMIAL_REPRESENTATION 0x07 /* x8 + x2 + x + 1 */ +#define AD7124_DISABLE_CRC 0 // 默认关闭校验 +#define AD7124_USE_CRC 1 -#endif /* __AD7124_H */ +#define AD7124_RDY 10000 // 等待时间 + +#define AD7124_RES 100 // 采样基准电阻 +#define VREF 2.5f // 基准电压 +#define GAIN 1 // 增益,该值和配置寄存器有关 +//#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); // 读寄存器 + +/*! Writes the value of the specified register. */ +int32_t ad7124_write_register(ad7124_st_reg_t *reg); // 写寄存器 + +/*! Reads the value of the specified register without a device state check. */ +int32_t ad7124_no_check_read_register(ad7124_st_reg_t *p_reg); + +/*! Writes the value of the specified register without a device state check. */ +int32_t ad7124_no_check_write_register(ad7124_st_reg_t *reg); + +/*! Resets the device. */ +int32_t ad7124_reset(void); // 复位ad7124芯片 + +/*! Waits until the device can accept read and write user actions. */ +int32_t ad7124_wait_for_spi_ready(uint32_t timeout); // 读取ad7124芯片状态,直到可以执行读写操作 + +/*! Waits until the device finishes the power-on reset operation. */ +int32_t ad7124_wait_to_power_on(uint32_t timeout); + +/*! Waits until a new conversion result is available. */ +int32_t ad7124_wait_for_conv_ready(uint32_t timeout); // 等待转换完成 + +/*! Reads the conversion result from the device. */ +int32_t ad7124_read_data(void); +void ad7124_get_analog(uint8_t channel_nr); +/*! Initializes the AD7124. */ +int32_t ad7124_setup(void); + +int32_t ad7124_read_write_spi(uint8_t *buff, uint8_t length); + +#endif /* __AD7124_H__ */ diff --git a/User/system/user_spi.c b/User/system/user_spi.c index 54c6198..2adfa7b 100644 --- a/User/system/user_spi.c +++ b/User/system/user_spi.c @@ -31,7 +31,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_64; // 降低速度以确保稳定性 + hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; // 降低速度以确保稳定性 hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi2.Init.TIMode = SPI_TIMODE_DISABLE; hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;