feat(ad7124): 支持双通道 AD7124
- 新增第二个 AD7124 设备的初始化和配置 - 实现两个 AD7124 设备的独立读取和控制 - 更新相关函数以支持设备编号参数 - 调整寄存器数组和通道寄存器数组以支持两个设备
This commit is contained in:
parent
c451e7d754
commit
f064a13b30
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
|
|
@ -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 成功返回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);
|
||||
// }
|
||||
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue