删除多余文件
This commit is contained in:
parent
e9a38b4371
commit
669b31141d
|
@ -1,8 +0,0 @@
|
||||||
#ifndef _TCPCLIENT_H_
|
|
||||||
#define _TCPCLIENT_H_
|
|
||||||
|
|
||||||
#define TCP_CLIENT_PORT 5001
|
|
||||||
|
|
||||||
void TCP_Client_Init(void);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,104 +0,0 @@
|
||||||
#include "lwip/netif.h"
|
|
||||||
#include "lwip/ip.h"
|
|
||||||
#include "lwip/tcp.h"
|
|
||||||
#include "lwip/init.h"
|
|
||||||
#include "netif/etharp.h"
|
|
||||||
#include "lwip/udp.h"
|
|
||||||
#include "lwip/pbuf.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "main.h"
|
|
||||||
|
|
||||||
static void client_err(void *arg, err_t err) // 出现错误时调用这个函数,打印错误信息,并尝试重新连接
|
|
||||||
{
|
|
||||||
// printf("连接错误!!\n");
|
|
||||||
// printf("尝试重连!!\n");
|
|
||||||
|
|
||||||
// // 连接失败的时候释放TCP控制块的内存
|
|
||||||
// printf("关闭连接,释放TCP控制块内存\n");
|
|
||||||
// // tcp_close(client_pcb);
|
|
||||||
|
|
||||||
// // 重新连接
|
|
||||||
// printf("重新初始化客户端\n");
|
|
||||||
TCP_Client_Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
static err_t client_send(void *arg, struct tcp_pcb *tpcb) // 发送函数,调用了tcp_write函数
|
|
||||||
{
|
|
||||||
// 定义一个用于发送的缓冲区
|
|
||||||
uint8_t send_buf[] = "be connected successfully\n";
|
|
||||||
|
|
||||||
// 发送数据到服务器
|
|
||||||
tcp_write(tpcb, send_buf, sizeof(send_buf), 1);
|
|
||||||
|
|
||||||
// 返回操作成功标志
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static err_t client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
|
|
||||||
{
|
|
||||||
if (p != NULL)
|
|
||||||
{
|
|
||||||
/* 接收数据*/
|
|
||||||
tcp_recved(tpcb, p->tot_len);
|
|
||||||
|
|
||||||
/* 返回接收到的数据*/
|
|
||||||
tcp_write(tpcb, p->payload, p->tot_len, 1);
|
|
||||||
|
|
||||||
memset(p->payload, 0, p->tot_len);
|
|
||||||
pbuf_free(p);
|
|
||||||
}
|
|
||||||
else if (err == ERR_OK)
|
|
||||||
{
|
|
||||||
// 服务器断开连接
|
|
||||||
tcp_close(tpcb);
|
|
||||||
|
|
||||||
// 重新连接
|
|
||||||
TCP_Client_Init();
|
|
||||||
}
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 客户端连接成功的回调函数
|
|
||||||
*
|
|
||||||
* 当客户端成功连接到服务器时,此函数将被调用。
|
|
||||||
*
|
|
||||||
* @param arg 用户提供的参数
|
|
||||||
* @param pcb TCP连接控制块指针
|
|
||||||
* @param err 错误码
|
|
||||||
*
|
|
||||||
* @return 错误码,ERR_OK表示成功
|
|
||||||
*/
|
|
||||||
static err_t client_connected(void *arg, struct tcp_pcb *pcb, err_t err)
|
|
||||||
{
|
|
||||||
// 注册一个周期性回调函数
|
|
||||||
tcp_poll(pcb, client_send, 2);
|
|
||||||
|
|
||||||
// 注册一个接收函数
|
|
||||||
tcp_recv(pcb, client_recv);
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TCP_Client_Init(void)
|
|
||||||
{
|
|
||||||
struct tcp_pcb *client_pcb = NULL; // 这一句一定要放在里面,否则会没用
|
|
||||||
ip4_addr_t server_ip; // 因为客户端要主动去连接服务器,所以要知道服务器的IP地址
|
|
||||||
/* 创建一个TCP控制块 */
|
|
||||||
client_pcb = tcp_new();
|
|
||||||
|
|
||||||
IP4_ADDR(&server_ip, DEST_IP_ADDR0, DEST_IP_ADDR1, DEST_IP_ADDR2, DEST_IP_ADDR3); // 合并IP地址
|
|
||||||
// printf("IP 地址为: %d.%d.%d.%d\n",
|
|
||||||
// ip4_addr1(&server_ip),
|
|
||||||
// ip4_addr2(&server_ip),
|
|
||||||
// ip4_addr3(&server_ip),
|
|
||||||
// ip4_addr4(&server_ip));
|
|
||||||
// printf("客户端开始连接!\n");
|
|
||||||
|
|
||||||
// 开始连接
|
|
||||||
tcp_connect(client_pcb, &server_ip, TCP_CLIENT_PORT, client_connected);
|
|
||||||
ip_set_option(client_pcb, SOF_KEEPALIVE);
|
|
||||||
// 注册异常处理
|
|
||||||
tcp_err(client_pcb, client_err);
|
|
||||||
}
|
|
|
@ -1,455 +0,0 @@
|
||||||
#include "ad7124.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 */
|
|
||||||
|
|
||||||
// 配置ad7124寄存器的值,根据实际项目需求配置
|
|
||||||
static ad7124_st_reg_t ad7124_regs[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, 0x0051, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_0 */
|
|
||||||
{AD7124_CHANNEL_1, 0x0071, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_1 */
|
|
||||||
{AD7124_CHANNEL_2, 0x0091, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_2 */
|
|
||||||
{AD7124_CHANNEL_3, 0x00B1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_3 */
|
|
||||||
{AD7124_CHANNEL_4, 0x00D1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_4 */
|
|
||||||
{AD7124_CHANNEL_5, 0x00F1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_5 */
|
|
||||||
{AD7124_CHANNEL_6, 0x0111, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_6 */
|
|
||||||
{AD7124_CHANNEL_7, 0x0131, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_7 */
|
|
||||||
{AD7124_CHANNEL_8, 0x0151, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_8 */
|
|
||||||
{AD7124_CHANNEL_9, 0x0171, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_9 */
|
|
||||||
{AD7124_CHANNEL_10, 0x0001, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_10 */
|
|
||||||
{AD7124_CHANNEL_11, 0x0001, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_11 */
|
|
||||||
{AD7124_CHANNEL_12, 0x0001, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_12 */
|
|
||||||
{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, 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, 0x060080, 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 */
|
|
||||||
};
|
|
||||||
|
|
||||||
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 */
|
|
||||||
{AD7124_CHANNEL_3, 0x80B1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_3 */
|
|
||||||
{AD7124_CHANNEL_4, 0x80D1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_4 */
|
|
||||||
{AD7124_CHANNEL_5, 0x80F1, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_5 */
|
|
||||||
{AD7124_CHANNEL_6, 0x8111, AD7124_SIZE_2, AD7124_RW}, /* AD7124_Channel_6 */
|
|
||||||
{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_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX] = {NULL}; // AD通道采样结构体数组,用于存放AD通道采样数据
|
|
||||||
/**
|
|
||||||
* @brief 无校验读取AD7124寄存器
|
|
||||||
*
|
|
||||||
* 读取AD7124的寄存器值,不进行校验。
|
|
||||||
*
|
|
||||||
* @param p_reg 指向要读取的寄存器结构的指针
|
|
||||||
*
|
|
||||||
* @return 读取成功返回0,失败返回负值
|
|
||||||
*/
|
|
||||||
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;
|
|
||||||
|
|
||||||
/* 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; // 此处是根据寄存器配置而决定,根据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;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 向AD7124寄存器写入数据,不进行校验
|
|
||||||
*
|
|
||||||
* 将数据写入指定的AD7124寄存器,不进行数据校验。
|
|
||||||
*
|
|
||||||
* @param reg 指向要写入数据的寄存器地址和值的指针
|
|
||||||
* @return 写入结果,成功返回0,失败返回负值
|
|
||||||
*/
|
|
||||||
int32_t ad7124_no_check_write_register(ad7124_st_reg_t *reg)
|
|
||||||
{
|
|
||||||
int32_t ret = 0;
|
|
||||||
int32_t reg_value = 0;
|
|
||||||
uint8_t wr_buf[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
|
||||||
uint8_t i = 0;
|
|
||||||
|
|
||||||
/* Build the Command word */
|
|
||||||
wr_buf[0] = AD7124_COMM_REG_WEN | AD7124_COMM_REG_WR |
|
|
||||||
AD7124_COMM_REG_RA(reg->addr);
|
|
||||||
|
|
||||||
/* Fill the write buffer */
|
|
||||||
reg_value = reg->value;
|
|
||||||
for (i = 0; i < reg->size; i++)
|
|
||||||
{
|
|
||||||
wr_buf[reg->size - i] = reg_value & 0xFF;
|
|
||||||
reg_value >>= 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write data to the device */
|
|
||||||
ret = ad7124_read_write_spi(wr_buf, reg->size + 1);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 从AD7124寄存器读取数据
|
|
||||||
*
|
|
||||||
* 该函数用于从AD7124的指定寄存器中读取数据。
|
|
||||||
*
|
|
||||||
* @param p_reg 指向一个ad7124_st_reg_t类型的指针,其中包含了要读取的寄存器的地址。
|
|
||||||
*
|
|
||||||
* @return 返回读取到的数据,如果读取失败则返回负数。
|
|
||||||
*
|
|
||||||
* 在读取寄存器之前,会先检查ERROR寄存器的SPI_IGNORE_ERR位
|
|
||||||
*/
|
|
||||||
int32_t ad7124_read_register(ad7124_st_reg_t *p_reg)
|
|
||||||
{
|
|
||||||
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位
|
|
||||||
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
ret = ad7124_no_check_read_register(p_reg);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 向AD7124寄存器写入数据
|
|
||||||
*
|
|
||||||
* 将数据写入AD7124的指定寄存器。如果错误寄存器中启用了忽略SPI错误的功能,则在写入前会等待SPI接口准备就绪。
|
|
||||||
*
|
|
||||||
* @param p_reg 指向要写入数据的寄存器结构体的指针
|
|
||||||
*
|
|
||||||
* @return 返回写入操作的结果。如果操作成功,则返回0;否则返回负数表示错误。
|
|
||||||
*/
|
|
||||||
int32_t ad7124_write_register(ad7124_st_reg_t *p_reg)
|
|
||||||
{
|
|
||||||
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);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
ret = ad7124_no_check_write_register(p_reg);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 重置AD7124设备
|
|
||||||
*
|
|
||||||
* 该函数通过SPI接口向AD7124发送重置命令,并等待设备完成上电过程。
|
|
||||||
*
|
|
||||||
* @return 返回函数执行结果,成功返回0,失败返回错误码。
|
|
||||||
*/
|
|
||||||
int32_t ad7124_reset(void)
|
|
||||||
{
|
|
||||||
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);
|
|
||||||
|
|
||||||
/* Read POR bit to clear */
|
|
||||||
ret = ad7124_wait_to_power_on(AD7124_RDY);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 等待SPI接口准备就绪
|
|
||||||
*
|
|
||||||
* 等待AD7124的SPI接口准备就绪,直到超时。
|
|
||||||
*
|
|
||||||
* @param timeout 超时时间(单位:毫秒)
|
|
||||||
* @return 成功返回0,超时返回AD7124_TIMEOUT
|
|
||||||
*/
|
|
||||||
int32_t ad7124_wait_for_spi_ready(uint32_t timeout)
|
|
||||||
{
|
|
||||||
int32_t ret;
|
|
||||||
int8_t ready = 0;
|
|
||||||
|
|
||||||
while (!ready && --timeout)
|
|
||||||
{
|
|
||||||
/* Read the value of the Error Register */
|
|
||||||
ret = ad7124_read_register(&ad7124_regs[AD7124_ERROR]);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* Check the SPI IGNORE Error bit in the Error Register */
|
|
||||||
ready = (ad7124_regs[AD7124_ERROR].value &
|
|
||||||
AD7124_ERR_REG_SPI_IGNORE_ERR) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return timeout ? 0 : AD7124_TIMEOUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 等待AD7124电源开启
|
|
||||||
*
|
|
||||||
* 此函数将等待AD7124设备电源开启,直到超时或检测到电源开启标志。
|
|
||||||
*
|
|
||||||
* @param timeout 超时时间
|
|
||||||
*
|
|
||||||
* @return 返回0表示成功,返回AD7124_TIMEOUT表示超时
|
|
||||||
*/
|
|
||||||
int32_t ad7124_wait_to_power_on(uint32_t timeout)
|
|
||||||
{
|
|
||||||
int32_t ret;
|
|
||||||
int8_t powered_on = 0;
|
|
||||||
|
|
||||||
while (!powered_on && timeout--)
|
|
||||||
{
|
|
||||||
ret = ad7124_read_register(&ad7124_regs[AD7124_STATUS]);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* Check the POR_FLAG bit in the Status Register */
|
|
||||||
powered_on = (ad7124_regs[AD7124_STATUS].value &
|
|
||||||
AD7124_STATUS_REG_POR_FLAG) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (timeout || powered_on) ? 0 : AD7124_TIMEOUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 等待AD7124转换准备就绪
|
|
||||||
*
|
|
||||||
* 该函数等待AD7124完成转换并准备就绪。如果等待超时,则返回错误码。
|
|
||||||
*
|
|
||||||
* @param timeout 超时时间
|
|
||||||
* @return 成功时返回0,超时时返回AD7124_TIMEOUT
|
|
||||||
*/
|
|
||||||
int32_t ad7124_wait_for_conv_ready(uint32_t timeout)
|
|
||||||
{
|
|
||||||
int32_t ret;
|
|
||||||
int8_t ready = 0;
|
|
||||||
|
|
||||||
while (!ready && --timeout)
|
|
||||||
{
|
|
||||||
/* Read the value of the Status Register */
|
|
||||||
ret = ad7124_read_register(&ad7124_regs[AD7124_STATUS]);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* Check the RDY bit in the Status Register */
|
|
||||||
ready = (ad7124_regs[AD7124_STATUS].value &
|
|
||||||
AD7124_STATUS_REG_RDY) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return timeout ? 0 : AD7124_TIMEOUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 从AD7124读取数据
|
|
||||||
*
|
|
||||||
* 从AD7124的数据寄存器中读取数据值。
|
|
||||||
*
|
|
||||||
* @return 读取到的数据值
|
|
||||||
*/
|
|
||||||
int32_t ad7124_read_data(void)
|
|
||||||
{
|
|
||||||
int32_t read_data;
|
|
||||||
/* Read the value of the Status Register */
|
|
||||||
ad7124_read_register(&ad7124_regs[AD7124_DATA]);
|
|
||||||
/* Get the read result */
|
|
||||||
read_data = ad7124_regs[AD7124_DATA].value;
|
|
||||||
|
|
||||||
return read_data;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief 从AD7124获取模拟信号数据
|
|
||||||
*
|
|
||||||
* 该函数通过SPI接口从AD7124芯片获取模拟信号数据,并将数据保存到ad7124_analog中。
|
|
||||||
*
|
|
||||||
* @details
|
|
||||||
* - 遍历所有模拟通道,对每个通道执行以下操作:
|
|
||||||
* - 等待AD7124完成转换。
|
|
||||||
* - 读取转换后的数据。
|
|
||||||
* - 计算电压值(单极性计算公式)。
|
|
||||||
* - 计算电流值(基于电压值和电阻值),有的通道没有电流值可以忽略。
|
|
||||||
*
|
|
||||||
* @note
|
|
||||||
* - 转换完成后,通过公式计算电压和电流值,并将结果保存到全局数组ad7124_analog中。
|
|
||||||
* - 电压计算公式:Code = (0xFFFFFF × AIN × Gain)/VREF,其中VREF为参考电压,GAIN为增益,AD_CODE为AD代码。
|
|
||||||
* - 电流计算公式:电流 = 电压 / 电阻 * 1000,其中电阻值为AD7124_RES,单位转换为mA。
|
|
||||||
*/
|
|
||||||
// void ad7124_get_analog(void)
|
|
||||||
// {
|
|
||||||
// int32_t read_data;
|
|
||||||
// uint8_t i;
|
|
||||||
// uint8_t channel;
|
|
||||||
// // for (i = STOP_NC_ADC; i < AD7124_CHANNEL_EN_MAX; i++)
|
|
||||||
// // {
|
|
||||||
// // ad7124_regs[AD7124_CHANNEL_0].value = ad7124_channel_regs[i].value;
|
|
||||||
// // ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0]);
|
|
||||||
|
|
||||||
// // ad7124_read_register(&ad7124_regs[AD7124_STATUS]);
|
|
||||||
// while (ad7124_wait_for_conv_ready(AD7124_RDY))
|
|
||||||
// ; // 等待转换完成
|
|
||||||
// channel = ad7124_regs[AD7124_STATUS].value;
|
|
||||||
// ad7124_analog[channel].channel = channel;
|
|
||||||
// read_data = ad7124_read_data();
|
|
||||||
// ad7124_analog[channel].data = read_data;
|
|
||||||
// ad7124_analog[channel].voltage = (float)(read_data * VREF / GAIN / AD_CODE); // AD7124单极性计算公式:Code = (0xFFFFFF × AIN × Gain)/VREF
|
|
||||||
// ad7124_analog[channel].current = (float)(ad7124_analog[channel].voltage / AD7124_RES * 1000); // 乘1000是为了将单位转换为mA
|
|
||||||
|
|
||||||
// // ad7124_regs[AD7124_CHANNEL_0].value = 0;
|
|
||||||
// // ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0]);
|
|
||||||
// // }
|
|
||||||
// }
|
|
||||||
void ad7124_get_analog(uint8_t channel_nr)
|
|
||||||
{
|
|
||||||
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]);
|
|
||||||
|
|
||||||
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_regs[AD7124_CHANNEL_0].value = 0;
|
|
||||||
ad7124_write_register(&ad7124_regs[AD7124_CHANNEL_0]);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief 配置AD7124设备
|
|
||||||
*
|
|
||||||
* 该函数负责初始化AD7124设备,初始化寄存器。
|
|
||||||
*
|
|
||||||
* @return 初始化结果,成功返回0,失败返回负数
|
|
||||||
*/
|
|
||||||
int32_t ad7124_setup(void)
|
|
||||||
{
|
|
||||||
int32_t ret;
|
|
||||||
uint8_t reg_nr;
|
|
||||||
// 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]);
|
|
||||||
/* Initialize registers AD7124_ADC_Control through AD7124_Filter_7. */
|
|
||||||
for (reg_nr = AD7124_STATUS; reg_nr < AD7124_OFFSET_0; reg_nr++) // 对ad7124的可写寄存器进行配置,不包括只读寄存器
|
|
||||||
{
|
|
||||||
// ret = ad7124_read_register(&ad7124_regs[reg_nr]);
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 通过SPI接口对AD7124进行读写操作
|
|
||||||
*
|
|
||||||
* 通过SPI接口对AD7124进行读写操作,。
|
|
||||||
*
|
|
||||||
* @param buff 指向待传输数据的指针
|
|
||||||
* @param length 待传输数据的长度
|
|
||||||
*
|
|
||||||
* @return 传输结果,成功返回0,失败返回负数
|
|
||||||
*/
|
|
||||||
int32_t ad7124_read_write_spi(uint8_t *buff, uint8_t length)
|
|
||||||
{
|
|
||||||
int32_t ret;
|
|
||||||
board_spi_init(AD7124); // 初始化SPI,因为DAC161的SPI要和AD7124共用,并且时序不一样,所以要先初始化SPI接口。
|
|
||||||
board_spi_cs_on(AD7124);
|
|
||||||
ret = spi_transmit_receive(&hspi1, buff, length);
|
|
||||||
board_spi_cs_off(AD7124);
|
|
||||||
return ret;
|
|
||||||
}
|
|
|
@ -1,308 +0,0 @@
|
||||||
#ifndef __AD7124_H
|
|
||||||
#define __AD7124_H
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
/***************************** Include Files **********************************/
|
|
||||||
/******************************************************************************/
|
|
||||||
#include "main.h"
|
|
||||||
#include "user_spi.h"
|
|
||||||
/******************************************************************************/
|
|
||||||
/******************* Register map and register definitions ********************/
|
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
/* Communication Register bits */
|
|
||||||
#define AD7124_COMM_REG_WEN (0 << 7)
|
|
||||||
#define AD7124_COMM_REG_WR (0 << 6)
|
|
||||||
#define AD7124_COMM_REG_RD (1 << 6)
|
|
||||||
#define AD7124_COMM_REG_RA(x) ((x) & 0x3F)
|
|
||||||
|
|
||||||
/* Status Register bits */
|
|
||||||
#define AD7124_STATUS_REG_RDY (1 << 7)
|
|
||||||
#define AD7124_STATUS_REG_ERROR_FLAG (1 << 6)
|
|
||||||
#define AD7124_STATUS_REG_POR_FLAG (1 << 4)
|
|
||||||
#define AD7124_STATUS_REG_CH_ACTIVE(x) ((x) & 0xF)
|
|
||||||
|
|
||||||
/* ADC_Control Register bits */
|
|
||||||
#define AD7124_ADC_CTRL_REG_DOUT_RDY_DEL (1 << 12)
|
|
||||||
#define AD7124_ADC_CTRL_REG_CONT_READ (1 << 11)
|
|
||||||
#define AD7124_ADC_CTRL_REG_DATA_STATUS (1 << 10)
|
|
||||||
#define AD7124_ADC_CTRL_REG_CS_EN (1 << 9)
|
|
||||||
#define AD7124_ADC_CTRL_REG_REF_EN (1 << 8)
|
|
||||||
#define AD7124_ADC_CTRL_REG_POWER_MODE(x) (((x) & 0x3) << 6)
|
|
||||||
#define AD7124_ADC_CTRL_REG_MODE(x) (((x) & 0xF) << 2)
|
|
||||||
#define AD7124_ADC_CTRL_REG_CLK_SEL(x) (((x) & 0x3) << 0)
|
|
||||||
|
|
||||||
/* IO_Control_1 Register bits */
|
|
||||||
#define AD7124_IO_CTRL1_REG_GPIO_DAT2 (1 << 23)
|
|
||||||
#define AD7124_IO_CTRL1_REG_GPIO_DAT1 (1 << 22)
|
|
||||||
#define AD7124_IO_CTRL1_REG_GPIO_CTRL2 (1 << 19)
|
|
||||||
#define AD7124_IO_CTRL1_REG_GPIO_CTRL1 (1 << 18)
|
|
||||||
#define AD7124_IO_CTRL1_REG_PDSW (1 << 15)
|
|
||||||
#define AD7124_IO_CTRL1_REG_IOUT1(x) (((x) & 0x7) << 11)
|
|
||||||
#define AD7124_IO_CTRL1_REG_IOUT0(x) (((x) & 0x7) << 8)
|
|
||||||
#define AD7124_IO_CTRL1_REG_IOUT_CH1(x) (((x) & 0xF) << 4)
|
|
||||||
#define AD7124_IO_CTRL1_REG_IOUT_CH0(x) (((x) & 0xF) << 0)
|
|
||||||
|
|
||||||
/* IO_Control_1 AD7124-8 specific bits */
|
|
||||||
#define AD7124_8_IO_CTRL1_REG_GPIO_DAT4 (1 << 23)
|
|
||||||
#define AD7124_8_IO_CTRL1_REG_GPIO_DAT3 (1 << 22)
|
|
||||||
#define AD7124_8_IO_CTRL1_REG_GPIO_DAT2 (1 << 21)
|
|
||||||
#define AD7124_8_IO_CTRL1_REG_GPIO_DAT1 (1 << 20)
|
|
||||||
#define AD7124_8_IO_CTRL1_REG_GPIO_CTRL4 (1 << 19)
|
|
||||||
#define AD7124_8_IO_CTRL1_REG_GPIO_CTRL3 (1 << 18)
|
|
||||||
#define AD7124_8_IO_CTRL1_REG_GPIO_CTRL2 (1 << 17)
|
|
||||||
#define AD7124_8_IO_CTRL1_REG_GPIO_CTRL1 (1 << 16)
|
|
||||||
|
|
||||||
/* IO_Control_2 Register bits */
|
|
||||||
#define AD7124_IO_CTRL2_REG_GPIO_VBIAS7 (1 << 15)
|
|
||||||
#define AD7124_IO_CTRL2_REG_GPIO_VBIAS6 (1 << 14)
|
|
||||||
#define AD7124_IO_CTRL2_REG_GPIO_VBIAS5 (1 << 11)
|
|
||||||
#define AD7124_IO_CTRL2_REG_GPIO_VBIAS4 (1 << 10)
|
|
||||||
#define AD7124_IO_CTRL2_REG_GPIO_VBIAS3 (1 << 5)
|
|
||||||
#define AD7124_IO_CTRL2_REG_GPIO_VBIAS2 (1 << 4)
|
|
||||||
#define AD7124_IO_CTRL2_REG_GPIO_VBIAS1 (1 << 1)
|
|
||||||
#define AD7124_IO_CTRL2_REG_GPIO_VBIAS0 (1 << 0)
|
|
||||||
|
|
||||||
/* IO_Control_2 AD7124-8 specific bits */
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS15 (1 << 15)
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS14 (1 << 14)
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS13 (1 << 13)
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS12 (1 << 12)
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS11 (1 << 11)
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS10 (1 << 10)
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS9 (1 << 9)
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS8 (1 << 8)
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS7 (1 << 7)
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS6 (1 << 6)
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS5 (1 << 5)
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS4 (1 << 4)
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS3 (1 << 3)
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS2 (1 << 2)
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS1 (1 << 1)
|
|
||||||
#define AD7124_8_IO_CTRL2_REG_GPIO_VBIAS0 (1 << 0)
|
|
||||||
|
|
||||||
/* ID Register bits */
|
|
||||||
#define AD7124_ID_REG_DEVICE_ID(x) (((x) & 0xF) << 4)
|
|
||||||
#define AD7124_ID_REG_SILICON_REV(x) (((x) & 0xF) << 0)
|
|
||||||
|
|
||||||
/* Error Register bits */
|
|
||||||
#define AD7124_ERR_REG_LDO_CAP_ERR (1 << 19)
|
|
||||||
#define AD7124_ERR_REG_ADC_CAL_ERR (1 << 18)
|
|
||||||
#define AD7124_ERR_REG_ADC_CONV_ERR (1 << 17)
|
|
||||||
#define AD7124_ERR_REG_ADC_SAT_ERR (1 << 16)
|
|
||||||
#define AD7124_ERR_REG_AINP_OV_ERR (1 << 15)
|
|
||||||
#define AD7124_ERR_REG_AINP_UV_ERR (1 << 14)
|
|
||||||
#define AD7124_ERR_REG_AINM_OV_ERR (1 << 13)
|
|
||||||
#define AD7124_ERR_REG_AINM_UV_ERR (1 << 12)
|
|
||||||
#define AD7124_ERR_REG_REF_DET_ERR (1 << 11)
|
|
||||||
#define AD7124_ERR_REG_DLDO_PSM_ERR (1 << 9)
|
|
||||||
#define AD7124_ERR_REG_ALDO_PSM_ERR (1 << 7)
|
|
||||||
#define AD7124_ERR_REG_SPI_IGNORE_ERR (1 << 6)
|
|
||||||
#define AD7124_ERR_REG_SPI_SLCK_CNT_ERR (1 << 5)
|
|
||||||
#define AD7124_ERR_REG_SPI_READ_ERR (1 << 4)
|
|
||||||
#define AD7124_ERR_REG_SPI_WRITE_ERR (1 << 3)
|
|
||||||
#define AD7124_ERR_REG_SPI_CRC_ERR (1 << 2)
|
|
||||||
#define AD7124_ERR_REG_MM_CRC_ERR (1 << 1)
|
|
||||||
#define AD7124_ERR_REG_ROM_CRC_ERR (1 << 0)
|
|
||||||
|
|
||||||
/* Error_En Register bits */
|
|
||||||
#define AD7124_ERREN_REG_MCLK_CNT_EN (1 << 22)
|
|
||||||
#define AD7124_ERREN_REG_LDO_CAP_CHK_TEST_EN (1 << 21)
|
|
||||||
#define AD7124_ERREN_REG_LDO_CAP_CHK(x) (((x) & 0x3) << 19)
|
|
||||||
#define AD7124_ERREN_REG_ADC_CAL_ERR_EN (1 << 18)
|
|
||||||
#define AD7124_ERREN_REG_ADC_CONV_ERR_EN (1 << 17)
|
|
||||||
#define AD7124_ERREN_REG_ADC_SAT_ERR_EN (1 << 16)
|
|
||||||
#define AD7124_ERREN_REG_AINP_OV_ERR_EN (1 << 15)
|
|
||||||
#define AD7124_ERREN_REG_AINP_UV_ERR_EN (1 << 14)
|
|
||||||
#define AD7124_ERREN_REG_AINM_OV_ERR_EN (1 << 13)
|
|
||||||
#define AD7124_ERREN_REG_AINM_UV_ERR_EN (1 << 12)
|
|
||||||
#define AD7124_ERREN_REG_REF_DET_ERR_EN (1 << 11)
|
|
||||||
#define AD7124_ERREN_REG_DLDO_PSM_TRIP_TEST_EN (1 << 10)
|
|
||||||
#define AD7124_ERREN_REG_DLDO_PSM_ERR_ERR (1 << 9)
|
|
||||||
#define AD7124_ERREN_REG_ALDO_PSM_TRIP_TEST_EN (1 << 8)
|
|
||||||
#define AD7124_ERREN_REG_ALDO_PSM_ERR_EN (1 << 7)
|
|
||||||
#define AD7124_ERREN_REG_SPI_IGNORE_ERR_EN (1 << 6)
|
|
||||||
#define AD7124_ERREN_REG_SPI_SCLK_CNT_ERR_EN (1 << 5)
|
|
||||||
#define AD7124_ERREN_REG_SPI_READ_ERR_EN (1 << 4)
|
|
||||||
#define AD7124_ERREN_REG_SPI_WRITE_ERR_EN (1 << 3)
|
|
||||||
#define AD7124_ERREN_REG_SPI_CRC_ERR_EN (1 << 2)
|
|
||||||
#define AD7124_ERREN_REG_MM_CRC_ERR_EN (1 << 1)
|
|
||||||
#define AD7124_ERREN_REG_ROM_CRC_ERR_EN (1 << 0)
|
|
||||||
|
|
||||||
/* Channel Registers 0-15 bits */
|
|
||||||
#define AD7124_CH_MAP_REG_CH_ENABLE (1 << 15)
|
|
||||||
#define AD7124_CH_MAP_REG_SETUP(x) (((x) & 0x7) << 12)
|
|
||||||
#define AD7124_CH_MAP_REG_AINP(x) (((x) & 0x1F) << 5)
|
|
||||||
#define AD7124_CH_MAP_REG_AINM(x) (((x) & 0x1F) << 0)
|
|
||||||
|
|
||||||
/* Configuration Registers 0-7 bits */
|
|
||||||
#define AD7124_CFG_REG_BIPOLAR (1 << 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)
|
|
||||||
#define AD7124_CFG_REG_AIN_BUFP (1 << 6)
|
|
||||||
#define AD7124_CFG_REG_AINN_BUFM (1 << 5)
|
|
||||||
#define AD7124_CFG_REG_REF_SEL(x) ((x) & 0x3) << 3
|
|
||||||
#define AD7124_CFG_REG_PGA(x) (((x) & 0x7) << 0)
|
|
||||||
|
|
||||||
/* Filter Register 0-7 bits */
|
|
||||||
#define AD7124_FILT_REG_FILTER(x) (((x) & 0x7) << 21)
|
|
||||||
#define AD7124_FILT_REG_REJ60 (1 << 20)
|
|
||||||
#define AD7124_FILT_REG_POST_FILTER(x) (((x) & 0x7) << 17)
|
|
||||||
#define AD7124_FILT_REG_SINGLE_CYCLE (1 << 16)
|
|
||||||
#define AD7124_FILT_REG_FS(x) (((x) & 0x7FF) << 0)
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
/*************************** Types Declarations *******************************/
|
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
/*! AD7124 registers list*/
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
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; // 寄存器字节大小
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
AD7124_RW = 1,
|
|
||||||
AD7124_R = 2,
|
|
||||||
AD7124_W = 3,
|
|
||||||
} ad7124_registers_rw_e; // 寄存器读写操作
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
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, // AD7124_CHANNEL_EN_2
|
|
||||||
STOP_NO_ADC, // AD7124_CHANNEL_EN_3
|
|
||||||
AI_IN1_ADC, // AD7124_CHANNEL_EN_4
|
|
||||||
AI_IN2_ADC, // AD7124_CHANNEL_EN_5
|
|
||||||
P1_DI2_ADC, // AD7124_CHANNEL_EN_6
|
|
||||||
P1_DI1_ADC, // AD7124_CHANNEL_EN_7
|
|
||||||
P1_AI_ADC, // AD7124_CHANNEL_EN_8
|
|
||||||
P2_DI2_ADC, // AD7124_CHANNEL_EN_9
|
|
||||||
P2_DI1_ADC, // AD7124_CHANNEL_EN_10
|
|
||||||
P2_AI_ADC, // AD7124_CHANNEL_EN_11
|
|
||||||
AD7124_CHANNEL_EN_MAX,
|
|
||||||
} ad7124_channel_e; // 该项目所使用的通道
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint8_t channel;
|
|
||||||
int32_t data; // 采样数据
|
|
||||||
float voltage; // 电压值
|
|
||||||
float current; // 电流值
|
|
||||||
} ad7124_analog_t; // 采样数据结构体
|
|
||||||
|
|
||||||
#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 // 24位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__ */
|
|
|
@ -1,56 +0,0 @@
|
||||||
#include "dac161s997.h"
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 向DAC161S997芯片写入寄存器值
|
|
||||||
*
|
|
||||||
* 该函数通过SPI接口向DAC161S997芯片写入指定的寄存器值。
|
|
||||||
*
|
|
||||||
* @param dac_num DAC芯片编号
|
|
||||||
* @param reg 要写入的寄存器地址
|
|
||||||
* @param data 要写入的数据,16位
|
|
||||||
*/
|
|
||||||
void dac161s997_write_reg(chip_type_e dac_num, uint8_t reg, uint16_t data)
|
|
||||||
{
|
|
||||||
uint8_t data_buffer[3] = {0, 0, 0};
|
|
||||||
data_buffer[0] = reg;
|
|
||||||
data_buffer[1] = data >> 8;
|
|
||||||
data_buffer[2] = data;
|
|
||||||
board_spi_init(dac_num); // 初始化SPI,因为ADC芯片也用SPI1,但是时序不同
|
|
||||||
board_spi_cs_on(dac_num);
|
|
||||||
spi_transmit_receive(&hspi1, data_buffer, 3);
|
|
||||||
board_spi_cs_off(dac_num);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 初始化DAC161S997 DAC设备
|
|
||||||
*/
|
|
||||||
void dac161s997_init(void)
|
|
||||||
{
|
|
||||||
dac161s997_write_reg(DAC161S997_1, DAC161S997_ERR_LOW_REG, 0xFFFF);
|
|
||||||
dac161s997_write_reg(DAC161S997_1, DAC161S997_ERR_CONFIG_REG, 0x070E);
|
|
||||||
|
|
||||||
dac161s997_write_reg(DAC161S997_2, DAC161S997_ERR_LOW_REG, 0xFFFF);
|
|
||||||
dac161s997_write_reg(DAC161S997_2, DAC161S997_ERR_CONFIG_REG, 0x070E);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief DAC161S997芯片输出函数
|
|
||||||
*
|
|
||||||
* 此函数用于设置DAC161S997芯片的输出电流。
|
|
||||||
*
|
|
||||||
* @param dac_num DAC芯片类型
|
|
||||||
* @param current 需要设置的电流值,单位:毫安
|
|
||||||
*/
|
|
||||||
void dac161s997_output(chip_type_e dac_num, float current)
|
|
||||||
{
|
|
||||||
uint32_t dac_code = (uint32_t)((current * 65535.0f) / 24.0f);
|
|
||||||
uint8_t data_buffer[3] = {0, 0, 0};
|
|
||||||
data_buffer[0] = DAC161S997_DACCODE_REG;
|
|
||||||
data_buffer[1] = dac_code >> 8;
|
|
||||||
data_buffer[2] = dac_code;
|
|
||||||
board_spi_init(dac_num); // 初始化SPI,因为ADC芯片也用SPI1,但是时序不同
|
|
||||||
board_spi_cs_on(dac_num);
|
|
||||||
spi_transmit_receive(&hspi1, data_buffer, 3);
|
|
||||||
board_spi_cs_off(dac_num);
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
#ifndef __DAC161S997_H__
|
|
||||||
#define __DAC161S997_H__
|
|
||||||
|
|
||||||
#include "main.h"
|
|
||||||
#include "user_spi.h"
|
|
||||||
/* Defines ********************************************************************/
|
|
||||||
/**
|
|
||||||
* @defgroup DAC161S997_REGS
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define DAC161S997_XFR_REG 0x01 /**< Command: transfer data into register (protected write mode) */
|
|
||||||
#define DAC161S997_NOP_REG 0x02 /**< Command: does nothing except resetting the timeout timer */
|
|
||||||
#define DAC161S997_PROTECT_REG_WR_REG 0x03 /**< 1 means protected write mode in effect */
|
|
||||||
#define DAC161S997_DACCODE_REG 0x04 /**< 16 bit DAC code to be written */
|
|
||||||
#define DAC161S997_ERR_CONFIG_REG 0x05 /**< Configuration of error states */
|
|
||||||
#define DAC161S997_ERR_LOW_REG 0x06 /**< DAC code for the <4mA alarm level */
|
|
||||||
#define DAC161S997_ERR_HIGH_REG 0x07 /**< DAC code for the >20mA alarm level */
|
|
||||||
#define DAC161S997_RESET_REG 0x08 /**< Command: reset the chip */
|
|
||||||
#define DAC161S997_STATUS_REG 0x09 /**< Status of the chip */
|
|
||||||
|
|
||||||
#define DAC161S997_SPI SPI1
|
|
||||||
|
|
||||||
void dac161s997_write_reg(uint8_t dac_num, uint8_t reg, uint16_t data);
|
|
||||||
uint16_t dac161s997_read(uint8_t reg);
|
|
||||||
extern void dac161s997_init(void);
|
|
||||||
extern void dac161s997_output(uint8_t dac_num, float current);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,12 +0,0 @@
|
||||||
#include "ht1200m.h"
|
|
||||||
|
|
||||||
extern void hart_ht1200m_reset(void)
|
|
||||||
{
|
|
||||||
HART1_RESET_ON;
|
|
||||||
HART2_RESET_ON;
|
|
||||||
HAL_Delay(10);
|
|
||||||
HART1_RESET_OFF;
|
|
||||||
HART2_RESET_OFF;
|
|
||||||
HART1_RTS_RECEIVE;
|
|
||||||
HART2_RTS_RECEIVE;
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
#ifndef __HT1200M_H__
|
|
||||||
#define __HT1200M_H__
|
|
||||||
|
|
||||||
#include "main.h"
|
|
||||||
|
|
||||||
#define HART1_RESET_ON HAL_GPIO_WritePin(HART1_RST_GPIO_Port, HART1_RST_Pin, GPIO_PIN_RESET) // 拉低引脚复位模块
|
|
||||||
#define HART1_RESET_OFF HAL_GPIO_WritePin(HART1_RST_GPIO_Port, HART1_RST_Pin, GPIO_PIN_SET)
|
|
||||||
|
|
||||||
#define HART2_RESET_ON HAL_GPIO_WritePin(HART2_RST_GPIO_Port, HART2_RST_Pin, GPIO_PIN_RESET) // 拉低引脚复位模块
|
|
||||||
#define HART2_RESET_OFF HAL_GPIO_WritePin(HART2_RST_GPIO_Port, HART2_RST_Pin, GPIO_PIN_SET)
|
|
||||||
|
|
||||||
#define HART1_RTS_RECEIVE HAL_GPIO_WritePin(HART1_RTS_GPIO_Port, HART1_RTS_Pin, GPIO_PIN_SET)
|
|
||||||
#define HART1_RTS_SEND HAL_GPIO_WritePin(HART1_RTS_GPIO_Port, HART1_RTS_Pin, GPIO_PIN_RESET) // 拉低引脚发送
|
|
||||||
|
|
||||||
#define HART2_RTS_RECEIVE HAL_GPIO_WritePin(HART2_RTS_GPIO_Port, HART2_RTS_Pin, GPIO_PIN_SET)
|
|
||||||
#define HART2_RTS_SEND HAL_GPIO_WritePin(HART2_RTS_GPIO_Port, HART2_RTS_Pin, GPIO_PIN_RESET) // 拉低引脚发送
|
|
||||||
|
|
||||||
extern void hart_ht1200m_reset(void);
|
|
||||||
#endif
|
|
Loading…
Reference in New Issue