You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
244 lines
8.2 KiB
244 lines
8.2 KiB
#if 0
|
|
|
|
#define ADS1293_SPI_SCK_PIN (32 + 9)
|
|
#define ADS1293_SPI_MOSI_PIN 15
|
|
#define ADS1293_SPI_MISO_PIN 20
|
|
#define ADS1293_SPI_CS0_PIN 3
|
|
#define ADS1293_SPI_CS1_PIN 29
|
|
#define ADS1293_READY_PIN 31
|
|
#define LINE_DET_PIN 10
|
|
#include "board/ads_cfg.h"
|
|
|
|
/*******************************************************************************
|
|
* 3µ¼Áª-ADS1293-²âÊÔ *
|
|
*******************************************************************************/
|
|
APP_TIMER_DEF(m_init_tmr);
|
|
APP_TIMER_DEF(m_report_tmr);
|
|
ZDATACHANNEL_DEF(m_zhrs, 2 /**/, 1 /*client num*/);
|
|
static const nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE(2); /**< SPI instance. */
|
|
static ads1293_t m_ads1293_0; // U2
|
|
// static ads1293_t m_ads1293_1; // U3
|
|
static void zdatachannel_data_handler(zdatachannel_evt_t* p_evt);
|
|
static void on_service_init(void);
|
|
static void zdatachanel_send_log(const char* fmt, ...);
|
|
static void three_lead_ecg_ecg_init();
|
|
|
|
uint32_t get_ready_pin_state_get() { return nrf_gpio_pin_read(ADS1293_READY_PIN); }
|
|
|
|
static void m_report_tmr_cb(void* p_context) {
|
|
static int id = 0;
|
|
id++;
|
|
|
|
#if 0
|
|
uint8_t leadoffstate = ads1293_spi_readreg(&m_ads1293_0, TI_ADS1293_ERROR_LOD_REG);
|
|
zdatachanel_send_log("%d%d%d%d_%d%d%d%d\n", //
|
|
leadoffstate >> 7 & 0x1, leadoffstate >> 6 & 0x1, leadoffstate >> 5 & 0x1, leadoffstate >> 4 & 0x1, //
|
|
leadoffstate >> 3 & 0x1, leadoffstate >> 2 & 0x1, leadoffstate >> 1 & 0x1, leadoffstate >> 0 & 0x1); //
|
|
#endif
|
|
|
|
#if 0
|
|
uint8_t state = ads1293_spi_readreg(&m_ads1293_0, TI_ADS1293_CONFIG_REG);
|
|
zdatachanel_send_log("ads_%d config:%x\n", m_ads1293_0.id, state);
|
|
#endif
|
|
static bool state = false;
|
|
bool now = get_ready_pin_state_get();
|
|
if (state != now) {
|
|
state = now;
|
|
zdatachanel_send_log("%d\n", now);
|
|
}
|
|
|
|
// zdatachanel_send_log("%d\n", id);
|
|
}
|
|
|
|
static void init_tmr_cb(void* p_context) {
|
|
nrf_gpio_cfg_input(LINE_DET_PIN, NRF_GPIO_PIN_PULLUP);
|
|
three_lead_ecg_ecg_init();
|
|
ads1293_spi_writereg(&m_ads1293_0, TI_ADS1293_CONFIG_REG, 0x01);
|
|
nrf_delay_ms(1000);
|
|
ZERROR_CHECK(app_timer_start(m_report_tmr, APP_TIMER_TICKS(1), NULL));
|
|
}
|
|
|
|
int main() {
|
|
APP_SCHED_INIT(APP_TIMER_SCHED_EVENT_DATA_SIZE, 20);
|
|
znordic_init();
|
|
NRF_LOG_INFO("compile time :%s", __TIME__);
|
|
static zble_module_cfg_t cfg = //
|
|
{
|
|
.deviceName = "ThreeLeadECG",
|
|
.on_service_init = on_service_init,
|
|
};
|
|
zble_module_init(&cfg);
|
|
zble_module_start_adv();
|
|
ZERROR_CHECK(app_timer_create(&m_init_tmr, APP_TIMER_MODE_SINGLE_SHOT, init_tmr_cb));
|
|
ZERROR_CHECK(app_timer_start(m_init_tmr, APP_TIMER_TICKS(3000), NULL));
|
|
|
|
ZERROR_CHECK(app_timer_create(&m_report_tmr, APP_TIMER_MODE_REPEATED, m_report_tmr_cb));
|
|
znordic_loop();
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* UTILS *
|
|
*******************************************************************************/
|
|
|
|
/*******************************************************************************
|
|
* CODE *
|
|
*******************************************************************************/
|
|
|
|
static void ads1293_spi_tx_rx_0(uint8_t* tx, uint8_t* rx, uint8_t len) {
|
|
nrf_gpio_pin_clear(ADS1293_SPI_CS0_PIN);
|
|
nrf_drv_spi_transfer(&spi, tx, len, rx, len);
|
|
nrf_gpio_pin_set(ADS1293_SPI_CS0_PIN);
|
|
}
|
|
static void ads1293_spi_tx_rx_1(uint8_t* tx, uint8_t* rx, uint8_t len) {
|
|
nrf_gpio_pin_clear(ADS1293_SPI_CS1_PIN);
|
|
nrf_drv_spi_transfer(&spi, tx, len, rx, len);
|
|
nrf_gpio_pin_set(ADS1293_SPI_CS1_PIN);
|
|
}
|
|
|
|
static void ads1293_spi_writereg_and_check(ads1293_t* ads, uint8_t addr, uint8_t data) {
|
|
uint8_t readbak = 0;
|
|
// readonly add
|
|
if (addr == 0x19 || addr == 0x1a || addr == 0x1b || addr == 0x1c || addr == 0x40 || addr == 0x30) {
|
|
return;
|
|
}
|
|
ads1293_spi_writereg_and_readbak(ads, addr, data, &readbak);
|
|
if (readbak != data) {
|
|
zdatachanel_send_log("ads_%d write %x failed,w:%x readbak:%x\n", ads->id, addr, data, readbak);
|
|
}
|
|
}
|
|
|
|
static adscfg_t prvads0cfg[] = {
|
|
{0x00, 0x00}, //
|
|
{0x01, 0x0a}, //
|
|
{0x02, 0x1a}, //
|
|
{0x03, 0x00}, //
|
|
{0x04, 0x00}, //
|
|
{0x05, 0x00}, //
|
|
{0x06, 0x04}, //
|
|
{0x07, 0x0f}, //
|
|
{0x08, 0xff}, //
|
|
{0x09, 0x00}, //
|
|
{0x0a, 0x07}, //
|
|
{0x0b, 0x00}, //
|
|
{0x0c, 0x04}, //
|
|
{0x0d, 0x00}, //
|
|
{0x0e, 0x00}, //
|
|
{0x0f, 0x00}, //
|
|
{0x10, 0x00}, //
|
|
{0x11, 0x00}, //
|
|
{0x12, 0x04}, //
|
|
{0x13, 0x00}, //
|
|
{0x14, 0x00}, //
|
|
{0x15, 0x00}, //
|
|
{0x16, 0x00}, //
|
|
{0x17, 0x05}, //
|
|
{0x18, 0x00}, //
|
|
{0x19, 0x00}, //
|
|
{0x1a, 0x00}, //
|
|
{0x1b, 0x00}, //
|
|
{0x1c, 0x00}, //
|
|
{0x1d, 0x00}, //
|
|
{0x21, 0x02}, //
|
|
{0x22, 0x02}, //
|
|
{0x23, 0x02}, //
|
|
{0x24, 0x02}, //
|
|
{0x25, 0x00}, //
|
|
{0x26, 0x00}, //
|
|
{0x27, 0x08}, //
|
|
{0x28, 0x00}, //
|
|
{0x29, 0x00}, //
|
|
{0x2a, 0x00}, //
|
|
{0x2b, 0x00}, //
|
|
{0x2c, 0x00}, //
|
|
{0x2d, 0x00}, //
|
|
{0x2e, 0x33}, //
|
|
{0x2f, 0x30}, //
|
|
{0x30, 0x00}, //
|
|
{0x31, 0x00}, //
|
|
{0x32, 0x00}, //
|
|
{0x33, 0x00}, //
|
|
{0x34, 0x00}, //
|
|
{0x35, 0x00}, //
|
|
{0x36, 0x00}, //
|
|
{0x37, 0x00}, //
|
|
{0x38, 0x00}, //
|
|
{0x39, 0x00}, //
|
|
{0x3a, 0x00}, //
|
|
{0x3b, 0x00}, //
|
|
{0x3c, 0x00}, //
|
|
{0x3d, 0x00}, //
|
|
{0x3e, 0x00}, //
|
|
{0x3f, 0x00}, //
|
|
{0x40, 0xff}, //
|
|
{0x50, 0x00}, //
|
|
{0x60, 0x00}, //
|
|
{0x62, 0x00}, //
|
|
};
|
|
|
|
void three_lead_ecg_ecg_init() {
|
|
nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
|
|
spi_config.ss_pin = NRF_DRV_SPI_PIN_NOT_USED; // NRF_DRV_SPI_PIN_NOT_USED
|
|
spi_config.miso_pin = ADS1293_SPI_MISO_PIN;
|
|
spi_config.mosi_pin = ADS1293_SPI_MOSI_PIN;
|
|
spi_config.sck_pin = ADS1293_SPI_SCK_PIN;
|
|
spi_config.frequency = NRF_DRV_SPI_FREQ_8M;
|
|
spi_config.mode = NRF_DRV_SPI_MODE_3;
|
|
// spi_config.mode =
|
|
ZERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, NULL, NULL));
|
|
|
|
znrf_gpio_cfg_output(ADS1293_SPI_CS0_PIN, NRF_GPIO_PIN_NOPULL);
|
|
znrf_gpio_cfg_output(ADS1293_SPI_CS1_PIN, NRF_GPIO_PIN_NOPULL);
|
|
nrf_gpio_cfg_input(ADS1293_READY_PIN, NRF_GPIO_PIN_PULLUP);
|
|
|
|
nrf_gpio_pin_set(ADS1293_SPI_CS0_PIN);
|
|
nrf_gpio_pin_set(ADS1293_SPI_CS1_PIN);
|
|
|
|
m_ads1293_0.spi_tx_rx = ads1293_spi_tx_rx_0;
|
|
m_ads1293_0.id = 0;
|
|
// m_ads1293_1.spi_tx_rx = ads1293_spi_tx_rx_1;
|
|
// m_ads1293_1.id = 1;
|
|
|
|
ads1293_spi_init(&m_ads1293_0, ads1293_spi_tx_rx_0);
|
|
// ads1293_spi_init(&m_ads1293_1, ads1293_spi_tx_rx_1);
|
|
|
|
uint8_t revid = ads1293_spi_readreg(&m_ads1293_0, TI_ADS1293_REVID_REG);
|
|
zdatachanel_send_log("ads1293_0 revid: %d\n", revid);
|
|
// revid = ads1293_spi_readreg(&m_ads1293_1, TI_ADS1293_REVID_REG);
|
|
// zdatachanel_send_log("ads1293_1 revid: %d\n", revid);
|
|
|
|
zdatachanel_send_log("reset ads1293_0\n");
|
|
ads1293_spi_writereg(&m_ads1293_0, TI_ADS1293_CONFIG_REG, 0);
|
|
nrf_delay_ms(1000);
|
|
|
|
for (uint16_t i = 0; i < ZARRAY_SIZE(prvads0cfg); i++) {
|
|
ads1293_spi_writereg_and_check(&m_ads1293_0, prvads0cfg[i].add, prvads0cfg[i].data);
|
|
zdatachanel_send_log("[%d]ads1293_0 write %x:%x\n", i, prvads0cfg[i].add, prvads0cfg[i].data);
|
|
}
|
|
// for (uint16_t i = 0; i < ZARRAY_SIZE(ads1cfg); i++) {
|
|
// ads1293_spi_writereg_and_check(&m_ads1293_1, ads1cfg[i].add, ads1cfg[i].data);
|
|
// }
|
|
|
|
// ads1293_spi_writereg(&m_ads1293_1, TI_ADS1293_CONFIG_REG, 0x01);
|
|
}
|
|
|
|
static void zdatachanel_send_log(const char* fmt, ...) {
|
|
static char tx[256] = {0};
|
|
static uint16_t len = 0;
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
len = vsprintf(tx, fmt, args);
|
|
int ret;
|
|
do {
|
|
ret = zdatachannel_data_send((uint8_t*)tx, &len);
|
|
} while (ret != 0);
|
|
va_end(args);
|
|
}
|
|
static void zdatachannel_data_handler(zdatachannel_evt_t* p_evt) {}
|
|
static void on_service_init(void) {
|
|
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));
|
|
}
|
|
#endif
|