From f064a13b30c6cd7e91721c1c0e94e168a6925827 Mon Sep 17 00:00:00 2001 From: qiuxin Date: Fri, 30 May 2025 16:41:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(ad7124):=20=E6=94=AF=E6=8C=81=E5=8F=8C?= =?UTF-8?q?=E9=80=9A=E9=81=93=20AD7124?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增第二个 AD7124 设备的初始化和配置 - 实现两个 AD7124 设备的独立读取和控制 - 更新相关函数以支持设备编号参数 - 调整寄存器数组和通道寄存器数组以支持两个设备 --- Core/Inc/main.h | 2 +- Core/Src/freertos.c | 57 ++------ Core/Src/main.c | 1 + User/application/src/tcpserverc.c | 19 ++- User/driver/ad7124.c | 210 +++++++++++++++++++++++------- User/driver/ad7124.h | 27 ++-- User/system/user_spi.c | 42 ++++-- User/system/user_spi.h | 11 +- 8 files changed, 238 insertions(+), 131 deletions(-) diff --git a/Core/Inc/main.h b/Core/Inc/main.h index e6db426..dd57bd8 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -222,7 +222,7 @@ extern "C" #define SPI2_MOSI_GPIO_Port GPIOC #define SPI2_CS_Pin GPIO_PIN_10 #define SPI2_CS_GPIO_Port GPIOD -//背面的AD7124 +//背面第二块AD7124 #define SPI2_CS2_Pin GPIO_PIN_11 #define SPI2_CS2_GPIO_Port GPIOD diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 1716548..244a967 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -326,15 +326,23 @@ void start_led_toggle_task(void const *argument) void start_adc_task(void const *argument) { /* USER CODE BEGIN start_adc_task */ - ad7124_setup(); + // 初始化两个AD7124设备 + ad7124_setup(1); // 初始化两个AD7124设备 + ad7124_setup(2); // 初始化两个AD7124设备 + /* Infinite loop */ for (;;) { - - uint8_t ch = 0; - for (ch = AD7124_AIN0; ch < AD7124_CHANNEL_EN_MAX; ch++) + // 读取第一个AD7124的所有通道 + for (uint8_t ch = AD7124_AIN0; ch < AD7124_CHANNEL_EN_MAX; ch++) { - ad7124_get_analog(ch); + ad7124_get_analog(ch, 1); + } + + // 读取第二个AD7124的所有通道 + for (uint8_t ch = AD7124_AIN0; ch < AD7124_CHANNEL_EN_MAX; ch++) + { + ad7124_get_analog(ch, 2); } vTaskDelay(10); @@ -382,45 +390,6 @@ void start_ec11_task(void const *argument) /* USER CODE END start_ec11_task */ } - - -/** - * @brief Initialize AD7124 with multiple channels - * @param sample_rate: Sample rate selection (2Hz to 1kHz) - * @retval None - */ - -/* 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); - } -} - -/* USER CODE BEGIN Header_start_usart6_test_task */ -/** - * @brief Function implementing the usart6_test_task thread. - * @param argument: Not used - * @retval None - */ -/* USER CODE END Header_start_usart6_test_task */ // 添加UART接收回调函数声明 static void UART6_RxCpltCallback(void); diff --git a/Core/Src/main.c b/Core/Src/main.c index 40409d9..2f64c85 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -128,6 +128,7 @@ int main(void) //MX_DMA_Init(); dac161s997_spi_init(); dac8568_spi_init(); + ad7124_spi_init(); //MX_TIM3_Init(); //MX_SPI1_Init(); MX_USART6_UART_Init(); diff --git a/User/application/src/tcpserverc.c b/User/application/src/tcpserverc.c index 6c6cd0e..a2ad95e 100644 --- a/User/application/src/tcpserverc.c +++ b/User/application/src/tcpserverc.c @@ -388,7 +388,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 + 76 + 2; // 帧头+帧长+源+目标+类型+76字节输出读取+校验 = 87字节 + uint16_t total_len = 2 + 2 + 2 + 2 + 1 + 140 + 2; // 帧头+帧长+源+目标+类型+140字节输出读取+校验 = 151字节 // 帧头 tx[0] = head_00; @@ -417,7 +417,7 @@ uint16_t handle_type_87(const uint8_t *body, uint16_t body_len, uint8_t *tx) tx[11] = tca6416_port5_status; // 第三个TCA6416的Port0状态(地址0x20)外部端口0-7 tx[12] = tca6416_port4_status; // 第三个TCA6416的Port1状态(地址0x20)外部端口8-15 - // 填充AD7124原始数据到tx[13]~tx[76],每通道4字节,MSB格式 + // 填充第一个AD7124原始数据到tx[13]~tx[76],每通道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; @@ -426,15 +426,20 @@ uint16_t handle_type_87(const uint8_t *body, uint16_t body_len, uint8_t *tx) tx[13 + ch * 4 + 2] = (data >> 8) & 0xFF; tx[13 + ch * 4 + 3] = (data) & 0xFF; } - - // 其余tx[77]~tx[84]可按需要填充(如比例阀等),此处保持原样或补零 - for (int i = 13 + AD7124_CHANNEL_EN_MAX * 4; i < 85; ++i) { - tx[i] = 0; + + // 填充第二个AD7124原始数据到tx[77]~tx[140],每通道4字节,MSB格式 + extern ad7124_analog_t ad7124_analog2[AD7124_CHANNEL_EN_MAX]; + for (int ch = 0; ch < AD7124_CHANNEL_EN_MAX; ++ch) { + int32_t data = ad7124_analog2[ch].data; + tx[77 + ch * 4 + 0] = (data >> 24) & 0xFF; + tx[77 + ch * 4 + 1] = (data >> 16) & 0xFF; + tx[77 + ch * 4 + 2] = (data >> 8) & 0xFF; + tx[77 + ch * 4 + 3] = (data) & 0xFF; } // 校验和(从源地址到数据结束) uint16_t checksum = 0; - for (int i = 4; i < 85; ++i) // 4~84(源地址+目标地址+类型+76字节数据) + for (int i = 4; i < total_len - 2; ++i) // 4到倒数第3个字节(源地址到数据结束) { checksum += tx[i]; } diff --git a/User/driver/ad7124.c b/User/driver/ad7124.c index 970374e..fbd7e5e 100644 --- a/User/driver/ad7124.c +++ b/User/driver/ad7124.c @@ -1,4 +1,5 @@ #include "ad7124.h" +#include // 添加标准整型定义 /* Error codes */ #define INVALID_VAL -1 /* Invalid argument */ #define COMM_ERR -2 /* Communication error on receive */ @@ -85,8 +86,92 @@ static ad7124_st_reg_t ad7124_channel_regs[AD7124_CHANNEL_EN_MAX] = { {AD7124_CHANNEL_15, 0x81F1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_15 */ }; - ad7124_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX] = {NULL}; // AD通道采样结构体数组,用于存放AD通道采样数据 + +// 为第二个AD7124设备创建寄存器数组 +static ad7124_st_reg_t ad7124_regs2[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 */ + {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 */ + {AD7124_ID, 0x02, AD7124_SIZE_1, AD7124_R}, /* AD7124_ID */ + {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, 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, 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 */ + {AD7124_FILTER_3, 0x060180, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Filter_3 */ + {AD7124_FILTER_4, 0x060180, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Filter_4 */ + {AD7124_FILTER_5, 0x060180, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Filter_5 */ + {AD7124_FILTER_6, 0x060180, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Filter_6 */ + {AD7124_FILTER_7, 0x060180, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Filter_7 */ + {AD7124_OFFSET_0, 0x800000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Offset_0 */ + {AD7124_OFFSET_1, 0x800000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Offset_1 */ + {AD7124_OFFSET_2, 0x800000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Offset_2 */ + {AD7124_OFFSET_3, 0x800000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Offset_3 */ + {AD7124_OFFSET_4, 0x800000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Offset_4 */ + {AD7124_OFFSET_5, 0x800000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Offset_5 */ + {AD7124_OFFSET_6, 0x800000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Offset_6 */ + {AD7124_OFFSET_7, 0x800000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Offset_7 */ + {AD7124_GAIN_0, 0x500000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Gain_0 */ + {AD7124_GAIN_1, 0x500000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Gain_1 */ + {AD7124_GAIN_2, 0x500000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Gain_2 */ + {AD7124_GAIN_3, 0x500000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Gain_3 */ + {AD7124_GAIN_4, 0x500000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Gain_4 */ + {AD7124_GAIN_5, 0x500000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Gain_5 */ + {AD7124_GAIN_6, 0x500000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Gain_6 */ + {AD7124_GAIN_7, 0x500000, AD7124_SIZE_3, AD7124_RW}, /* AD7124_Gain_7 */ +}; + +// 为第二个AD7124设备创建通道寄存器数组 +static ad7124_st_reg_t ad7124_channel_regs2[AD7124_CHANNEL_EN_MAX] = { + {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设备创建模拟数据数组 +ad7124_analog_t ad7124_analog2[AD7124_CHANNEL_EN_MAX] = {NULL}; + /** * @brief 无校验读取AD7124寄存器 * @@ -96,7 +181,7 @@ ad7124_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX] = {NULL}; // AD通道采样 * * @return 读取成功返回0,失败返回负值 */ -int32_t ad7124_no_check_read_register(ad7124_st_reg_t *p_reg) +int32_t ad7124_no_check_read_register(ad7124_st_reg_t *p_reg, uint8_t device_num ) { int32_t ret = 0; uint8_t buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; @@ -118,7 +203,7 @@ int32_t ad7124_no_check_read_register(ad7124_st_reg_t *p_reg) } /* Read data from the device */ - ret = ad7124_read_write_spi(buffer, p_reg->size + 1 + add_status_length); + ret = ad7124_read_write_spi(buffer, p_reg->size + 1 + add_status_length, device_num); if (ret < 0) return ret; @@ -150,7 +235,7 @@ int32_t ad7124_no_check_read_register(ad7124_st_reg_t *p_reg) * @param reg 指向要写入数据的寄存器地址和值的指针 * @return 写入结果,成功返回0,失败返回负值 */ -int32_t ad7124_no_check_write_register(ad7124_st_reg_t *reg) +int32_t ad7124_no_check_write_register(ad7124_st_reg_t *reg, uint8_t device_num) { int32_t ret = 0; int32_t reg_value = 0; @@ -170,7 +255,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); + ret = ad7124_read_write_spi(wr_buf, reg->size + 1, device_num); return ret; } @@ -186,18 +271,18 @@ int32_t ad7124_no_check_write_register(ad7124_st_reg_t *reg) * * 在读取寄存器之前,会先检查ERROR寄存器的SPI_IGNORE_ERR位 */ -int32_t ad7124_read_register(ad7124_st_reg_t *p_reg) +int32_t ad7124_read_register(ad7124_st_reg_t *p_reg, uint8_t device_num) { int32_t ret; if (p_reg->addr != AD7124_ERROR && (ad7124_regs[AD7124_ERROR_EN].value & AD7124_ERREN_REG_SPI_IGNORE_ERR_EN)) { - ret = ad7124_wait_for_spi_ready(AD7124_RDY); // 读寄存器之前检查ERROR寄存器的SPI_IGNORE_ERR位 + ret = ad7124_wait_for_spi_ready(AD7124_RDY, device_num); // 读寄存器之前检查ERROR寄存器的SPI_IGNORE_ERR位 if (ret < 0) return ret; } - ret = ad7124_no_check_read_register(p_reg); + ret = ad7124_no_check_read_register(p_reg, device_num); return ret; } @@ -211,17 +296,17 @@ int32_t ad7124_read_register(ad7124_st_reg_t *p_reg) * * @return 返回写入操作的结果。如果操作成功,则返回0;否则返回负数表示错误。 */ -int32_t ad7124_write_register(ad7124_st_reg_t *p_reg) +int32_t ad7124_write_register(ad7124_st_reg_t *p_reg, uint8_t device_num) { int32_t ret; if ((ad7124_regs[AD7124_ERROR_EN].value & AD7124_ERREN_REG_SPI_IGNORE_ERR_EN)) { - ret = ad7124_wait_for_spi_ready(AD7124_RDY); + ret = ad7124_wait_for_spi_ready(AD7124_RDY, device_num); if (ret < 0) return ret; } - ret = ad7124_no_check_write_register(p_reg); + ret = ad7124_no_check_write_register(p_reg, device_num); return ret; } @@ -233,19 +318,20 @@ int32_t ad7124_write_register(ad7124_st_reg_t *p_reg) * * @return 返回函数执行结果,成功返回0,失败返回错误码。 */ -int32_t ad7124_reset(void) +int32_t ad7124_reset(uint8_t device_num) { int32_t ret = 0; uint8_t wr_buf[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 发送64个1,复位ad7124芯片 - ret = ad7124_read_write_spi(wr_buf, 8); + ret = ad7124_read_write_spi(wr_buf, 8, device_num); /* Read POR bit to clear */ - ret = ad7124_wait_to_power_on(AD7124_RDY); + ret = ad7124_wait_to_power_on(AD7124_RDY, device_num); return ret; } + /** * @brief 等待SPI接口准备就绪 * @@ -254,7 +340,7 @@ int32_t ad7124_reset(void) * @param timeout 超时时间(单位:毫秒) * @return 成功返回0,超时返回AD7124_TIMEOUT */ -int32_t ad7124_wait_for_spi_ready(uint32_t timeout) +int32_t ad7124_wait_for_spi_ready(uint32_t timeout, uint8_t device_num) { int32_t ret; int8_t ready = 0; @@ -262,7 +348,7 @@ int32_t ad7124_wait_for_spi_ready(uint32_t timeout) while (!ready && --timeout) { /* Read the value of the Error Register */ - ret = ad7124_read_register(&ad7124_regs[AD7124_ERROR]); + ret = ad7124_read_register(&ad7124_regs[AD7124_ERROR], device_num); if (ret < 0) return ret; @@ -283,14 +369,14 @@ int32_t ad7124_wait_for_spi_ready(uint32_t timeout) * * @return 返回0表示成功,返回AD7124_TIMEOUT表示超时 */ -int32_t ad7124_wait_to_power_on(uint32_t timeout) +int32_t ad7124_wait_to_power_on(uint32_t timeout, uint8_t device_num) { int32_t ret; int8_t powered_on = 0; while (!powered_on && timeout--) { - ret = ad7124_read_register(&ad7124_regs[AD7124_STATUS]); + ret = ad7124_read_register(&ad7124_regs[AD7124_STATUS], device_num); if (ret < 0) return ret; @@ -310,7 +396,7 @@ int32_t ad7124_wait_to_power_on(uint32_t timeout) * @param timeout 超时时间 * @return 成功时返回0,超时时返回AD7124_TIMEOUT */ -int32_t ad7124_wait_for_conv_ready(uint32_t timeout) +int32_t ad7124_wait_for_conv_ready(uint32_t timeout, uint8_t device_num) { int32_t ret; int8_t ready = 0; @@ -318,7 +404,7 @@ int32_t ad7124_wait_for_conv_ready(uint32_t timeout) while (!ready && --timeout) { /* Read the value of the Status Register */ - ret = ad7124_read_register(&ad7124_regs[AD7124_STATUS]); + ret = ad7124_read_register(&ad7124_regs[AD7124_STATUS], device_num); if (ret < 0) return ret; @@ -337,68 +423,70 @@ int32_t ad7124_wait_for_conv_ready(uint32_t timeout) * * @return 读取到的数据值 */ -int32_t ad7124_read_data(void) +int32_t ad7124_read_data(uint8_t device_num) { 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], device_num); /* Get the read result */ read_data = ad7124_regs[AD7124_DATA].value; return read_data; } -void ad7124_get_analog(uint8_t channel_nr) +void ad7124_get_analog(uint8_t channel_nr, uint8_t device_num) { int32_t read_data; - // 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_write_register(&ad7124_regs[AD7124_CHANNEL_0], device_num); - while (ad7124_wait_for_conv_ready(AD7124_RDY)) - ; // 等待转换完成 + while (ad7124_wait_for_conv_ready(AD7124_RDY, device_num)); ad7124_analog[channel_nr].channel = channel_nr; - read_data = ad7124_read_data(); + read_data = ad7124_read_data(device_num); 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_analog[channel_nr].voltage = (float)(read_data * VREF / GAIN / AD_CODE); ad7124_regs[AD7124_CHANNEL_0].value = 0; - ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0]); - // } + ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0], device_num); } + + + /** * @brief 配置AD7124设备 * - * 该函数负责初始化AD7124设备,初始化寄存器。 + * 该函数负责初始化指定的AD7124设备,初始化寄存器。 * + * @param device_num 设备号(1或2) * @return 初始化结果,成功返回0,失败返回负数 */ -int32_t ad7124_setup(void) +int32_t ad7124_setup(uint8_t device_num) { int32_t ret; uint8_t reg_nr; - // board_spi_init(AD7124); // 初始化SPI,因为DAC161的SPI要和AD7124共用,并且时序不一样,所以要先初始化SPI接口。 - /* Reset the device interface.*/ - ret = ad7124_reset(); + ad7124_st_reg_t *regs = (device_num == 1) ? ad7124_regs : ad7124_regs2; + + ret = ad7124_reset(device_num); if (ret < 0) return ret; HAL_Delay(10); - 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_STATUS到AD7124_OFFSET_0 + + ad7124_read_register(®s[AD7124_ID], device_num); + + // 初始化设备寄存器 + for (reg_nr = AD7124_STATUS; reg_nr < AD7124_OFFSET_0; reg_nr++) { - // ret = ad7124_read_register(&ad7124_regs[reg_nr]); - if (ad7124_regs[reg_nr].rw == AD7124_RW) + if (regs[reg_nr].rw == AD7124_RW) { - ret = ad7124_write_register(&ad7124_regs[reg_nr]);//对AD7124的寄存器进行配置,包括ADC控制寄存器、滤波器配置等。 - ret = ad7124_read_register(&ad7124_regs[reg_nr]); + ret = ad7124_write_register(®s[reg_nr], device_num); + ret = ad7124_read_register(®s[reg_nr], device_num); if (ret < 0) break; } } - HAL_GPIO_WritePin(AD7124_SYNC_GPIO_Port, AD7124_SYNC_Pin, GPIO_PIN_SET); // AD7124同步信号使能 + + // 使能AD7124同步信号 + HAL_GPIO_WritePin(AD7124_SYNC_GPIO_Port, AD7124_SYNC_Pin, GPIO_PIN_SET); return ret; } @@ -412,13 +500,35 @@ int32_t ad7124_setup(void) * * @return 传输结果,成功返回0,失败返回负数 */ -int32_t ad7124_read_write_spi(uint8_t *buff, uint8_t length) +int32_t ad7124_read_write_spi(uint8_t *buff, uint8_t length, uint8_t device_num) { int32_t ret; - board_spi_init(AD7124); - board_spi_cs_on(AD7124); + //board_spi_init(AD7124); + ad7124_cs_on(device_num); ret = AD7124_OUT_spi_transmit_receive(buff, length); - board_spi_cs_off(AD7124); + ad7124_cs_off(device_num); return ret; } + + +// void ad7124_get_analog(uint8_t channel_nr, uint8_t device_num) +// { +// int32_t read_data; +// ad7124_st_reg_t *regs = (device_num == 1) ? ad7124_regs : ad7124_regs2; +// ad7124_st_reg_t *channel_regs = (device_num == 1) ? ad7124_channel_regs : ad7124_channel_regs2; +// ad7124_analog_t *analog = (device_num == 1) ? ad7124_analog : ad7124_analog2; + +// regs[AD7124_CHANNEL_0].value = channel_regs[channel_nr].value; +// ad7124_write_register(®s[AD7124_CHANNEL_0], device_num); + +// while (ad7124_wait_for_conv_ready(AD7124_RDY, device_num)); +// analog[channel_nr].channel = channel_nr; +// read_data = ad7124_read_data(device_num); +// analog[channel_nr].data = read_data; +// analog[channel_nr].voltage = (float)(read_data * VREF / GAIN / AD_CODE); + +// regs[AD7124_CHANNEL_0].value = 0; +// ad7124_write_register(®s[AD7124_CHANNEL_0], device_num); +// } + diff --git a/User/driver/ad7124.h b/User/driver/ad7124.h index 7b529b6..a8ca9e9 100644 --- a/User/driver/ad7124.h +++ b/User/driver/ad7124.h @@ -6,6 +6,7 @@ /******************************************************************************/ #include "main.h" #include "user_spi.h" +#include // 添加标准整型定义 /******************************************************************************/ /******************* Register map and register definitions ********************/ /******************************************************************************/ @@ -283,35 +284,37 @@ typedef struct //#define AD_CODE 0x7FFFFF // 23位ADC /*! Reads the value of the specified register. */ -int32_t ad7124_read_register(ad7124_st_reg_t *p_reg); // 读寄存器 +int32_t ad7124_read_register(ad7124_st_reg_t *p_reg, uint8_t device_num); // 读寄存器 /*! Writes the value of the specified register. */ -int32_t ad7124_write_register(ad7124_st_reg_t *reg); // 写寄存器 +int32_t ad7124_write_register(ad7124_st_reg_t *reg, uint8_t device_num); // 写寄存器 /*! 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); +int32_t ad7124_no_check_read_register(ad7124_st_reg_t *p_reg, uint8_t device_num); /*! Writes the value of the specified register without a device state check. */ -int32_t ad7124_no_check_write_register(ad7124_st_reg_t *reg); +int32_t ad7124_no_check_write_register(ad7124_st_reg_t *reg, uint8_t device_num); /*! Resets the device. */ -int32_t ad7124_reset(void); // 复位ad7124芯片 +int32_t ad7124_reset(uint8_t device_num); // 复位ad7124芯片 /*! Waits until the device can accept read and write user actions. */ -int32_t ad7124_wait_for_spi_ready(uint32_t timeout); // 读取ad7124芯片状态,直到可以执行读写操作 +int32_t ad7124_wait_for_spi_ready(uint32_t timeout, uint8_t device_num); // 读取ad7124芯片状态,直到可以执行读写操作 /*! Waits until the device finishes the power-on reset operation. */ -int32_t ad7124_wait_to_power_on(uint32_t timeout); +int32_t ad7124_wait_to_power_on(uint32_t timeout, uint8_t device_num); /*! Waits until a new conversion result is available. */ -int32_t ad7124_wait_for_conv_ready(uint32_t timeout); // 等待转换完成 +int32_t ad7124_wait_for_conv_ready(uint32_t timeout, uint8_t device_num); // 等待转换完成 /*! Reads the conversion result from the device. */ -int32_t ad7124_read_data(void); -void ad7124_get_analog(uint8_t channel_nr); +int32_t ad7124_read_data(uint8_t device_num); +void ad7124_get_analog(uint8_t channel_nr, uint8_t device_num); /*! Initializes the AD7124. */ -int32_t ad7124_setup(void); +int32_t ad7124_setup(uint8_t device_num); -int32_t ad7124_read_write_spi(uint8_t *buff, uint8_t length); +int32_t ad7124_read_write_spi(uint8_t *buff, uint8_t length, uint8_t device_num); +void ad7124_cs_off(uint8_t device_num); +void ad7124_cs_on(uint8_t device_num); #endif /* __AD7124_H__ */ diff --git a/User/system/user_spi.c b/User/system/user_spi.c index 05a0750..f4d837d 100644 --- a/User/system/user_spi.c +++ b/User/system/user_spi.c @@ -129,6 +129,12 @@ void ad7124_spi_init(void) 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); + // CS (PD11) - Configure as output + GPIO_InitStruct.Pin = GPIO_PIN_11; + 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); // Configure SPI2 hspi2.Instance = SPI2; @@ -264,17 +270,25 @@ void dac161s997_spi_init(void) } -void ad7124_cs_on(void) +void ad7124_cs_on(uint8_t device_num) { - 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 + if (device_num == 1) { + 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 + } else { + 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);//延时1ms } -void ad7124_cs_off(void) +void ad7124_cs_off(uint8_t device_num) { - 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 + if (device_num == 1) { + HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_SET); // 关闭AD7124_CS1 + } else { + HAL_GPIO_WritePin(SPI2_CS2_GPIO_Port, SPI2_CS2_Pin, GPIO_PIN_SET); // 关闭AD7124_CS2 + } HAL_Delay(1); } @@ -309,7 +323,11 @@ void dac161s997_cs_off(uint8_t dac_num) void board_spi_init(chip_type_e chip_type) { switch(chip_type) { - case AD7124: + + case AD7124_1: + ad7124_spi_init(); + break; + case AD7124_2: ad7124_spi_init(); break; case DAC161S997: @@ -323,7 +341,7 @@ void board_spi_init(chip_type_e chip_type) void board_spi_cs_on(chip_type_e chip_type) { switch(chip_type) { - case AD7124: + case AD7124_1: HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_RESET); // AD7124_CS1打开 HAL_Delay(1); break; @@ -338,7 +356,7 @@ void board_spi_cs_on(chip_type_e chip_type) void board_spi_cs_off(chip_type_e chip_type) { switch(chip_type) { - case AD7124: + case AD7124_1: HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_SET); // AD7124_CS1关闭 HAL_Delay(1); break; @@ -351,11 +369,11 @@ void board_spi_cs_off(chip_type_e chip_type) } // Add helper function for AD7124 SPI communication -int32_t ad7124_spi_transmit_receive(uint8_t *data, uint8_t bytes) +int32_t ad7124_spi_transmit_receive(uint8_t *data, uint8_t bytes, uint8_t device_num) { - ad7124_cs_on(); + ad7124_cs_on(device_num); int32_t result = spi_transmit_receive(&hspi2, data, spi_rx_buffer, bytes); - ad7124_cs_off(); + ad7124_cs_off(device_num); return result; } diff --git a/User/system/user_spi.h b/User/system/user_spi.h index 4982741..5857c5d 100644 --- a/User/system/user_spi.h +++ b/User/system/user_spi.h @@ -7,9 +7,10 @@ typedef enum { - AD7124 = 0, - DAC161S997 = 1, - DAC8568 = 2, + AD7124_1 = 0, // 第一个AD7124设备 + AD7124_2 = 1, // 第二个AD7124设备 + DAC161S997 = 2, + DAC8568 = 3, } chip_type_e; // 芯片类型 extern int32_t spi_transmit_receive(SPI_HandleTypeDef *hspi, uint8_t *data_write, uint8_t *data_read, uint8_t bytes_number); @@ -26,8 +27,8 @@ 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); +void ad7124_cs_off(uint8_t device_num); // 更新为支持设备号 +void ad7124_cs_on(uint8_t device_num); // 更新为支持设备号 void ad7124_spi_init(void); #endif