21 changed files with 719 additions and 584 deletions
-
2.clang-format
-
5.vscode/settings.json
-
186app/app.uvoptx
-
20app/app.uvprojx
-
1app/config/sdk_config.h
-
2app/src/aproject_config/config.h
-
133app/src/board/ads1291/ads1291.c
-
28app/src/board/ads1291/ads1291.h
-
330app/src/board/ads1291/ads1291_type.h
-
151app/src/board/ads129x/ads129x.c
-
26app/src/board/ads129x/ads129x.h
-
286app/src/board/ads129x/ads129x_type.h
-
70app/src/board/app_board.c
-
38app/src/board/app_board.h
-
4app/src/board/board_ecg_sensor.c
-
6app/src/main.c
-
8app/src/one_conduction_main.c
-
1app/src/service/heart_wave_sample_service/heart_wave_sample_service.c
-
2libznordic
-
2scripter/build_app.bat
-
2sdk
@ -1,133 +0,0 @@ |
|||
#include "ads1291.h" |
|||
|
|||
#include "ads1291_type.h" |
|||
|
|||
/** @addtogroup ADS1292R |
|||
* @{ |
|||
*/ |
|||
/* Private typedef -----------------------------------------------------------*/ |
|||
typedef struct { |
|||
uint8_t id; /* id,ads1292r固定为0x73 ads1291 0x52 */ |
|||
uint8_t cfg1; /* 设置寄存器 */ |
|||
uint8_t cfg2; /* 设置寄存器 */ |
|||
uint8_t loff; /* 导联 */ |
|||
uint8_t ch1set; /* 通道一设置 */ |
|||
uint8_t ch2set; /* 通道二设置 */ |
|||
uint8_t rld_sens; /* 右腿驱动 */ |
|||
uint8_t loff_sens; /* 导联 */ |
|||
uint8_t loff_stat; /* 导联 */ |
|||
uint8_t resp1; /* 呼吸 */ |
|||
uint8_t resp2; /* 呼吸 */ |
|||
uint8_t gpio; /* gpio1,2的控制 */ |
|||
} ads1292r_regs_s; |
|||
|
|||
/* Private define ------------------------------------------------------------*/ |
|||
|
|||
/* Private macro -------------------------------------------------------------*/ |
|||
|
|||
/* Private variables ---------------------------------------------------------*/ |
|||
/* 局部全局变量,包含ads1292寄存器默认值 */ |
|||
static ads1292r_regs_s ads1292r_reg = { |
|||
/* 默认参数 */ |
|||
0x73, /* 默认地址0x73 */ |
|||
0x02, /* 连续转换,500sps采样率 */ |
|||
0x80, /* 导联脱落比较器关,内部参考电压关,2.42v参考电压,晶振输出关,测试信号关,测试信号频率为0HZ */ |
|||
0x10, /* 脱落比较器正端阈值为95%,负端为5%,引出模式电流大小6na,频率为0HZ */ |
|||
0x00, /* 通道一关闭,6倍增益,正常电极输入 */ |
|||
0x00, /* 通道二关闭,6倍增益,正常电极输入 */ |
|||
0x00, /* 未启用 */ |
|||
0x00, /* 未启用 */ |
|||
0x00, /* fmod为clk四分频,其他未用 */ |
|||
0x02, /* 呼吸相关配置 */ |
|||
0x03, /* 呼吸相关配置 */ |
|||
0x0c /* gpio1、2皆为输入模式 */ |
|||
}; |
|||
/* Private function prototypes -----------------------------------------------*/ |
|||
|
|||
/* Private functions ---------------------------------------------------------*/ |
|||
|
|||
/* Exported functions --------------------------------------------------------*/ |
|||
/* 不必要,尽量不要对外开放以下函数,最好设置成static类型 */ |
|||
|
|||
/* ads1292r发送指令 */ |
|||
uint8_t ads1292r_send_cmd(uint8_t cmd) { |
|||
uint8_t rx = 0; |
|||
|
|||
ADS1292_CS_RESET(); /* 选中设备 */ |
|||
port_delay_us(100); |
|||
|
|||
rx = port_spi_transmit_receive(cmd); |
|||
|
|||
port_delay_us(100); |
|||
ADS1292_CS_SET(); /* 释放设备 */ |
|||
|
|||
return rx; |
|||
} |
|||
|
|||
/* ads1292r读写寄存器,自动根据指令类型区分读和写操作 */ |
|||
uint8_t ads1292r_rw_reg(uint8_t cmd, uint8_t data) { |
|||
uint8_t rx = 0; |
|||
|
|||
ADS1292_CS_RESET(); /* 选中设备 */ |
|||
port_delay_us(1); |
|||
|
|||
port_spi_transmit_receive(cmd); /* 发送读写指令 */ |
|||
port_spi_transmit_receive(0X00); /* 只写一个数据 */ |
|||
|
|||
if ((cmd & ADS1292R_COMMAND_RREG) == ADS1292R_COMMAND_RREG) /* 判断指令类型 */ |
|||
rx = port_spi_transmit_receive(0X00); /* 返回寄存器值 */ |
|||
else |
|||
rx = port_spi_transmit_receive(data); /* 写入数值 */ |
|||
|
|||
port_delay_us(1); |
|||
ADS1292_CS_SET(); /* 释放设备 */ |
|||
|
|||
return rx; |
|||
} |
|||
|
|||
/* 从指定寄存器开始读写一定数量的寄存器 */ |
|||
void ads1292r_write_multiregs(uint8_t reg, uint8_t *ch, uint8_t size) { |
|||
uint8_t i; |
|||
|
|||
ADS1292_CS_RESET(); /* 选中设备 */ |
|||
port_delay_us(100); |
|||
|
|||
port_spi_transmit_receive(ADS1292R_COMMAND_WREG | reg); |
|||
port_delay_us(100); |
|||
port_spi_transmit_receive(size - 1); |
|||
|
|||
for (i = 0; i < size; i++) { |
|||
port_delay_us(100); |
|||
port_spi_transmit_receive(*ch); |
|||
ch++; |
|||
} |
|||
|
|||
port_delay_us(100); |
|||
ADS1292_CS_SET(); |
|||
} |
|||
|
|||
/* 从指定寄存器开始读写一定数量的寄存器 */ |
|||
void ads1292r_read_multiregs(uint8_t reg, uint8_t *ch, uint8_t size) { |
|||
uint8_t i; |
|||
|
|||
ADS1292_CS_RESET(); /* 选中设备 */ |
|||
port_delay_us(100); |
|||
|
|||
port_spi_transmit_receive(ADS1292R_COMMAND_RREG | reg); |
|||
port_delay_us(100); |
|||
port_spi_transmit_receive(size - 1); |
|||
|
|||
for (i = 0; i < size; i++) { |
|||
port_delay_us(100); |
|||
*ch = port_spi_transmit_receive(0); |
|||
ch++; |
|||
} |
|||
|
|||
port_delay_us(100); |
|||
ADS1292_CS_SET(); |
|||
} |
|||
|
|||
uint8_t ads1292r_init(uint8_t timeout); |
|||
void ads1292r_normal_adc_start(void); |
|||
void ads1292r_test_adc_start(void); |
|||
void ads1292r_get_value(uint8_t *ad_buf); |
@ -1,28 +0,0 @@ |
|||
#ifndef __ADS1292R_H |
|||
#define __ADS1292R_H |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
#include <stdint.h> |
|||
uint8_t ads1292r_init(uint8_t timeout); |
|||
|
|||
/** @brief 开启双通道正常模式采样,用于心电采集 |
|||
* @details 500sps,6倍增益,调用该函数后需调用读函数,读取ad数据 |
|||
* @retval NONE |
|||
*/ |
|||
void ads1292r_normal_adc_start(void); |
|||
|
|||
/** @brief 开启双测试信号adc转换。 |
|||
* @details 500sps,6倍增益,1HZ方波,调用该函数后需调用读函数,读取ad数据 |
|||
* @retval NONE |
|||
*/ |
|||
void ads1292r_test_adc_start(void); |
|||
|
|||
void ads1292r_get_value(uint8_t *ad_buf); |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
#endif /* __ADS1292R_H */ |
@ -1,330 +0,0 @@ |
|||
/** |
|||
****************************************************************************** |
|||
* @file : ads1291_typ.h |
|||
* @brief : ads1291相关数据类型定义 |
|||
* @details : 寄存器标、命令表、 |
|||
* @author : |
|||
* @date : 2020/9/2 |
|||
* @version : V0.1 |
|||
* @copyright : Copyright (C) |
|||
****************************************************************************** |
|||
* @attention |
|||
* NONE |
|||
****************************************************************************** |
|||
* @verbatim |
|||
* 修改历史: |
|||
* 1. 日期:2020/9/2 |
|||
* 作者:Charmander |
|||
* 修改: |
|||
* @endverbatim |
|||
****************************************************************************** |
|||
*/ |
|||
|
|||
/* Define to prevent recursive inclusion -------------------------------------*/ |
|||
#ifndef __ADS1292_TYP_H |
|||
#define __ADS1292_TYP_H |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
/** @defgroup ADS1291_TYP ADS1291 TYP |
|||
* @{ |
|||
*/ |
|||
/* Exported types ------------------------------------------------------------*/ |
|||
/** @addtogroup ADS1291_TYP_Exported_types ADS1291 TYP Exported types |
|||
* @{ |
|||
*/ |
|||
|
|||
/** @brief 寄存器地址枚举 |
|||
* @details 11个寄存器 |
|||
*/ |
|||
typedef enum { |
|||
ADS1291_REG_ID = 0x00, |
|||
ADS1291_REG_CONFIG1 = 0x01, |
|||
ADS1291_REG_CONFIG2 = 0x02, |
|||
ADS1291_REG_LOFF = 0x03, |
|||
ADS1291_REG_CH1SET = 0x04, |
|||
ADS1291_REG_CH2SET = 0x05, |
|||
ADS1291_REG_RLDSENS = 0x06, |
|||
ADS1291_REG_LOFFSENS = 0x07, |
|||
ADS1291_REG_LOFFSTAT = 0x08, |
|||
ADS1291_REG_RESP1 = 0x09, |
|||
ADS1291_REG_RESP2 = 0x0A, |
|||
ADS1291_REG_GPIO = 0x0B |
|||
} ADS1291_REG_E; |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** @addtogroup ADS1291_TYP_Exported_constants ADS1291 TYP Exported constants |
|||
* @brief 一下内容也可以全部由位域+枚举实现,考虑到不是所有编译器都支持, |
|||
* 采用宏+掩码方式实现。 |
|||
* @{ |
|||
*/ |
|||
|
|||
/* Exported constants --------------------------------------------------------*/ |
|||
#define ADS1291_REG_SIZE_MAX 12 /* ADS1291寄存器数量 */ |
|||
|
|||
/** @addtogroup ADS1291_TYP_REG_CONTENT ADS1291 TYP Exported content |
|||
* @brief 各寄存器内容 |
|||
* @{ |
|||
*/ |
|||
/* 芯片ID */ |
|||
#define ADS1291_ID 0x73 |
|||
|
|||
/* 属于ADS1291_REG_CONFIG1的寄存器设置 */ |
|||
#define ADS1291_SINGLE_SHOT_OFF 0 /* 连续转换模式,默认 */ |
|||
#define ADS1291_SINGLE_SHOT_ON 1 /* 单次转换模式 */ |
|||
/* 采样率,该模块采用fclk为512k,0分频模式,其他配置下采样率会改变 */ |
|||
#define ADS1291_OVERSAMPLING_125SPS 0 |
|||
#define ADS1291_OVERSAMPLING_250SPS 1 |
|||
#define ADS1291_OVERSAMPLING_500SPS 2 /* 默认 */ |
|||
#define ADS1291_OVERSAMPLING_1000SPS 3 |
|||
#define ADS1291_OVERSAMPLING_2000SPS 4 |
|||
#define ADS1291_OVERSAMPLING_4000SPS 5 |
|||
#define ADS1291_OVERSAMPLING_8000SPS 6 |
|||
#define ADS1291_OVERSAMPLING_NONESPS 7 |
|||
|
|||
/* 属于ADS1291_REG_CONFIG2的寄存器设置 */ |
|||
#define ADS1291_PDB_LOFF_COMP_OFF 0 /* 导联脱落比较器关,默认 */ |
|||
#define ADS1291_PDB_LOFF_COMP_ON 1 /* 导联脱落比较器开 */ |
|||
#define ADS1291_PDB_REFBUF_OFF 0 /* 内部参考电压关,默认 */ |
|||
#define ADS1291_PDB_REFBUF_ON 1 /* 内部参考电压开 */ |
|||
#define ADS1291_VREF_2420MV 0 /* 选择参考电压为2.42v,默认 */ |
|||
#define ADS1291_VREF_4033MV 1 /* 选择参考电压为4.033v */ |
|||
#define ADS1291_CLK_OUTPUT_OFF 0 /* 时钟输出关,默认 */ |
|||
#define ADS1291_CLK_OUTPUT_ON 1 /* 时钟输出开 */ |
|||
#define ADS1291_INT_TEST_OFF 0 /* 内部测试电压关,默认 */ |
|||
#define ADS1291_INT_TEST_ON 1 /* 内部测试电压开 */ |
|||
#define ADS1291_INT_FREQ_DC 0 /* 直流,默认 */ |
|||
#define ADS1291_INT_FREQ_AC 1 /* 1HZ方波 */ |
|||
|
|||
/* 属于ADS1291_REG_LOFF的寄存器设置 */ |
|||
|
|||
/* 属于ADS1291_REG_CH1SET,与ADS1291_REG_CH2SET的寄存器设置 */ |
|||
#define ADS1291_CHx_OFF 1 /* 禁止使用通道一 */ |
|||
#define ADS1291_CHx_ON 0 /* 使用通道一,默认 */ |
|||
|
|||
#define ADS1291_GAIN_6 0 /* 使用通道一6倍增益,默认 */ |
|||
#define ADS1291_GAIN_1 1 /* 使用通道一1倍增益 */ |
|||
#define ADS1291_GAIN_2 2 /* 使用通道一2倍增益 */ |
|||
#define ADS1291_GAIN_3 3 /* 使用通道一3倍增益 */ |
|||
#define ADS1291_GAIN_4 4 /* 使用通道一4倍增益 */ |
|||
#define ADS1291_GAIN_8 5 /* 使用通道一8倍增益 */ |
|||
#define ADS1291_GAIN_12 6 /* 使用通道一12倍增益 */ |
|||
/* 选择通道一的输入 */ |
|||
#define ADS1291_CHx_INPUT_NORMAL 0 /* 正常电极输入,默认 */ |
|||
#define ADS1291_CHx_INPUT_SHORTED 1 /* 短路,测偏执用 */ |
|||
#define ADS1291_CHx_INPUT_RLD 2 /* 右腿驱动 */ |
|||
/* For channel 1, (MVDDP – MVDDN) is [0.5(AVDD + AVSS)]; for channel 2, (MVDDP – MVDDN) is DVDD / 4. */ |
|||
/* For channel 2,VDD / 2 for supply measurement */ |
|||
#define ADS1291_CHx_INPUT_MVDD 3 |
|||
#define ADS1291_CHx_INPUT_TEMP 4 /* 板载温度 */ |
|||
#define ADS1291_CHx_INPUT_TEST 5 /* 内部测试信号 */ |
|||
#define ADS1291_CHx_INPUT_RLDDRP 6 |
|||
#define ADS1291_CHx_INPUT_RLDDRM 7 |
|||
#define ADS1291_CHx_INPUT_RLDDRPM 8 |
|||
#define ADS1291_CHx_INPUT_ROUTE 9 /* 连接到通道三 */ |
|||
#define ADS1291_CHx_INPUT_RESERVED 10 /* 预留 */ |
|||
|
|||
/* 属于ADS1291_REG_RLDSENS的寄存器设置 */ |
|||
#define ADS1291_CHOP_FREQ_DIV4 3 /* PGA斩波频率未fMOD/4 */ |
|||
#define ADS1291_PDB_RLD_OFF 0 /* 右腿驱动电源关,默认 */ |
|||
#define ADS1291_PDB_RLD_ON 1 /* 右腿驱动电源开 */ |
|||
#define ADS1291_PDB_RLD_SENSE_OFF 0 /* 右腿驱动导联脱落检测关,默认 */ |
|||
#define ADS1291_PDB_RLD_SENSE_ON 1 /* 右腿驱动导联脱落检测开 */ |
|||
#define ADS1291_RLD2N_OFF 0 /* 通道二负极为右腿输入关,默认 */ |
|||
#define ADS1291_RLD2N_ON 1 /* 通道二负极为右腿输入开 */ |
|||
#define ADS1291_RLD2P_OFF 0 /* 通道二正极为右腿输入关,默认 */ |
|||
#define ADS1291_RLD2P_ON 1 /* 通道二正极为右腿输入开 */ |
|||
#define ADS1291_RLD1N_OFF 0 /* 通道一负极为右腿输入关,默认 */ |
|||
#define ADS1291_RLD1N_ON 1 /* 通道一负极为右腿输入开 */ |
|||
#define ADS1291_RLD1P_OFF 0 /* 通道一正极为右腿输入关,默认 */ |
|||
#define ADS1291_RLD1P_ON 1 /* 通道一正极为右腿输入开 */ |
|||
|
|||
/* 属于ADS1291_REG_LOFFSENS的寄存器设置 */ |
|||
#define ADS1291_FLIP2_OFF 0 /* 导联脱落检测通道二电流方向关,默认 */ |
|||
#define ADS1291_FLIP2_ON 1 /* 导联脱落检测通道二电流方向开 */ |
|||
#define ADS1291_FLIP1_OFF 0 /* 导联脱落检测通道一电流方向关,默认 */ |
|||
#define ADS1291_FLIP1_ON 1 /* 导联脱落检测通道一电流方向开 */ |
|||
#define ADS1291_LOFF2N_OFF 0 /* 通道二负极导联脱落检测关,默认 */ |
|||
#define ADS1291_LOFF2N_ON 1 /* 通道二负极导联脱落检测开 */ |
|||
#define ADS1291_LOFF2P_OFF 0 /* 通道二正极导联脱落检测关,默认 */ |
|||
#define ADS1291_LOFF2P_ON 1 /* 通道二正极导联脱落检测开 */ |
|||
#define ADS1291_LOFF1N_OFF 0 /* 通道一负极导联脱落检测关,默认 */ |
|||
#define ADS1291_LOFF1N_ON 1 /* 通道一负极导联脱落检测开 */ |
|||
#define ADS1291_LOFF1P_OFF 0 /* 通道一正极导联脱落检测关,默认 */ |
|||
#define ADS1291_LOFF1P_ON 1 /* 通道一正极导联脱落检测开 */ |
|||
|
|||
/* 属于ADS1291_REG_LOFFSTAT的寄存器设置 */ |
|||
#define ADS1291_CLK_DIV4 0 /* 0 = fMOD = fCLK / 4 (default, use when fCLK = 512 kHz) */ |
|||
#define ADS1291_CLK_DIV16 1 /* 1 = fMOD = fCLK / 16 (use when fCLK = 2.048 MHz) */ |
|||
|
|||
/* 属于ADS1291_REG_RESP1的寄存器设置 */ |
|||
#define ADS1291_DEMOD_EN1_OFF 0 /* 通道一上的呼吸解调电路关,默认 */ |
|||
#define ADS1291_DEMOD_EN1_ON 1 /* 通道一上的呼吸解调电路开 */ |
|||
#define ADS1291_DEMOD_EN_OFF 0 /* 通道一上的呼吸调制电路关,默认 */ |
|||
#define ADS1291_DEMOD_EN_ON 1 /* 通道一上的呼吸调制电路开 */ |
|||
#define ADS1291_RESPPH_0 0 /* 解调信号相位偏移0,默认 */ |
|||
#define ADS1291_RESPPH_135 0x0c /* 解调信号相位偏移135度 */ |
|||
#define ADS1291_RESP_CTRL_INT 0 /* 内部呼吸内部时钟,默认 */ |
|||
#define ADS1291_RESP_CTRL_EXT 1 /* 内部呼吸外部时钟 */ |
|||
|
|||
/* 属于ADS1291_REG_RESP2的寄存器设置 */ |
|||
#define ADS1291_CALIB_ON_OFF 0 /* 校准关,默认 */ |
|||
#define ADS1291_CALIB_ON_ON 1 /* 校准开 */ |
|||
#define ADS1291_RESP_FREQ_36 0 /* 通道一上的呼吸调制电路关,默认 */ |
|||
#define ADS1291_RESP_FREQ_64 1 /* 通道一上的呼吸调制电路开 */ |
|||
#define ADS1291_RLDREF_EXT 0 /* 右腿驱动参考电压选择外部反馈,默认 */ |
|||
#define ADS1291_RLDREF_INT 1 /* 右腿驱动参考电压选择内部信号 */ |
|||
|
|||
/* 属于ADS1291_REG_GPIO的寄存器设置 */ |
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** @addtogroup ADS1291_TYP_REG_MASK ADS1291 TYP Reg Mask |
|||
* @brief 各寄存器值与位置掩码,被ADS1291_GET_BITS与ADS1291_SET_BITS函数调用 |
|||
* @{ |
|||
*/ |
|||
#define ADS1291_ID_POS 0 |
|||
#define ADS1291_ID_MASK 0xFF |
|||
|
|||
#define ADS1291_SINGLE_SHOT_POS 7 |
|||
#define ADS1291_SINGLE_SHOT_MASK 0x80 |
|||
#define ADS1291_DR_POS 0 |
|||
#define ADS1291_DR_MASK 0x07 |
|||
|
|||
#define ADS1291_PDB_LOFF_COMP_POS 6 |
|||
#define ADS1291_PDB_LOFF_COMP_MASK 0x40 |
|||
#define ADS1291_PDB_REFBUF_POS 5 |
|||
#define ADS1291_PDB_REFBUF_MASK 0x20 |
|||
#define ADS1291_VREF_4V_POS 4 |
|||
#define ADS1291_VREF_4V_MASK 0x10 |
|||
#define ADS1291_CLK_EN_POS 3 |
|||
#define ADS1291_CLK_EN_MASK 0x80 |
|||
#define ADS1291_INT_TEST_POS 1 |
|||
#define ADS1291_INT_TEST_MASK 0x02 |
|||
#define ADS1291_INT_FREQ_POS 0 |
|||
#define ADS1291_INT_FREQ_MASK 0x01 |
|||
|
|||
#define ADS1291_PDx_POS 7 |
|||
#define ADS1291_PDx_MASK 0x80 |
|||
#define ADS1291_GAINx_POS 4 |
|||
#define ADS1291_GAINx_MASK 0x70 |
|||
#define ADS1291_MUXx_POS 0 |
|||
#define ADS1291_MUXx_MASK 0x0F |
|||
|
|||
#define ADS1291_CHOP_POS 6 |
|||
#define ADS1291_CHOP_MASK 0xC0 |
|||
#define ADS1291_PDB_RLD_POS 5 |
|||
#define ADS1291_PDB_RLD_MASK 0x20 |
|||
#define ADS1291_RLD_LOFF_SENSE_POS 4 |
|||
#define ADS1291_RLD_LOFF_SENSE_MASK 0x10 |
|||
#define ADS1291_RLD2N_POS 3 |
|||
#define ADS1291_RLD2N_MASK 0x08 |
|||
#define ADS1291_RLD2P_POS 2 |
|||
#define ADS1291_RLD2P_MASK 0x04 |
|||
#define ADS1291_RLD1N_POS 1 |
|||
#define ADS1291_RLD1N_MASK 0x02 |
|||
#define ADS1291_RLD1P_POS 0 |
|||
#define ADS1291_RLD1P_MASK 0x01 |
|||
|
|||
#define ADS1291_FLIP2_POS 5 |
|||
#define ADS1291_FLIP2_MASK 0x20 |
|||
#define ADS1291_FLIP1_POS 4 |
|||
#define ADS1291_FLIP1_MASK 0x10 |
|||
#define ADS1291_LOFF2N_POS 3 |
|||
#define ADS1291_LOFF2N_MASK 0x08 |
|||
#define ADS1291_LOFF2P_POS 2 |
|||
#define ADS1291_LOFF2P_MASK 0x04 |
|||
#define ADS1291_LOFFN_POS 1 |
|||
#define ADS1291_LOFF1N_MASK 0x02 |
|||
#define ADS1291_LOFF1P_POS 0 |
|||
#define ADS1291_LOFF1P_MASK 0x01 |
|||
|
|||
#define ADS1291_CLK_DIV_POS 6 |
|||
#define ADS1291_CLK_DIV_MASK 0x40 |
|||
|
|||
#define ADS1291_RESP_DEMOD_EN1_POS 7 |
|||
#define ADS1291_RESP_DEMOD_EN1_MASK 0x80 |
|||
#define ADS1291_RESP_MOD_EN_POS 6 |
|||
#define ADS1291_RESP_MOD_EN_MASK 0x40 |
|||
#define ADS1291_RESP_PH_POS 2 |
|||
#define ADS1291_RESP_PH_MASK 0x3c |
|||
#define ADS1291_RESP_CTRL_POS 0 |
|||
#define ADS1291_RESP_CTRL_MASK 0x01 |
|||
|
|||
#define ADS1291_CALIB_ON_POS 7 |
|||
#define ADS1291_CALIB_ON_MASK 0x80 |
|||
#define ADS1291_RESP_FREQ_POS 2 |
|||
#define ADS1291_RESP_FREQ_MASK 0x04 |
|||
#define ADS1291_RLDREF_INT_POS 1 |
|||
#define ADS1291_RLDREF_INT_MASK 0x02 |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** @addtogroup ADS1291_TYP_COMMAND ADS1291 TYP COMMAND |
|||
* @brief 命令 |
|||
* @{ |
|||
*/ |
|||
/* System Commands */ |
|||
#define ADS1291_COMMAND_WAKEUP 0x02 |
|||
#define ADS1291_COMMAND_STANDBY 0x04 |
|||
#define ADS1291_COMMAND_RESET 0x06 |
|||
#define ADS1291_COMMAND_START 0x08 |
|||
#define ADS1291_COMMAND_STOP 0x0A |
|||
#define ADS1291_COMMAND_OFFSETCAL 0x1A |
|||
|
|||
/* Data Read Commands */ |
|||
#define ADS1291_COMMAND_RDATAC 0x10 |
|||
#define ADS1291_COMMAND_SDATAC 0x11 |
|||
#define ADS1291_COMMAND_RDATA 0x12 |
|||
|
|||
/* Register Read Commands,最后5位为读写的地址 */ |
|||
#define ADS1291_COMMAND_RREG 0x20 |
|||
#define ADS1291_COMMAND_WREG 0x40 |
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/* Exported macro ------------------------------------------------------------*/ |
|||
/** @brief 读取ADS1291的指定寄存器的指定位 |
|||
* @details |
|||
* @param[in] bitname 位名字 |
|||
* @param[in] reg 寄存器名字 |
|||
* @retval 该位的值 |
|||
*/ |
|||
#define ADS1291_GET_BITS(bitname, reg) ((reg & bitname##_MASK) >> bitname##_POS) |
|||
|
|||
/** @brief 设置ADS1291的指定寄存器的指定位 |
|||
* @details |
|||
* @param[in] reg 寄存器名字 |
|||
* @param[in] bitname 位名字 |
|||
* @param[in] val 要设置的值 |
|||
* @retval NONE |
|||
*/ |
|||
#define ADS1291_SET_BITS(reg, bitname, val) ((reg & ~bitname##_MASK) | ((val << bitname##_POS) & bitname##_MASK)) |
|||
/* Exported functions --------------------------------------------------------*/ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
#endif /* __ADS1292_TYP_H */ |
@ -0,0 +1,151 @@ |
|||
#include "ads129x.h" |
|||
|
|||
#include "ads129x_type.h" |
|||
#include "board/app_board.h" |
|||
|
|||
#define ADS129X_CS_SET() nrf_gpio_pin_set(ADS1291_SPI_CS0_PIN); |
|||
#define ADS129X_CS_RESET() nrf_gpio_pin_clear(ADS1291_SPI_CS0_PIN); |
|||
#define ADS129X_START_SET() nrf_gpio_pin_set(ADS1291_START_PIN); |
|||
#define ADS129X_START_RESET() nrf_gpio_pin_clear(ADS1291_START_PIN); |
|||
#define ADS129X_REST_SET() nrf_gpio_pin_set(ADS1291_PWDN_PIN); |
|||
#define ADS129X_REST_RESET() nrf_gpio_pin_clear(ADS1291_PWDN_PIN); |
|||
#define ADS129X_DRDY_GET() nrf_gpio_pin_read(ADS1291_READY_PIN) |
|||
|
|||
static void port_ads129x_delay_us(uint32_t us) { nrf_delay_us(us); } |
|||
static void port_ads129x_delay_ms(uint32_t ms) { nrf_delay_ms(ms); } |
|||
|
|||
/*********************************************************************************************************************** |
|||
* BASE_FUNCTION_IMPL * |
|||
***********************************************************************************************************************/ |
|||
static ads129x_regs_t ads129X_reg = {0}; |
|||
|
|||
uint8_t port_spi_transmit_receive(uint8_t tx) { |
|||
uint8_t data; |
|||
nrf_drv_spi_transfer(&ads129x_spi, &tx, 1, &data, 1); |
|||
return data; |
|||
} |
|||
|
|||
/* ads129X发送指令 */ |
|||
uint8_t ads129X_send_cmd(uint8_t cmd) { |
|||
uint8_t rx = 0; |
|||
|
|||
ADS129X_CS_RESET(); /* 选中设备 */ |
|||
port_ads129x_delay_us(100); |
|||
|
|||
rx = port_spi_transmit_receive(cmd); |
|||
|
|||
port_ads129x_delay_us(100); |
|||
ADS129X_CS_SET(); /* 释放设备 */ |
|||
|
|||
return rx; |
|||
} |
|||
|
|||
/* ads129X读写寄存器,自动根据指令类型区分读和写操作 */ |
|||
uint8_t ads129X_rw_reg(uint8_t cmd, uint8_t data) { |
|||
uint8_t rx = 0; |
|||
|
|||
ADS129X_CS_RESET(); /* 选中设备 */ |
|||
port_ads129x_delay_us(1); |
|||
|
|||
port_spi_transmit_receive(cmd); /* 发送读写指令 */ |
|||
port_spi_transmit_receive(0X00); /* 只写一个数据 */ |
|||
|
|||
if ((cmd & ADS129X_COMMAND_RREG) == ADS129X_COMMAND_RREG) /* 判断指令类型 */ |
|||
rx = port_spi_transmit_receive(0X00); /* 返回寄存器值 */ |
|||
else |
|||
rx = port_spi_transmit_receive(data); /* 写入数值 */ |
|||
|
|||
port_ads129x_delay_us(1); |
|||
ADS129X_CS_SET(); /* 释放设备 */ |
|||
|
|||
return rx; |
|||
} |
|||
|
|||
/* 从指定寄存器开始读写一定数量的寄存器 */ |
|||
void ads129X_write_multiregs(uint8_t reg, uint8_t* ch, uint8_t size) { |
|||
uint8_t i; |
|||
|
|||
ADS129X_CS_RESET(); /* 选中设备 */ |
|||
port_ads129x_delay_us(100); |
|||
|
|||
port_spi_transmit_receive(ADS129X_COMMAND_WREG | reg); |
|||
port_ads129x_delay_us(100); |
|||
port_spi_transmit_receive(size - 1); |
|||
|
|||
for (i = 0; i < size; i++) { |
|||
port_ads129x_delay_us(100); |
|||
port_spi_transmit_receive(*ch); |
|||
ch++; |
|||
} |
|||
|
|||
port_ads129x_delay_us(100); |
|||
ADS129X_CS_SET(); |
|||
} |
|||
|
|||
/* 从指定寄存器开始读写一定数量的寄存器 */ |
|||
void ads129X_read_multiregs(uint8_t reg, uint8_t* ch, uint8_t size) { |
|||
uint8_t i; |
|||
|
|||
ADS129X_CS_RESET(); /* 选中设备 */ |
|||
port_ads129x_delay_us(100); |
|||
|
|||
port_spi_transmit_receive(ADS129X_COMMAND_RREG | reg); |
|||
port_ads129x_delay_us(100); |
|||
port_spi_transmit_receive(size - 1); |
|||
|
|||
for (i = 0; i < size; i++) { |
|||
port_ads129x_delay_us(100); |
|||
*ch = port_spi_transmit_receive(0); |
|||
ch++; |
|||
} |
|||
|
|||
port_ads129x_delay_us(100); |
|||
ADS129X_CS_SET(); |
|||
} |
|||
|
|||
/*********************************************************************************************************************** |
|||
* EXTERN * |
|||
***********************************************************************************************************************/ |
|||
|
|||
uint8_t ads129x_init() { |
|||
/** |
|||
* @brief |
|||
*/ |
|||
|
|||
ADS129X_CS_SET(); |
|||
|
|||
ADS129X_REST_RESET(); |
|||
ADS129X_START_RESET(); |
|||
port_ads129x_delay_ms(1000); |
|||
ADS129X_REST_SET(); |
|||
port_ads129x_delay_ms(100); /* 硬件复位 */ |
|||
|
|||
ads129X_send_cmd(ADS129X_COMMAND_SDATAC); /* 软件复位,并停止连续读状态 */ |
|||
port_ads129x_delay_ms(100); |
|||
ads129X_send_cmd(ADS129X_COMMAND_RESET); |
|||
port_ads129x_delay_ms(1000); |
|||
ads129X_send_cmd(ADS129X_COMMAND_SDATAC); |
|||
port_ads129x_delay_ms(100); |
|||
|
|||
nrf_gpio_pin_set(ADS1291_PWDN_PIN); |
|||
nrf_delay_ms(2000); |
|||
char txdata[] = {1, 2, 3, 4}; |
|||
while (true) /* 识别芯片型号,1291:0x52 */ |
|||
{ |
|||
uint8_t id = ads129X_rw_reg(ADS129X_COMMAND_RREG | ADS129X_REG_ID, 0); |
|||
// nrf_log_backend_uart_tx_raw(txdata, 4); |
|||
// znordic_force_flush_log(); |
|||
|
|||
ZLOGI("ads129X id: %x", id); |
|||
nrf_delay_ms(1000); |
|||
} |
|||
} |
|||
|
|||
uint8_t ads129x_start_capture(uint8_t* cfg, bool test) { return 0; } |
|||
uint8_t ads129x_enter_low_power_mode() { return 0; } |
|||
uint8_t ads129x_enter_lead_off_detect_mode() { return 0; } |
|||
|
|||
uint8_t ads129x_data_is_ready() { return 0; } |
|||
void ads129x_read_data(uint8_t* data, uint8_t len) {} |
|||
|
|||
uint8_t ads129x_get_lead_off_state() { return 0; } |
@ -0,0 +1,26 @@ |
|||
#pragma once |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
#include <stdbool.h> |
|||
#include <stdint.h> |
|||
|
|||
/** |
|||
* @brief ³õʼ»¯SPI |
|||
*/ |
|||
|
|||
uint8_t ads129x_init(); |
|||
|
|||
uint8_t ads129x_start_capture(uint8_t* cfg, bool test); |
|||
uint8_t ads129x_enter_low_power_mode(); |
|||
uint8_t ads129x_enter_lead_off_detect_mode(); |
|||
|
|||
uint8_t ads129x_data_is_ready(); |
|||
void ads129x_read_data(uint8_t* data, uint8_t len); |
|||
|
|||
uint8_t ads129x_get_lead_off_state(); |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
@ -0,0 +1,286 @@ |
|||
#pragma once |
|||
#include <stdint.h> |
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
typedef enum { |
|||
ADS129X_REG_ID = 0x00, |
|||
ADS129X_REG_CONFIG1 = 0x01, |
|||
ADS129X_REG_CONFIG2 = 0x02, |
|||
ADS129X_REG_LOFF = 0x03, |
|||
ADS129X_REG_CH1SET = 0x04, |
|||
ADS129X_REG_CH2SET = 0x05, |
|||
ADS129X_REG_RLDSENS = 0x06, |
|||
ADS129X_REG_LOFFSENS = 0x07, |
|||
ADS129X_REG_LOFFSTAT = 0x08, |
|||
ADS129X_REG_RESP1 = 0x09, |
|||
ADS129X_REG_RESP2 = 0x0A, |
|||
ADS129X_REG_GPIO = 0x0B |
|||
} ADS129X_REG_E; |
|||
|
|||
typedef struct { |
|||
uint8_t id; /* id,ads1292r固定为0x73 */ |
|||
uint8_t cfg1; /* 设置寄存器 */ |
|||
uint8_t cfg2; /* 设置寄存器 */ |
|||
uint8_t loff; /* 导联 */ |
|||
uint8_t ch1set; /* 通道一设置 */ |
|||
uint8_t ch2set; /* 通道二设置 */ |
|||
uint8_t rld_sens; /* 右腿驱动 */ |
|||
uint8_t loff_sens; /* 导联 */ |
|||
uint8_t loff_stat; /* 导联 */ |
|||
uint8_t resp1; /* 呼吸 */ |
|||
uint8_t resp2; /* 呼吸 */ |
|||
uint8_t gpio; /* gpio1,2的控制 */ |
|||
} ads129x_regs_t; |
|||
|
|||
#define ADS129X_REG_SIZE_MAX 12 /* ADS1291寄存器数量 */ |
|||
#define ADS129X_ID 0x52 |
|||
|
|||
/* 属于ADS129X_REG_CONFIG1的寄存器设置 */ |
|||
#define ADS129X_SINGLE_SHOT_OFF 0 /* 连续转换模式,默认 */ |
|||
#define ADS129X_SINGLE_SHOT_ON 1 /* 单次转换模式 */ |
|||
/* 采样率,该模块采用fclk为512k,0分频模式,其他配置下采样率会改变 */ |
|||
#define ADS129X_OVERSAMPLING_125SPS 0 |
|||
#define ADS129X_OVERSAMPLING_250SPS 1 |
|||
#define ADS129X_OVERSAMPLING_500SPS 2 /* 默认 */ |
|||
#define ADS129X_OVERSAMPLING_1000SPS 3 |
|||
#define ADS129X_OVERSAMPLING_2000SPS 4 |
|||
#define ADS129X_OVERSAMPLING_4000SPS 5 |
|||
#define ADS129X_OVERSAMPLING_8000SPS 6 |
|||
#define ADS129X_OVERSAMPLING_NONESPS 7 |
|||
|
|||
/* 属于ADS129X_REG_CONFIG2的寄存器设置 */ |
|||
#define ADS129X_PDB_LOFF_COMP_OFF 0 /* 导联脱落比较器关,默认 */ |
|||
#define ADS129X_PDB_LOFF_COMP_ON 1 /* 导联脱落比较器开 */ |
|||
#define ADS129X_PDB_REFBUF_OFF 0 /* 内部参考电压关,默认 */ |
|||
#define ADS129X_PDB_REFBUF_ON 1 /* 内部参考电压开 */ |
|||
#define ADS129X_VREF_2420MV 0 /* 选择参考电压为2.42v,默认 */ |
|||
#define ADS129X_VREF_4033MV 1 /* 选择参考电压为4.033v */ |
|||
#define ADS129X_CLK_OUTPUT_OFF 0 /* 时钟输出关,默认 */ |
|||
#define ADS129X_CLK_OUTPUT_ON 1 /* 时钟输出开 */ |
|||
#define ADS129X_INT_TEST_OFF 0 /* 内部测试电压关,默认 */ |
|||
#define ADS129X_INT_TEST_ON 1 /* 内部测试电压开 */ |
|||
#define ADS129X_INT_FREQ_DC 0 /* 直流,默认 */ |
|||
#define ADS129X_INT_FREQ_AC 1 /* 1HZ方波 */ |
|||
|
|||
/* 属于ADS129X_REG_LOFF的寄存器设置 */ |
|||
|
|||
/* 属于ADS129X_REG_CH1SET,与ADS129X_REG_CH2SET的寄存器设置 */ |
|||
#define ADS129X_CHx_OFF 1 /* 禁止使用通道一 */ |
|||
#define ADS129X_CHx_ON 0 /* 使用通道一,默认 */ |
|||
|
|||
#define ADS129X_GAIN_6 0 /* 使用通道一6倍增益,默认 */ |
|||
#define ADS129X_GAIN_1 1 /* 使用通道一1倍增益 */ |
|||
#define ADS129X_GAIN_2 2 /* 使用通道一2倍增益 */ |
|||
#define ADS129X_GAIN_3 3 /* 使用通道一3倍增益 */ |
|||
#define ADS129X_GAIN_4 4 /* 使用通道一4倍增益 */ |
|||
#define ADS129X_GAIN_8 5 /* 使用通道一8倍增益 */ |
|||
#define ADS129X_GAIN_12 6 /* 使用通道一12倍增益 */ |
|||
/* 选择通道一的输入 */ |
|||
#define ADS129X_CHx_INPUT_NORMAL 0 /* 正常电极输入,默认 */ |
|||
#define ADS129X_CHx_INPUT_SHORTED 1 /* 短路,测偏执用 */ |
|||
#define ADS129X_CHx_INPUT_RLD 2 /* 右腿驱动 */ |
|||
/* For channel 1, (MVDDP – MVDDN) is [0.5(AVDD + AVSS)]; for channel 2, (MVDDP – MVDDN) is DVDD / 4. */ |
|||
/* For channel 2,VDD / 2 for supply measurement */ |
|||
#define ADS129X_CHx_INPUT_MVDD 3 |
|||
#define ADS129X_CHx_INPUT_TEMP 4 /* 板载温度 */ |
|||
#define ADS129X_CHx_INPUT_TEST 5 /* 内部测试信号 */ |
|||
#define ADS129X_CHx_INPUT_RLDDRP 6 |
|||
#define ADS129X_CHx_INPUT_RLDDRM 7 |
|||
#define ADS129X_CHx_INPUT_RLDDRPM 8 |
|||
#define ADS129X_CHx_INPUT_ROUTE 9 /* 连接到通道三 */ |
|||
#define ADS129X_CHx_INPUT_RESERVED 10 /* 预留 */ |
|||
|
|||
/* 属于ADS129X_REG_RLDSENS的寄存器设置 */ |
|||
#define ADS129X_CHOP_FREQ_DIV4 3 /* PGA斩波频率未fMOD/4 */ |
|||
#define ADS129X_PDB_RLD_OFF 0 /* 右腿驱动电源关,默认 */ |
|||
#define ADS129X_PDB_RLD_ON 1 /* 右腿驱动电源开 */ |
|||
#define ADS129X_PDB_RLD_SENSE_OFF 0 /* 右腿驱动导联脱落检测关,默认 */ |
|||
#define ADS129X_PDB_RLD_SENSE_ON 1 /* 右腿驱动导联脱落检测开 */ |
|||
#define ADS129X_RLD2N_OFF 0 /* 通道二负极为右腿输入关,默认 */ |
|||
#define ADS129X_RLD2N_ON 1 /* 通道二负极为右腿输入开 */ |
|||
#define ADS129X_RLD2P_OFF 0 /* 通道二正极为右腿输入关,默认 */ |
|||
#define ADS129X_RLD2P_ON 1 /* 通道二正极为右腿输入开 */ |
|||
#define ADS129X_RLD1N_OFF 0 /* 通道一负极为右腿输入关,默认 */ |
|||
#define ADS129X_RLD1N_ON 1 /* 通道一负极为右腿输入开 */ |
|||
#define ADS129X_RLD1P_OFF 0 /* 通道一正极为右腿输入关,默认 */ |
|||
#define ADS129X_RLD1P_ON 1 /* 通道一正极为右腿输入开 */ |
|||
|
|||
/* 属于ADS129X_REG_LOFFSENS的寄存器设置 */ |
|||
#define ADS129X_FLIP2_OFF 0 /* 导联脱落检测通道二电流方向关,默认 */ |
|||
#define ADS129X_FLIP2_ON 1 /* 导联脱落检测通道二电流方向开 */ |
|||
#define ADS129X_FLIP1_OFF 0 /* 导联脱落检测通道一电流方向关,默认 */ |
|||
#define ADS129X_FLIP1_ON 1 /* 导联脱落检测通道一电流方向开 */ |
|||
#define ADS129X_LOFF2N_OFF 0 /* 通道二负极导联脱落检测关,默认 */ |
|||
#define ADS129X_LOFF2N_ON 1 /* 通道二负极导联脱落检测开 */ |
|||
#define ADS129X_LOFF2P_OFF 0 /* 通道二正极导联脱落检测关,默认 */ |
|||
#define ADS129X_LOFF2P_ON 1 /* 通道二正极导联脱落检测开 */ |
|||
#define ADS129X_LOFF1N_OFF 0 /* 通道一负极导联脱落检测关,默认 */ |
|||
#define ADS129X_LOFF1N_ON 1 /* 通道一负极导联脱落检测开 */ |
|||
#define ADS129X_LOFF1P_OFF 0 /* 通道一正极导联脱落检测关,默认 */ |
|||
#define ADS129X_LOFF1P_ON 1 /* 通道一正极导联脱落检测开 */ |
|||
|
|||
/* 属于ADS129X_REG_LOFFSTAT的寄存器设置 */ |
|||
#define ADS129X_CLK_DIV4 0 /* 0 = fMOD = fCLK / 4 (default, use when fCLK = 512 kHz) */ |
|||
#define ADS129X_CLK_DIV16 1 /* 1 = fMOD = fCLK / 16 (use when fCLK = 2.048 MHz) */ |
|||
|
|||
/* 属于ADS129X_REG_RESP1的寄存器设置 */ |
|||
#define ADS129X_DEMOD_EN1_OFF 0 /* 通道一上的呼吸解调电路关,默认 */ |
|||
#define ADS129X_DEMOD_EN1_ON 1 /* 通道一上的呼吸解调电路开 */ |
|||
#define ADS129X_DEMOD_EN_OFF 0 /* 通道一上的呼吸调制电路关,默认 */ |
|||
#define ADS129X_DEMOD_EN_ON 1 /* 通道一上的呼吸调制电路开 */ |
|||
#define ADS129X_RESPPH_0 0 /* 解调信号相位偏移0,默认 */ |
|||
#define ADS129X_RESPPH_135 0x0c /* 解调信号相位偏移135度 */ |
|||
#define ADS129X_RESP_CTRL_INT 0 /* 内部呼吸内部时钟,默认 */ |
|||
#define ADS129X_RESP_CTRL_EXT 1 /* 内部呼吸外部时钟 */ |
|||
|
|||
/* 属于ADS129X_REG_RESP2的寄存器设置 */ |
|||
#define ADS129X_CALIB_ON_OFF 0 /* 校准关,默认 */ |
|||
#define ADS129X_CALIB_ON_ON 1 /* 校准开 */ |
|||
#define ADS129X_RESP_FREQ_36 0 /* 通道一上的呼吸调制电路关,默认 */ |
|||
#define ADS129X_RESP_FREQ_64 1 /* 通道一上的呼吸调制电路开 */ |
|||
#define ADS129X_RLDREF_EXT 0 /* 右腿驱动参考电压选择外部反馈,默认 */ |
|||
#define ADS129X_RLDREF_INT 1 /* 右腿驱动参考电压选择内部信号 */ |
|||
|
|||
/* 属于ADS129X_REG_GPIO的寄存器设置 */ |
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** @addtogroup ADS129X_TYP_REG_MASK ADS1291 TYP Reg Mask |
|||
* @brief 各寄存器值与位置掩码,被ADS129X_GET_BITS与ADS129X_SET_BITS函数调用 |
|||
* @{ |
|||
*/ |
|||
#define ADS129X_ID_POS 0 |
|||
#define ADS129X_ID_MASK 0xFF |
|||
|
|||
#define ADS129X_SINGLE_SHOT_POS 7 |
|||
#define ADS129X_SINGLE_SHOT_MASK 0x80 |
|||
#define ADS129X_DR_POS 0 |
|||
#define ADS129X_DR_MASK 0x07 |
|||
|
|||
#define ADS129X_PDB_LOFF_COMP_POS 6 |
|||
#define ADS129X_PDB_LOFF_COMP_MASK 0x40 |
|||
#define ADS129X_PDB_REFBUF_POS 5 |
|||
#define ADS129X_PDB_REFBUF_MASK 0x20 |
|||
#define ADS129X_VREF_4V_POS 4 |
|||
#define ADS129X_VREF_4V_MASK 0x10 |
|||
#define ADS129X_CLK_EN_POS 3 |
|||
#define ADS129X_CLK_EN_MASK 0x80 |
|||
#define ADS129X_INT_TEST_POS 1 |
|||
#define ADS129X_INT_TEST_MASK 0x02 |
|||
#define ADS129X_INT_FREQ_POS 0 |
|||
#define ADS129X_INT_FREQ_MASK 0x01 |
|||
|
|||
#define ADS129X_PDx_POS 7 |
|||
#define ADS129X_PDx_MASK 0x80 |
|||
#define ADS129X_GAINx_POS 4 |
|||
#define ADS129X_GAINx_MASK 0x70 |
|||
#define ADS129X_MUXx_POS 0 |
|||
#define ADS129X_MUXx_MASK 0x0F |
|||
|
|||
#define ADS129X_CHOP_POS 6 |
|||
#define ADS129X_CHOP_MASK 0xC0 |
|||
#define ADS129X_PDB_RLD_POS 5 |
|||
#define ADS129X_PDB_RLD_MASK 0x20 |
|||
#define ADS129X_RLD_LOFF_SENSE_POS 4 |
|||
#define ADS129X_RLD_LOFF_SENSE_MASK 0x10 |
|||
#define ADS129X_RLD2N_POS 3 |
|||
#define ADS129X_RLD2N_MASK 0x08 |
|||
#define ADS129X_RLD2P_POS 2 |
|||
#define ADS129X_RLD2P_MASK 0x04 |
|||
#define ADS129X_RLD1N_POS 1 |
|||
#define ADS129X_RLD1N_MASK 0x02 |
|||
#define ADS129X_RLD1P_POS 0 |
|||
#define ADS129X_RLD1P_MASK 0x01 |
|||
|
|||
#define ADS129X_FLIP2_POS 5 |
|||
#define ADS129X_FLIP2_MASK 0x20 |
|||
#define ADS129X_FLIP1_POS 4 |
|||
#define ADS129X_FLIP1_MASK 0x10 |
|||
#define ADS129X_LOFF2N_POS 3 |
|||
#define ADS129X_LOFF2N_MASK 0x08 |
|||
#define ADS129X_LOFF2P_POS 2 |
|||
#define ADS129X_LOFF2P_MASK 0x04 |
|||
#define ADS129X_LOFFN_POS 1 |
|||
#define ADS129X_LOFF1N_MASK 0x02 |
|||
#define ADS129X_LOFF1P_POS 0 |
|||
#define ADS129X_LOFF1P_MASK 0x01 |
|||
|
|||
#define ADS129X_CLK_DIV_POS 6 |
|||
#define ADS129X_CLK_DIV_MASK 0x40 |
|||
|
|||
#define ADS129X_RESP_DEMOD_EN1_POS 7 |
|||
#define ADS129X_RESP_DEMOD_EN1_MASK 0x80 |
|||
#define ADS129X_RESP_MOD_EN_POS 6 |
|||
#define ADS129X_RESP_MOD_EN_MASK 0x40 |
|||
#define ADS129X_RESP_PH_POS 2 |
|||
#define ADS129X_RESP_PH_MASK 0x3c |
|||
#define ADS129X_RESP_CTRL_POS 0 |
|||
#define ADS129X_RESP_CTRL_MASK 0x01 |
|||
|
|||
#define ADS129X_CALIB_ON_POS 7 |
|||
#define ADS129X_CALIB_ON_MASK 0x80 |
|||
#define ADS129X_RESP_FREQ_POS 2 |
|||
#define ADS129X_RESP_FREQ_MASK 0x04 |
|||
#define ADS129X_RLDREF_INT_POS 1 |
|||
#define ADS129X_RLDREF_INT_MASK 0x02 |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** @addtogroup ADS129X_TYP_COMMAND ADS1291 TYP COMMAND |
|||
* @brief 命令 |
|||
* @{ |
|||
*/ |
|||
/* System Commands */ |
|||
#define ADS129X_COMMAND_WAKEUP 0x02 |
|||
#define ADS129X_COMMAND_STANDBY 0x04 |
|||
#define ADS129X_COMMAND_RESET 0x06 |
|||
#define ADS129X_COMMAND_START 0x08 |
|||
#define ADS129X_COMMAND_STOP 0x0A |
|||
#define ADS129X_COMMAND_OFFSETCAL 0x1A |
|||
|
|||
/* Data Read Commands */ |
|||
#define ADS129X_COMMAND_RDATAC 0x10 |
|||
#define ADS129X_COMMAND_SDATAC 0x11 |
|||
#define ADS129X_COMMAND_RDATA 0x12 |
|||
|
|||
/* Register Read Commands,最后5位为读写的地址 */ |
|||
#define ADS129X_COMMAND_RREG 0x20 |
|||
#define ADS129X_COMMAND_WREG 0x40 |
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/** |
|||
* @} |
|||
*/ |
|||
|
|||
/* Exported macro ------------------------------------------------------------*/ |
|||
/** @brief 读取ADS1291的指定寄存器的指定位 |
|||
* @details |
|||
* @param[in] bitname 位名字 |
|||
* @param[in] reg 寄存器名字 |
|||
* @retval 该位的值 |
|||
*/ |
|||
#define ADS129X_GET_BITS(bitname, reg) ((reg & bitname##_MASK) >> bitname##_POS) |
|||
|
|||
/** @brief 设置ADS1291的指定寄存器的指定位 |
|||
* @details |
|||
* @param[in] reg 寄存器名字 |
|||
* @param[in] bitname 位名字 |
|||
* @param[in] val 要设置的值 |
|||
* @retval NONE |
|||
*/ |
|||
#define ADS129X_SET_BITS(reg, bitname, val) ((reg & ~bitname##_MASK) | ((val << bitname##_POS) & bitname##_MASK)) |
|||
/* Exported functions --------------------------------------------------------*/ |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
@ -0,0 +1,70 @@ |
|||
#include "app_board.h" |
|||
|
|||
/*********************************************************************************************************************** |
|||
* MARCO * |
|||
***********************************************************************************************************************/ |
|||
#define APP_BOARD_INIT_CHECK(exptr) \ |
|||
do { \ |
|||
ret_code_t ecode = (exptr); \ |
|||
if (ecode != NRF_SUCCESS) { \ |
|||
ZLOGE("%s:%d ZERROR_CHECK(%s) fail:%d", __FILE__, __LINE__, #exptr, ecode); \ |
|||
} \ |
|||
} while (0) |
|||
|
|||
/*********************************************************************************************************************** |
|||
* HARDWARE_INSTANCE * |
|||
***********************************************************************************************************************/ |
|||
|
|||
nrf_drv_spi_t ads129x_spi = NRF_DRV_SPI_INSTANCE(ADS1291_SPI_INSTANCE); // global |
|||
static nrf_drv_spi_config_t ads129x_spi_config = { |
|||
.sck_pin = ADS1291_SPI_SCK_PIN, |
|||
.mosi_pin = ADS1291_SPI_MOSI_PIN, |
|||
.miso_pin = ADS1291_SPI_MISO_PIN, |
|||
.ss_pin = NRF_DRV_SPI_PIN_NOT_USED, |
|||
.irq_priority = SPI_DEFAULT_CONFIG_IRQ_PRIORITY, |
|||
.orc = 0xFF, |
|||
.frequency = NRF_DRV_SPI_FREQ_8M, |
|||
.mode = NRF_DRV_SPI_MODE_1, |
|||
.bit_order = NRF_DRV_SPI_BIT_ORDER_MSB_FIRST, |
|||
}; |
|||
on_irq_t ads129x_ready_pin_listener; |
|||
|
|||
static void ads1291_ready_pin_irq(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) { // |
|||
if (ads129x_ready_pin_listener) ads129x_ready_pin_listener(kon_irq_ads1291_ready_pin); |
|||
} |
|||
|
|||
void app_board_init() { |
|||
nrfx_gpiote_init(); |
|||
|
|||
/*********************************************************************************************************************** |
|||
* ads129x * |
|||
***********************************************************************************************************************/ |
|||
APP_BOARD_INIT_CHECK(nrf_drv_spi_init(&ads129x_spi, &ads129x_spi_config, NULL, NULL)); |
|||
znrf_gpio_cfg_output(ADS1291_PWDN_PIN, NRF_GPIO_PIN_NOPULL); |
|||
znrf_gpio_cfg_output(ADS1291_START_PIN, NRF_GPIO_PIN_NOPULL); |
|||
znrf_gpio_cfg_output(ADS1291_SPI_CS0_PIN, NRF_GPIO_PIN_NOPULL); |
|||
nrf_gpio_pin_clear(ADS1291_PWDN_PIN); |
|||
nrf_gpio_pin_clear(ADS1291_START_PIN); |
|||
nrf_gpio_pin_set(ADS1291_SPI_CS0_PIN); |
|||
|
|||
// --------------------------------------------------------------------------- |
|||
nrf_gpio_cfg_input(ADS1291_READY_PIN, NRF_GPIO_PIN_NOPULL); |
|||
{ |
|||
nrf_gpio_cfg_input(ADS1291_READY_PIN, NRF_GPIO_PIN_PULLUP); |
|||
nrf_drv_gpiote_in_config_t inConfig = GPIOTE_CONFIG_IN_SENSE_TOGGLE(false); // |
|||
inConfig.pull = NRF_GPIO_PIN_PULLUP; // ĬÈÏÉÏÀ |
|||
inConfig.sense = NRF_GPIOTE_POLARITY_HITOLO; // ϽµÑØ´¥·¢ |
|||
nrfx_gpiote_in_init(ADS1291_READY_PIN, &inConfig, ads1291_ready_pin_irq); |
|||
} |
|||
} |
|||
|
|||
void app_board_reg_irq_listener(app_board_irq_event_t event, on_irq_t listener) { |
|||
switch (event) { |
|||
case kon_irq_ads1291_ready_pin: |
|||
ads129x_ready_pin_listener = listener; |
|||
break; |
|||
default: |
|||
break; |
|||
} |
|||
} |
|||
void app_board_change_state(app_board_power_state_t state) {} |
@ -0,0 +1,38 @@ |
|||
#pragma once |
|||
#include "nrf_drv_gpiote.h" |
|||
#include "znordic.h" |
|||
|
|||
#define ADS1291_SPI_INSTANCE 2 |
|||
|
|||
/*********************************************************************************************************************** |
|||
* ADS1291_IF * |
|||
***********************************************************************************************************************/ |
|||
#define ADS1291_SPI_CS0_PIN 3 |
|||
#define ADS1291_SPI_SCK_PIN (32 + 3) |
|||
#define ADS1291_SPI_MOSI_PIN 19 |
|||
#define ADS1291_SPI_MISO_PIN (32 + 5) |
|||
#define ADS1291_PWDN_PIN 28 |
|||
#define ADS1291_START_PIN 2 |
|||
#define ADS1291_READY_PIN 23 |
|||
|
|||
typedef enum { |
|||
kapp_power_state_uint, |
|||
kapp_power_state_standby, |
|||
kapp_power_state_working, |
|||
} app_board_power_state_t; |
|||
|
|||
typedef enum { |
|||
kon_irq_ads1291_ready_pin, |
|||
kon_irq_max, |
|||
} app_board_irq_event_t; |
|||
|
|||
typedef void (*on_irq_t)(app_board_irq_event_t event); |
|||
|
|||
void app_board_init(); |
|||
void app_board_reg_irq_listener(app_board_irq_event_t event, on_irq_t listener); |
|||
void app_board_change_state(app_board_power_state_t state); |
|||
|
|||
/*********************************************************************************************************************** |
|||
* GLOBAL * |
|||
***********************************************************************************************************************/ |
|||
extern nrf_drv_spi_t ads129x_spi; |
@ -1 +1 @@ |
|||
Subproject commit 2668dd622893481e990fadd346385af93af3f2d7 |
|||
Subproject commit 01225055c1cbd6e6b3bc50a5f084d4e515063512 |
@ -1 +1 @@ |
|||
Subproject commit 1d34e6ac316c27dc0e1149835d5f1ad53e074c88 |
|||
Subproject commit 864d18285a795072cd58f877237749e22c5baf27 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue