From bd3293a71caeb9de3a07bd4a25376a3ade2a43b3 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Wed, 1 May 2024 16:20:09 +0800 Subject: [PATCH] update --- .clang-format | 2 +- .vscode/settings.json | 5 +- app/app.uvoptx | 186 +++++++----- app/app.uvprojx | 20 ++ app/config/sdk_config.h | 1 + app/src/aproject_config/config.h | 2 + app/src/board/ads1291/ads1291.c | 133 --------- app/src/board/ads1291/ads1291.h | 28 -- app/src/board/ads1291/ads1291_type.h | 330 --------------------- app/src/board/ads129x/ads129x.c | 151 ++++++++++ app/src/board/ads129x/ads129x.h | 26 ++ app/src/board/ads129x/ads129x_type.h | 286 ++++++++++++++++++ app/src/board/app_board.c | 70 +++++ app/src/board/app_board.h | 38 +++ app/src/board/board_ecg_sensor.c | 4 +- app/src/main.c | 6 +- app/src/one_conduction_main.c | 8 +- .../heart_wave_sample_service.c | 1 + libznordic | 2 +- scripter/build_app.bat | 2 +- sdk | 2 +- 21 files changed, 719 insertions(+), 584 deletions(-) delete mode 100644 app/src/board/ads1291/ads1291.c delete mode 100644 app/src/board/ads1291/ads1291.h delete mode 100644 app/src/board/ads1291/ads1291_type.h create mode 100644 app/src/board/ads129x/ads129x.c create mode 100644 app/src/board/ads129x/ads129x.h create mode 100644 app/src/board/ads129x/ads129x_type.h create mode 100644 app/src/board/app_board.c create mode 100644 app/src/board/app_board.h diff --git a/.clang-format b/.clang-format index 4c41736..45866f9 100644 --- a/.clang-format +++ b/.clang-format @@ -2,7 +2,7 @@ # http://clang.llvm.org/docs/ClangFormatStyleOptions.html Language: Cpp BasedOnStyle: Google -ColumnLimit: 300 +ColumnLimit: 160 AlignConsecutiveMacros: true AlignConsecutiveDeclarations: true AlignConsecutiveAssignments: true diff --git a/.vscode/settings.json b/.vscode/settings.json index e9f48ee..190f974 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -200,7 +200,10 @@ "ble_cmd_process_service.h": "c", "storage_service.h": "c", "board_ssd1306_interface.h": "c", - "zsdk_ble_slave_config.h": "c" + "zsdk_ble_slave_config.h": "c", + "ads129x.h": "c", + "ads129x_if_impl.h": "c", + "ads129x_type.h": "c" }, "files.encoding": "gbk" } \ No newline at end of file diff --git a/app/app.uvoptx b/app/app.uvoptx index 30b741f..5f30502 100644 --- a/app/app.uvoptx +++ b/app/app.uvoptx @@ -667,6 +667,30 @@ 0 0 + + 1 + 26 + 1 + 0 + 0 + 0 + .\src\board\ads129x\ads129x.c + ads129x.c + 0 + 0 + + + 1 + 27 + 1 + 0 + 0 + 0 + .\src\board\app_board.c + app_board.c + 0 + 0 + @@ -677,7 +701,7 @@ 0 2 - 26 + 28 1 0 0 @@ -697,7 +721,7 @@ 0 3 - 27 + 29 1 0 0 @@ -709,7 +733,7 @@ 3 - 28 + 30 1 0 0 @@ -729,7 +753,7 @@ 0 4 - 29 + 31 1 0 0 @@ -749,7 +773,7 @@ 0 5 - 30 + 32 1 0 0 @@ -761,7 +785,7 @@ 5 - 31 + 33 1 0 0 @@ -773,7 +797,7 @@ 5 - 32 + 34 1 0 0 @@ -785,7 +809,7 @@ 5 - 33 + 35 1 0 0 @@ -797,7 +821,7 @@ 5 - 34 + 36 1 0 0 @@ -809,7 +833,7 @@ 5 - 35 + 37 1 0 0 @@ -821,7 +845,7 @@ 5 - 36 + 38 1 0 0 @@ -833,7 +857,7 @@ 5 - 37 + 39 1 0 0 @@ -853,7 +877,7 @@ 0 6 - 38 + 40 1 0 0 @@ -873,7 +897,7 @@ 0 7 - 39 + 41 1 0 0 @@ -885,7 +909,7 @@ 7 - 40 + 42 1 0 0 @@ -897,7 +921,7 @@ 7 - 41 + 43 1 0 0 @@ -909,7 +933,7 @@ 7 - 42 + 44 1 0 0 @@ -921,7 +945,7 @@ 7 - 43 + 45 1 0 0 @@ -933,7 +957,7 @@ 7 - 44 + 46 1 0 0 @@ -945,7 +969,7 @@ 7 - 45 + 47 1 0 0 @@ -957,7 +981,7 @@ 7 - 46 + 48 1 0 0 @@ -969,7 +993,7 @@ 7 - 47 + 49 1 0 0 @@ -981,7 +1005,7 @@ 7 - 48 + 50 1 0 0 @@ -993,7 +1017,7 @@ 7 - 49 + 51 1 0 0 @@ -1005,7 +1029,7 @@ 7 - 50 + 52 1 0 0 @@ -1017,7 +1041,7 @@ 7 - 51 + 53 1 0 0 @@ -1029,7 +1053,7 @@ 7 - 52 + 54 1 0 0 @@ -1041,7 +1065,7 @@ 7 - 53 + 55 1 0 0 @@ -1053,7 +1077,7 @@ 7 - 54 + 56 1 0 0 @@ -1065,7 +1089,7 @@ 7 - 55 + 57 1 0 0 @@ -1077,7 +1101,7 @@ 7 - 56 + 58 1 0 0 @@ -1089,7 +1113,7 @@ 7 - 57 + 59 1 0 0 @@ -1101,7 +1125,7 @@ 7 - 58 + 60 1 0 0 @@ -1121,7 +1145,7 @@ 0 8 - 59 + 61 1 0 0 @@ -1133,7 +1157,7 @@ 8 - 60 + 62 1 0 0 @@ -1145,7 +1169,7 @@ 8 - 61 + 63 1 0 0 @@ -1157,7 +1181,7 @@ 8 - 62 + 64 1 0 0 @@ -1169,7 +1193,7 @@ 8 - 63 + 65 1 0 0 @@ -1181,7 +1205,7 @@ 8 - 64 + 66 1 0 0 @@ -1193,7 +1217,7 @@ 8 - 65 + 67 1 0 0 @@ -1205,7 +1229,7 @@ 8 - 66 + 68 1 0 0 @@ -1217,7 +1241,7 @@ 8 - 67 + 69 1 0 0 @@ -1229,7 +1253,7 @@ 8 - 68 + 70 1 0 0 @@ -1241,7 +1265,7 @@ 8 - 69 + 71 1 0 0 @@ -1253,7 +1277,7 @@ 8 - 70 + 72 1 0 0 @@ -1265,7 +1289,7 @@ 8 - 71 + 73 1 0 0 @@ -1277,7 +1301,7 @@ 8 - 72 + 74 1 0 0 @@ -1289,7 +1313,7 @@ 8 - 73 + 75 1 0 0 @@ -1301,7 +1325,7 @@ 8 - 74 + 76 1 0 0 @@ -1313,7 +1337,7 @@ 8 - 75 + 77 1 0 0 @@ -1325,7 +1349,7 @@ 8 - 76 + 78 1 0 0 @@ -1337,7 +1361,7 @@ 8 - 77 + 79 1 0 0 @@ -1349,7 +1373,7 @@ 8 - 78 + 80 1 0 0 @@ -1361,7 +1385,7 @@ 8 - 79 + 81 1 0 0 @@ -1373,7 +1397,7 @@ 8 - 80 + 82 1 0 0 @@ -1385,7 +1409,7 @@ 8 - 81 + 83 1 0 0 @@ -1397,7 +1421,7 @@ 8 - 82 + 84 1 0 0 @@ -1409,7 +1433,7 @@ 8 - 83 + 85 1 0 0 @@ -1421,7 +1445,7 @@ 8 - 84 + 86 1 0 0 @@ -1433,7 +1457,7 @@ 8 - 85 + 87 1 0 0 @@ -1453,7 +1477,7 @@ 0 9 - 86 + 88 1 0 0 @@ -1465,7 +1489,7 @@ 9 - 87 + 89 1 0 0 @@ -1477,7 +1501,7 @@ 9 - 88 + 90 1 0 0 @@ -1489,7 +1513,7 @@ 9 - 89 + 91 1 0 0 @@ -1501,7 +1525,7 @@ 9 - 90 + 92 1 0 0 @@ -1513,7 +1537,7 @@ 9 - 91 + 93 1 0 0 @@ -1533,7 +1557,7 @@ 0 10 - 92 + 94 1 0 0 @@ -1545,7 +1569,7 @@ 10 - 93 + 95 1 0 0 @@ -1557,7 +1581,7 @@ 10 - 94 + 96 1 0 0 @@ -1577,7 +1601,7 @@ 0 11 - 95 + 97 1 0 0 @@ -1589,7 +1613,7 @@ 11 - 96 + 98 1 0 0 @@ -1601,7 +1625,7 @@ 11 - 97 + 99 1 0 0 @@ -1621,7 +1645,7 @@ 0 12 - 98 + 100 1 0 0 @@ -1633,7 +1657,7 @@ 12 - 99 + 101 1 0 0 @@ -1645,7 +1669,7 @@ 12 - 100 + 102 1 0 0 @@ -1665,7 +1689,7 @@ 0 13 - 101 + 103 1 0 0 @@ -1677,7 +1701,7 @@ 13 - 102 + 104 1 0 0 @@ -1697,7 +1721,7 @@ 0 14 - 103 + 105 1 0 0 @@ -1709,7 +1733,7 @@ 14 - 104 + 106 1 0 0 @@ -1721,7 +1745,7 @@ 14 - 105 + 107 1 0 0 @@ -1733,7 +1757,7 @@ 14 - 106 + 108 1 0 0 diff --git a/app/app.uvprojx b/app/app.uvprojx index fa261df..13cc01b 100644 --- a/app/app.uvprojx +++ b/app/app.uvprojx @@ -508,6 +508,16 @@ 1 .\src\basic_service\app_event_distribute.c + + ads129x.c + 1 + .\src\board\ads129x\ads129x.c + + + app_board.c + 1 + .\src\board\app_board.c + @@ -4397,6 +4407,16 @@ 1 .\src\basic_service\app_event_distribute.c + + ads129x.c + 1 + .\src\board\ads129x\ads129x.c + + + app_board.c + 1 + .\src\board\app_board.c + diff --git a/app/config/sdk_config.h b/app/config/sdk_config.h index 8ffb981..d1db7a5 100644 --- a/app/config/sdk_config.h +++ b/app/config/sdk_config.h @@ -3,5 +3,6 @@ #define NRF_LOG_ENABLED 1 #define NRF_LOG_BACKEND_UART_ENABLED 1 #define NRF_LOG_BACKEND_UART_TX_PIN 41 +#define DEBUG #include "libznordic/zsdk_config/zsdk_ble_slave_config.h" \ No newline at end of file diff --git a/app/src/aproject_config/config.h b/app/src/aproject_config/config.h index 9acfc73..9e59a04 100644 --- a/app/src/aproject_config/config.h +++ b/app/src/aproject_config/config.h @@ -33,6 +33,8 @@ #define BATTERY_ADC_CHANNEL 1 // 不重复即可 #define BATTERY_CHARGE_DETECT_PIN 6 + + /** * @brief */ diff --git a/app/src/board/ads1291/ads1291.c b/app/src/board/ads1291/ads1291.c deleted file mode 100644 index 556b9fa..0000000 --- a/app/src/board/ads1291/ads1291.c +++ /dev/null @@ -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); diff --git a/app/src/board/ads1291/ads1291.h b/app/src/board/ads1291/ads1291.h deleted file mode 100644 index daac12f..0000000 --- a/app/src/board/ads1291/ads1291.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef __ADS1292R_H -#define __ADS1292R_H - -#ifdef __cplusplus -extern "C" { -#endif -#include -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 */ diff --git a/app/src/board/ads1291/ads1291_type.h b/app/src/board/ads1291/ads1291_type.h deleted file mode 100644 index 3b7089f..0000000 --- a/app/src/board/ads1291/ads1291_type.h +++ /dev/null @@ -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 */ diff --git a/app/src/board/ads129x/ads129x.c b/app/src/board/ads129x/ads129x.c new file mode 100644 index 0000000..c2bd6a4 --- /dev/null +++ b/app/src/board/ads129x/ads129x.c @@ -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; } \ No newline at end of file diff --git a/app/src/board/ads129x/ads129x.h b/app/src/board/ads129x/ads129x.h new file mode 100644 index 0000000..d9047fe --- /dev/null +++ b/app/src/board/ads129x/ads129x.h @@ -0,0 +1,26 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif +#include +#include + +/** + * @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 diff --git a/app/src/board/ads129x/ads129x_type.h b/app/src/board/ads129x/ads129x_type.h new file mode 100644 index 0000000..fc387b1 --- /dev/null +++ b/app/src/board/ads129x/ads129x_type.h @@ -0,0 +1,286 @@ +#pragma once +#include +#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 diff --git a/app/src/board/app_board.c b/app/src/board/app_board.c new file mode 100644 index 0000000..8791ca1 --- /dev/null +++ b/app/src/board/app_board.c @@ -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) {} diff --git a/app/src/board/app_board.h b/app/src/board/app_board.h new file mode 100644 index 0000000..33846ae --- /dev/null +++ b/app/src/board/app_board.h @@ -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; diff --git a/app/src/board/board_ecg_sensor.c b/app/src/board/board_ecg_sensor.c index 48d19c0..77c8676 100644 --- a/app/src/board/board_ecg_sensor.c +++ b/app/src/board/board_ecg_sensor.c @@ -186,7 +186,7 @@ uint8_t ads1292r_send_cmd(uint8_t cmd) { return rx; } -void znrf_serial_tx(char const * p_buffer, size_t len); +void nrf_log_backend_uart_tx_raw(char const * p_buffer, size_t len); void BoardEcgSensor_init() { /** @@ -216,7 +216,7 @@ void BoardEcgSensor_init() { while (true) /* 识别芯片型号,1291:0x52 */ { uint8_t id = ads1292r_rw_reg(ADS1292R_COMMAND_RREG | ADS1292R_REG_ID, 0); - znrf_serial_tx(txdata,4); + nrf_log_backend_uart_tx_raw(txdata,4); znordic_force_flush_log(); nrf_delay_ms(1000); } diff --git a/app/src/main.c b/app/src/main.c index d1e9149..5044b76 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -6,10 +6,10 @@ #include #include // +#include "aproject_config/config.h" #include "basic_service/app_event.h" #include "basic_service/app_event_distribute.h" #include "basic_service/device_version_info_mgr.h" -#include "aproject_config/config.h" #include "zble_module.h" #include "zdatachannel_service.h" // @@ -18,9 +18,9 @@ ZDATACHANNEL_DEF(m_zhrs, 2 /* /** * @brief 蓝牙消息解析 */ -void zdatachannel_data_handler(zdatachannel_evt_t* p_evt) { +void zdatachannel_data_handler(zdatachannel_evt_t *p_evt) { if (p_evt->type == ZDATACHANNEL_EVT_RX_DATA) { - ble_cmder_process_rx((uint8_t*)p_evt->params.rx_data.p_data, p_evt->params.rx_data.length); + ble_cmder_process_rx((uint8_t *)p_evt->params.rx_data.p_data, p_evt->params.rx_data.length); } } void on_service_init(void) { diff --git a/app/src/one_conduction_main.c b/app/src/one_conduction_main.c index 3352b45..1d17d9f 100644 --- a/app/src/one_conduction_main.c +++ b/app/src/one_conduction_main.c @@ -11,11 +11,12 @@ #include "board/board_light_ctrl.h" #include "board/board_power_mgr.h" // +#include "board/ads129x/ads129x.h" +#include "board/app_board.h" #include "service/ble_cmd_processer/ble_cmd_process_service.h" #include "service/display_mgr/display_manager.h" #include "service/heart_wave_sample_service/heart_wave_sample_service.h" #include "service/storage/storage_service.h" - #include "zble_module.h" #include "zdatachannel_service.h" #include "znordic.h" @@ -268,7 +269,8 @@ static void app_event_listener(void* p_event_data, uint16_t event_size) { // BoardLight_setGreenLightEffect(kLightEffect_close); state_machine__change_to_standby_state(); } - // ZLOGI("bt:%d plod:%d has_disc:%d state:%d", zdatachannel_is_connected(), BoardEcgSensor_plod_get_connected_state_after_filter(), plod_state_has_disconnected_ms(), ds_cur_state_haspassed_ms()); + // ZLOGI("bt:%d plod:%d has_disc:%d state:%d", zdatachannel_is_connected(), BoardEcgSensor_plod_get_connected_state_after_filter(), + // plod_state_has_disconnected_ms(), ds_cur_state_haspassed_ms()); } /******************************************************************************* @@ -445,6 +447,8 @@ void one_conduction_main() { BoardEcgSensor_init(); BoardLight_Init(); BoardBattery_load(); + app_board_init(); + ads129x_init(); // power_on(); #if 0 diff --git a/app/src/service/heart_wave_sample_service/heart_wave_sample_service.c b/app/src/service/heart_wave_sample_service/heart_wave_sample_service.c index e2e9dc3..766c887 100644 --- a/app/src/service/heart_wave_sample_service/heart_wave_sample_service.c +++ b/app/src/service/heart_wave_sample_service/heart_wave_sample_service.c @@ -2,6 +2,7 @@ #include "basic_service/app_event.h" #include "basic_service/app_event_distribute.h" +#include "board/ads129x/ads129x.h" #include "board/board_ecg_sensor.h" #include "heart_ware_sample_data_mgr.h" #include "heart_wave_sample_data_pre_process.h" diff --git a/libznordic b/libznordic index 2668dd6..0122505 160000 --- a/libznordic +++ b/libznordic @@ -1 +1 @@ -Subproject commit 2668dd622893481e990fadd346385af93af3f2d7 +Subproject commit 01225055c1cbd6e6b3bc50a5f084d4e515063512 diff --git a/scripter/build_app.bat b/scripter/build_app.bat index 425ae5f..cc053b0 100644 --- a/scripter/build_app.bat +++ b/scripter/build_app.bat @@ -7,7 +7,7 @@ call scripter\keil_build.bat app\app.uvprojx app\_build\app.hex del output\app_whole.hex del output\app.zip del output\one_lead_ecg.zip -del output\one_lead_ecg.hexb +del output\one_lead_ecg.hex @REM 检查是否编译成功 if not exist app\_build\app.hex ( diff --git a/sdk b/sdk index 1d34e6a..864d182 160000 --- a/sdk +++ b/sdk @@ -1 +1 @@ -Subproject commit 1d34e6ac316c27dc0e1149835d5f1ad53e074c88 +Subproject commit 864d18285a795072cd58f877237749e22c5baf27