feat(ad7124): 支持双通道 AD7124

- 新增第二个 AD7124 设备的初始化和配置
- 实现两个 AD7124 设备的独立读取和控制
- 更新相关函数以支持设备编号参数
- 调整寄存器数组和通道寄存器数组以支持两个设备
This commit is contained in:
qiuxin 2025-05-30 16:41:28 +08:00
parent c451e7d754
commit f064a13b30
8 changed files with 238 additions and 131 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,5 @@
#include "ad7124.h"
#include <stdint.h> // 添加标准整型定义
/* 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 0AD7124_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 0AD7124_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 0AD7124_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 12
* @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(&regs[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(&regs[reg_nr], device_num);
ret = ad7124_read_register(&regs[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(&regs[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(&regs[AD7124_CHANNEL_0], device_num);
// }

View File

@ -6,6 +6,7 @@
/******************************************************************************/
#include "main.h"
#include "user_spi.h"
#include <stdint.h> // 添加标准整型定义
/******************************************************************************/
/******************* 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__ */

View File

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

View File

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