Browse Source

update

3lead_uart_test_ok_version
zhaohe 1 year ago
parent
commit
5b716d6ebf
  1. 3
      .vscode/settings.json
  2. BIN
      SSD1312_Datasheet (1).pdf
  3. BIN
      TXW64128-41-TSWG13P096G-A-VER1.0.pdf
  4. BIN
      ads1293.pdf
  5. 2
      app/app.uvprojx
  6. 2
      app/config/sdk_config.h
  7. 172
      app/main.c
  8. 53
      app/src/one_conduction/one_conduction_board.c
  9. 10
      app/src/one_conduction/one_conduction_board.h
  10. 1
      app/src/three_lead/three_lead_board.c
  11. 2
      sdk

3
.vscode/settings.json

@ -60,6 +60,7 @@
"three_lead_board.h": "c", "three_lead_board.h": "c",
"znordic.h": "c", "znordic.h": "c",
"ads1293.h": "c", "ads1293.h": "c",
"app_scheduler.h": "c"
"app_scheduler.h": "c",
"stdbool.h": "c"
} }
} }

BIN
SSD1312_Datasheet (1).pdf

BIN
TXW64128-41-TSWG13P096G-A-VER1.0.pdf

BIN
ads1293.pdf

2
app/app.uvprojx
File diff suppressed because it is too large
View File

2
app/config/sdk_config.h

@ -7767,7 +7767,7 @@
// <e> NRF_LOG_BACKEND_UART_ENABLED - nrf_log_backend_uart - Log UART backend // <e> NRF_LOG_BACKEND_UART_ENABLED - nrf_log_backend_uart - Log UART backend
//========================================================== //==========================================================
#ifndef NRF_LOG_BACKEND_UART_ENABLED #ifndef NRF_LOG_BACKEND_UART_ENABLED
#define NRF_LOG_BACKEND_UART_ENABLED 1
#define NRF_LOG_BACKEND_UART_ENABLED 0
#endif #endif
// <o> NRF_LOG_BACKEND_UART_TX_PIN - UART TX pin // <o> NRF_LOG_BACKEND_UART_TX_PIN - UART TX pin
#ifndef NRF_LOG_BACKEND_UART_TX_PIN #ifndef NRF_LOG_BACKEND_UART_TX_PIN

172
app/main.c

