This commit is contained in:
qiuxin 2025-05-19 19:29:08 +08:00
parent 2a1233826c
commit 69b41c5f5f
7 changed files with 362 additions and 504 deletions

View File

@ -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采集时产生干<E7949F>????????,因为ADC和DAC采用的是同一路SPI但是时序不<E5BA8F>????????
// 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 */

View File

@ -152,9 +152,9 @@
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>147</LineNumber>
<LineNumber>401</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134243296</Address>
<Address>134243228</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
@ -163,55 +163,7 @@
<BreakIfRCount>1</BreakIfRCount>
<Filename>..\User\driver\ad7124.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\semi_finished_product_testing\../User/driver/ad7124.c\147</Expression>
</Bp>
<Bp>
<Number>1</Number>
<Type>0</Type>
<LineNumber>439</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134271122</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>../Core/Src/freertos.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\semi_finished_product_testing\../Core/Src/freertos.c\439</Expression>
</Bp>
<Bp>
<Number>2</Number>
<Type>0</Type>
<LineNumber>422</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134271054</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>../Core/Src/freertos.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\semi_finished_product_testing\../Core/Src/freertos.c\422</Expression>
</Bp>
<Bp>
<Number>3</Number>
<Type>0</Type>
<LineNumber>419</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134271036</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>../Core/Src/freertos.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\semi_finished_product_testing\../Core/Src/freertos.c\419</Expression>
<Expression>\\semi_finished_product_testing\../User/driver/ad7124.c\401</Expression>
</Bp>
</Breakpoint>
<WatchWindow1>
@ -310,6 +262,16 @@
<WinNumber>1</WinNumber>
<ItemText>g_adc_control</ItemText>
</Ww>
<Ww>
<count>19</count>
<WinNumber>1</WinNumber>
<ItemText>ad7124_analog[channel_nr]</ItemText>
</Ww>
<Ww>
<count>20</count>
<WinNumber>1</WinNumber>
<ItemText>read_data,0x10</ItemText>
</Ww>
</WatchWindow1>
<Tracepoint>
<THDelay>0</THDelay>

View File

@ -1,57 +0,0 @@
<html>
<body>
<pre>
<h1>µVision Build Log</h1>
<h2>Tool Versions:</h2>
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
<h2>Project:</h2>
C:\Users\qiuxin.JS250402\Desktop\PCBA\controller_pcba_rtos\MDK-ARM\controller_pcba.uvprojx
Project File Date: 05/14/2025
<h2>Output:</h2>
*** 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).
<h2>Software Packages used:</h2>
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
<h2>Collection of Component include folders:</h2>
.\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
<h2>Collection of Component Files used:</h2>
* Component: ARM::CMSIS:CORE:5.5.0
Include file: CMSIS\Core\Include\tz_context.h
Build Time Elapsed: 00:00:01
</pre>
</body>
</html>

View File

@ -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字节

View File

@ -1,19 +1,13 @@
#include "ad7124.h"
#include "user_spi.h"
#include "usart.h"
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
/* 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初始化函数

View File

@ -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__ */

View File

@ -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;