@ -3,8 +3,10 @@
#include "znordic.h" #include "znordic.h"
// //
#include "basic/ssd1306/driver_ssd1306_basic.h"
#include "one_conduction/one_conduction_board.h"
#include "three_lead\three_lead_board.h" #include "three_lead\three_lead_board.h"
#if 0
static void test_tx_timer_cb(void* p_context) { static void test_tx_timer_cb(void* p_context) {
ZLOGI("test_tx_timer_cb"); ZLOGI("test_tx_timer_cb");
ThreeLeadECG_sdcard_mount(); ThreeLeadECG_sdcard_mount();
@ -25,3 +27,171 @@ void main() {
ZERROR_CHECK(app_timer_start(m_test_tx_timer, APP_TIMER_TICKS(100), NULL)); ZERROR_CHECK(app_timer_start(m_test_tx_timer, APP_TIMER_TICKS(100), NULL));
znordic_loop(); znordic_loop();
} }
#endif
// EEPROM_TEST
#if 0
static void test_tx_timer_cb(void* p_context) {
static uint32_t data;
data++;
// ZLOGI("test_tx_timer_cb %d", data);
}
extern uint32_t g_nrf_log_tx_pin;
APP_TIMER_DEF(m_test_tx_timer);
void main() {
APP_SCHED_INIT(APP_TIMER_SCHED_EVENT_DATA_SIZE, 20);
znordic_init();
// SingleLeadECG_beep_init();
// SingleLeadECG_beep_set_state(false);
NRF_LOG_INFO("compile time :%s %d", __TIME__, APP_TIMER_TICKS(100));
NRF_LOG_INTERNAL_FLUSH();
SingleLeadECG_eeprom_init();
static uint8_t eepromw_test_data[256];
static uint8_t eepromw_rx_data[256];
for (size_t i = 0; i < 256; i++) {
eepromw_test_data[i] = i;
}
SingleLeadECG_eeprom_write(0, eepromw_test_data, 256);
// nrf_delay_ms(20);
// SingleLeadECG_eeprom_read(0, eepromw_rx_data, 256);
// for (size_t i = 0; i < 256; i++) {
// ZLOGI("eepromw_rx_data[%d] = %d", i, eepromw_rx_data[i]);
// NRF_LOG_INTERNAL_FLUSH();
// }
ZERROR_CHECK(app_timer_create(&m_test_tx_timer, APP_TIMER_MODE_REPEATED, test_tx_timer_cb));
ZERROR_CHECK(app_timer_start(m_test_tx_timer, APP_TIMER_TICKS(100), NULL));
znordic_loop();
}
#endif
/*******************************************************************************
* +LED测试 *
*******************************************************************************/
#if 1
static void test_tx_timer_cb(void* p_context) {
static uint32_t data;
data++;
ZLOGI("test_tx_timer_cb %d", data);
SingleLeadECG_led_green_set_state(data % 2 == 0);
SingleLeadECG_led_blue_set_state(data % 3 == 0);
}
extern uint32_t g_nrf_log_tx_pin;
APP_TIMER_DEF(m_test_tx_timer);
void main() {
APP_SCHED_INIT(APP_TIMER_SCHED_EVENT_DATA_SIZE, 20);
znordic_init();
NRF_LOG_INFO("compile time :%s %d", __TIME__, APP_TIMER_TICKS(100));
NRF_LOG_INTERNAL_FLUSH();
SingleLeadECG_screen_init();
ssd1306_basic_init(SSD1306_INTERFACE_SPI, SSD1306_ADDR_SA0_0);
ssd1306_basic_display_on();
ssd1306_basic_string(0, 0, "123456789123456789123", 21, 0, SSD1306_FONT_12);
ssd1306_basic_string(0, 16, "123456789123456789123", 21, 0, SSD1306_FONT_12);
ssd1306_basic_string(0, 32, "123456789123456789123", 21, 0, SSD1306_FONT_12);
ssd1306_basic_string(0, 48, "123456789123456789123", 21, 0, SSD1306_FONT_12);
SingleLeadECG_led_init();
ZERROR_CHECK(app_timer_create(&m_test_tx_timer, APP_TIMER_MODE_REPEATED, test_tx_timer_cb));
ZERROR_CHECK(app_timer_start(m_test_tx_timer, APP_TIMER_TICKS(100), NULL));
znordic_loop();
}
#endif
/*******************************************************************************
* ECG *
*******************************************************************************/
#if 0
static void test_tx_timer_cb(void* p_context) {
static uint32_t data;
data++;
// SingleLeadECG_ecg_nlod_get_connected_state();
// SingleLeadECG_ecg_plod_get_connected_state();
// SingleLeadECG_ecg_plod_get_ecg_val();
ZLOGI("%d nlod %d plod %d ecg:%d", data, SingleLeadECG_ecg_nlod_get_connected_state(), SingleLeadECG_ecg_plod_get_connected_state(), SingleLeadECG_ecg_plod_get_ecg_val());
}
extern uint32_t g_nrf_log_tx_pin;
APP_TIMER_DEF(m_test_tx_timer);
void main() {
APP_SCHED_INIT(APP_TIMER_SCHED_EVENT_DATA_SIZE, 20);
znordic_init();
SingleLeadECG_adc_module_init();
NRF_LOG_INFO("compile time :%s %d", __TIME__, APP_TIMER_TICKS(100));
NRF_LOG_INTERNAL_FLUSH();
SingleLeadECG_ecg_init();
ZERROR_CHECK(app_timer_create(&m_test_tx_timer, APP_TIMER_MODE_REPEATED, test_tx_timer_cb));
ZERROR_CHECK(app_timer_start(m_test_tx_timer, APP_TIMER_TICKS(1000), NULL));
znordic_loop();
}
#endif
/*******************************************************************************
* *
*******************************************************************************/
#if 0
extern uint32_t g_nrf_log_tx_pin;
APP_TIMER_DEF(m_test_tx_timer);
ZDATACHANNEL_DEF(m_zhrs, 2 /*回调事件优先级*/, 1 /*client num*/);
static const char* hex2str(const uint8_t* data, int32_t len) {
static char rx[64] = {0};
memset(rx, 0, sizeof(rx));
for (int32_t i = 0; i < len; i++) {
sprintf(rx + i * 2, "%02X", data[i]);
}
return rx;
}
static void zdatachannel_data_handler(zdatachannel_evt_t* p_evt) {
/**
* @brief
*/
if (p_evt->type == ZDATACHANNEL_EVT_RX_DATA) {
ZLOGI("rx:%s", hex2str(p_evt->params.rx_data.p_data, p_evt->params.rx_data.length));
}
}
static void on_service_init(void) {
/**
* @brief
*/
ZLOGI("init zdatachannel service");
zdatachannel_init_t zdatachannle_init;
memset(&zdatachannle_init, 0, sizeof(zdatachannle_init));
zdatachannle_init.data_handler = zdatachannel_data_handler;
ZERROR_CHECK(zdatachannel_init(&m_zhrs, &zdatachannle_init));
}
void main() {
APP_SCHED_INIT(APP_TIMER_SCHED_EVENT_DATA_SIZE, 20);
znordic_init(0, 20);
NRF_LOG_INFO("compile time :%s", __TIME__);
NRF_LOG_INFO("Version :%d", VERSION);
NRF_LOG_INFO("Manufacturer :%s", MANUFACTURER_NAME);
static zble_module_cfg_t cfg = //
{
.deviceName = BLE_NAME,
.on_service_init = on_service_init,
};
zble_module_init(&cfg);
zble_module_start_adv();
znordic_loop();
}
#endif

53
app/src/one_conduction/one_conduction_board.c

@ -23,13 +23,15 @@
#define LED_GREEN_PIN 9 #define LED_GREEN_PIN 9
#define LED_BLUE_PIN 10 #define LED_BLUE_PIN 10
// #define LED_GREEN_PIN 27
// #define LED_BLUE_PIN 28
#define ECG_NLOD_PIN 3 #define ECG_NLOD_PIN 3
#define ECG_PLOD_PIN 28 #define ECG_PLOD_PIN 28
#define ECG_ADC_PIN NRF_SAADC_INPUT_AIN2 #define ECG_ADC_PIN NRF_SAADC_INPUT_AIN2
#define ECG_ADC_CHANNEL 0 // 不重复即可 #define ECG_ADC_CHANNEL 0 // 不重复即可
#define BATTERY_ADC_PIN NRF_SAADC_INPUT_VDD
#define BATTERY_ADC_PIN NRF_SAADC_INPUT_AIN5
#define BATTERY_ADC_CHANNEL 1 // 不重复即可 #define BATTERY_ADC_CHANNEL 1 // 不重复即可
#define EEPROM_I2C_SCL_M 15 // I2C SCL引脚 #define EEPROM_I2C_SCL_M 15 // I2C SCL引脚
@ -37,7 +39,7 @@
#define EEPROM_I2C_INSTANCE 1 // I2C使用的硬件控制器ID #define EEPROM_I2C_INSTANCE 1 // I2C使用的硬件控制器ID
#define BEEP_PWM_INSTANCE 0 #define BEEP_PWM_INSTANCE 0
#define BEEP_PIN 18
#define BEEP_PIN 1
/******************************************************************************* /*******************************************************************************
* TOOLS * * TOOLS *
@ -85,26 +87,6 @@ void SingleLeadECG_beep_set_state(bool state) {
* SCREEN * * SCREEN *
*******************************************************************************/ *******************************************************************************/
typedef struct {
// BASIC IF
uint32_t reset_pin;
uint32_t power_pin;
uint32_t a0pin; // cmd/data
// SPI IF
uint32_t cs_pin;
uint32_t clk_pin;
uint32_t mosi_pin;
} screen_handler_t;
static screen_handler_t m_screen_handler = {
.reset_pin = SCREEN_RESET_PIN,
.power_pin = SCREEN_POWER_PIN,
.a0pin = SCREEN_A0PIN,
.cs_pin = SCREEN_CS_PIN,
.clk_pin = SCREEN_CLK_PIN,
.mosi_pin = SCREEN_MOSI_PIN,
};
static const nrf_drv_spi_t m_screen_spi = NRF_DRV_SPI_INSTANCE(SCREEN_SPI_INSTANCE); /**< SPI instance. */ static const nrf_drv_spi_t m_screen_spi = NRF_DRV_SPI_INSTANCE(SCREEN_SPI_INSTANCE); /**< SPI instance. */
void SingleLeadECG_screen_init() { void SingleLeadECG_screen_init() {
@ -112,12 +94,17 @@ void SingleLeadECG_screen_init() {
znrf_gpio_cfg_output(SCREEN_POWER_PIN, NRF_GPIO_PIN_NOPULL); znrf_gpio_cfg_output(SCREEN_POWER_PIN, NRF_GPIO_PIN_NOPULL);
znrf_gpio_cfg_output(SCREEN_A0PIN, NRF_GPIO_PIN_NOPULL); znrf_gpio_cfg_output(SCREEN_A0PIN, NRF_GPIO_PIN_NOPULL);
nrf_gpio_pin_set(SCREEN_POWER_PIN);
//
// OLED驱动程序 : https://iflytop1.feishu.cn/wiki/OQ4Iwv0DpiQDJvkjftjcQHJBnCg
// nRF5_SDK-使: https://iflytop1.feishu.cn/wiki/ThaAwZEGVi2bspkfGU9cbl9Enqd
nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG; nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
spi_config.ss_pin = SCREEN_CS_PIN; // NRF_DRV_SPI_PIN_NOT_USED spi_config.ss_pin = SCREEN_CS_PIN; // NRF_DRV_SPI_PIN_NOT_USED
spi_config.miso_pin = NRF_DRV_SPI_PIN_NOT_USED; spi_config.miso_pin = NRF_DRV_SPI_PIN_NOT_USED;
spi_config.mosi_pin = SCREEN_MOSI_PIN; spi_config.mosi_pin = SCREEN_MOSI_PIN;
spi_config.sck_pin = SCREEN_CLK_PIN; spi_config.sck_pin = SCREEN_CLK_PIN;
spi_config.frequency = NRF_DRV_SPI_FREQ_1M; spi_config.frequency = NRF_DRV_SPI_FREQ_1M;
spi_config.mode = NRF_DRV_SPI_MODE_3;
ZERROR_CHECK(nrf_drv_spi_init(&m_screen_spi, &spi_config, NULL, NULL)); ZERROR_CHECK(nrf_drv_spi_init(&m_screen_spi, &spi_config, NULL, NULL));
} }
@ -159,6 +146,12 @@ uint8_t SingleLeadECG_reset_gpio_write(uint8_t value) {
void SingleLeadECG_led_init() { void SingleLeadECG_led_init() {
znrf_gpio_cfg_output(LED_GREEN_PIN, NRF_GPIO_PIN_NOPULL); znrf_gpio_cfg_output(LED_GREEN_PIN, NRF_GPIO_PIN_NOPULL);
znrf_gpio_cfg_output(LED_BLUE_PIN, NRF_GPIO_PIN_NOPULL); znrf_gpio_cfg_output(LED_BLUE_PIN, NRF_GPIO_PIN_NOPULL);
// nrf_gpio_pin_write(LED_GREEN_PIN, 1);
// nrf_gpio_pin_write(LED_GREEN_PIN, 1);
SingleLeadECG_led_green_set_state(false);
SingleLeadECG_led_blue_set_state(false);
} }
void SingleLeadECG_led_green_set_state(bool state) { void SingleLeadECG_led_green_set_state(bool state) {
if (state) { if (state) {
@ -184,13 +177,13 @@ void SingleLeadECG_ecg_init() {
channel_config.acq_time = NRF_SAADC_ACQTIME_40US; channel_config.acq_time = NRF_SAADC_ACQTIME_40US;
ZERROR_CHECK(nrfx_saadc_channel_init(ECG_ADC_CHANNEL, &channel_config)); ZERROR_CHECK(nrfx_saadc_channel_init(ECG_ADC_CHANNEL, &channel_config));
nrf_gpio_cfg_sense_input(ECG_NLOD_PIN, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_NOSENSE);
nrf_gpio_cfg_sense_input(ECG_PLOD_PIN, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_NOSENSE);
nrf_gpio_cfg_sense_input(ECG_NLOD_PIN, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_LOW);
nrf_gpio_cfg_sense_input(ECG_PLOD_PIN, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_LOW);
} }
bool SingleLeadECG_ecg_nlod_get_connected_state() { return nrf_gpio_pin_read(ECG_NLOD_PIN) == 0; }
bool SingleLeadECG_ecg_plod_get_connected_state() { return nrf_gpio_pin_read(ECG_PLOD_PIN) == 0; }
int16_t SingleLeadECG_ecg_plod_get_ecg_val() { return znrf_adc_channel_read_val(ECG_ADC_CHANNEL); }
uint32_t SingleLeadECG_ecg_nlod_get_connected_state() { return nrf_gpio_pin_read(ECG_NLOD_PIN); }
uint32_t SingleLeadECG_ecg_plod_get_connected_state() { return nrf_gpio_pin_read(ECG_PLOD_PIN); }
int16_t SingleLeadECG_ecg_plod_get_ecg_val() { return znrf_adc_channel_read_val(ECG_ADC_CHANNEL); }
/******************************************************************************* /*******************************************************************************
* BATTERY * * BATTERY *
@ -253,7 +246,11 @@ void SingleLeadECG_eeprom_write(uint16_t page, uint8_t *data, uint16_t len) { /
uint8_t deviceSelect = 0; uint8_t deviceSelect = 0;
assign_i2c_add(addr, true, &deviceSelect, &eeprom_cache[0], &eeprom_cache[1]); assign_i2c_add(addr, true, &deviceSelect, &eeprom_cache[0], &eeprom_cache[1]);
nrf_drv_twi_tx(&m_eeprom_twi_master, deviceSelect, eeprom_cache, len + 2, false);
ret_code_t ecode = nrf_drv_twi_tx(&m_eeprom_twi_master, deviceSelect, eeprom_cache, len + 2, false);
if (ecode != NRF_SUCCESS) {
ZLOGE("nrf_drv_twi_tx error %x", ecode);
NRF_LOG_INTERNAL_FLUSH();
}
} }
void SingleLeadECG_eeprom_read(uint32_t add, uint8_t *data, uint16_t len) { void SingleLeadECG_eeprom_read(uint32_t add, uint8_t *data, uint16_t len) {

10
app/src/one_conduction/one_conduction_board.h

@ -31,7 +31,7 @@ void SingleLeadECG_beep_set_state(bool state);
*/ */
#define EEPROM_PAGE 256 #define EEPROM_PAGE 256
void SingleLeadECG_eeprom_init(); void SingleLeadECG_eeprom_init();
void SingleLeadECG_eeprom_write_page(uint16_t page, uint8_t* data, uint16_t len);
void SingleLeadECG_eeprom_write(uint16_t page, uint8_t* data, uint16_t len);
void SingleLeadECG_eeprom_read(uint32_t add, uint8_t* data, uint16_t len); void SingleLeadECG_eeprom_read(uint32_t add, uint8_t* data, uint16_t len);
/******************************************************************************* /*******************************************************************************
@ -52,10 +52,10 @@ void SingleLeadECG_led_blue_set_state(bool state);
* ECG * * ECG *
*******************************************************************************/ *******************************************************************************/
void SingleLeadECG_ecg_init();
bool SingleLeadECG_ecg_nlod_get_connected_state();
bool SingleLeadECG_ecg_plod_get_connected_state();
int16_t SingleLeadECG_ecg_plod_get_ecg_val();
void SingleLeadECG_ecg_init();
uint32_t SingleLeadECG_ecg_nlod_get_connected_state();
uint32_t SingleLeadECG_ecg_plod_get_connected_state();
int16_t SingleLeadECG_ecg_plod_get_ecg_val();
/******************************************************************************* /*******************************************************************************
* BATTERY * * BATTERY *

1
app/src/three_lead/three_lead_board.c

@ -373,6 +373,7 @@ void ThreeLeadECG_ecg_init() {
spi_config.mosi_pin = ADS1293_SPI_MOSI_PIN; spi_config.mosi_pin = ADS1293_SPI_MOSI_PIN;
spi_config.sck_pin = ADS1293_SPI_SCK_PIN; spi_config.sck_pin = ADS1293_SPI_SCK_PIN;
spi_config.frequency = NRF_DRV_SPI_FREQ_1M; spi_config.frequency = NRF_DRV_SPI_FREQ_1M;
// spi_config.mode =
ZERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, NULL, NULL)); ZERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, NULL, NULL));
nrf_gpio_cfg_input(ADS1293_SPI_CS0_PIN, NRF_GPIO_PIN_NOPULL); nrf_gpio_cfg_input(ADS1293_SPI_CS0_PIN, NRF_GPIO_PIN_NOPULL);

2
sdk

@ -1 +1 @@
Subproject commit d1b8e44a3b818ea9571baf5efe79b6bd5d295dd2
Subproject commit f744df9ff76d9a7a4b3739dfb571f1b3f82312ae
Loading…
Cancel
Save