diff --git a/ads1298.c b/ads1298.c index c3ce6bd..5ff373f 100644 --- a/ads1298.c +++ b/ads1298.c @@ -76,10 +76,11 @@ void ads1298_initialize(ads1298_info_t *p_info) { spi_config.miso_pin = ADS1298_MISO_PIN; spi_config.mosi_pin = ADS1298_MOSI_PIN; spi_config.sck_pin = ADS1298_SCK_PIN; - spi_config.frequency = NRF_DRV_SPI_FREQ_500K; - //spi_config.frequency = NRF_DRV_SPI_FREQ_1M; + //spi_config.frequency = NRF_DRV_SPI_FREQ_125K; + //spi_config.frequency = NRF_DRV_SPI_FREQ_500K; + spi_config.frequency = NRF_DRV_SPI_FREQ_1M; //spi_config.frequency = NRF_DRV_SPI_FREQ_2M; - spi_config.irq_priority = APP_IRQ_PRIORITY_HIGHEST; + //spi_config.irq_priority = APP_IRQ_PRIORITY_HIGHEST; spi_config.mode = NRF_DRV_SPI_MODE_1; spi_config.orc = 0x55; diff --git a/ads1298.h b/ads1298.h index 151999e..78e5312 100644 --- a/ads1298.h +++ b/ads1298.h @@ -65,19 +65,18 @@ #define ADS129x_8CH_BITMASK 0x02 // 0x[...]10[010] /** DEFAULT REGISTER VALUES **/ -//#define ADS1298_REGDEFAULT_CONFIG1 0x05 // Low power mode, Daisy-chain mode, clk output disabled, LP: 250 SPS -#define ADS1298_REGDEFAULT_CONFIG1 0x46 // Low power mode, Multiple readback mode, clk output disabled, LP: 250 SPS +#define ADS1298_REGDEFAULT_CONFIG1 0xC6 // High-res mode, Multiple readback mode, clk output disabled, LP: 250 SPS #define ADS1298_REGDEFAULT_CONFIG2 0x00 // Test signals -#define ADS1298_REGDEFAULT_CONFIG3 0xCC // +#define ADS1298_REGDEFAULT_CONFIG3 0xCE // #define ADS1298_REGDEFAULT_LOFF 0x00 -#define ADS1298_REGDEFAULT_CH1SET 0x01 // Input Short (for startup) -#define ADS1298_REGDEFAULT_CH2SET 0x01 // Input Short (for startup) -#define ADS1298_REGDEFAULT_CH3SET 0x01 // Input Short (for startup) -#define ADS1298_REGDEFAULT_CH4SET 0x01 // Input Short (for startup) -#define ADS1298_REGDEFAULT_CH5SET 0x01 // Input Short (for startup) -#define ADS1298_REGDEFAULT_CH6SET 0x01 // Input Short (for startup) -#define ADS1298_REGDEFAULT_CH7SET 0x01 // Input Short (for startup) -#define ADS1298_REGDEFAULT_CH8SET 0x01 // Input Short (for startup) +#define ADS1298_REGDEFAULT_CH1SET 0x81 // Input Short (for startup) +#define ADS1298_REGDEFAULT_CH2SET 0x81 // Input Short (for startup) +#define ADS1298_REGDEFAULT_CH3SET 0x81 // Input Short (for startup) +#define ADS1298_REGDEFAULT_CH4SET 0x81 // Input Short (for startup) +#define ADS1298_REGDEFAULT_CH5SET 0x81 // Input Short (for startup) +#define ADS1298_REGDEFAULT_CH6SET 0x81 // Input Short (for startup) +#define ADS1298_REGDEFAULT_CH7SET 0x81 // Input Short (for startup) +#define ADS1298_REGDEFAULT_CH8SET 0x81 // Input Short (for startup) #define ADS1298_REGDEFAULT_RLD_SENSP 0x00 #define ADS1298_REGDEFAULT_RLD_SENSN 0x00 #define ADS1298_REGDEFAULT_LOFF_SENSP 0x00 @@ -110,7 +109,10 @@ typedef struct { char usb_buffer[USBD_MAX_SIZE]; uint8_t usb_buffer_count; uint8_t usb_buffer_size_max; +#if ADS1298_STATS uint32_t drdy_trigger_count; + uint32_t seconds_elapsed; +#endif } ads1298_info_t; /** FUNCTION PROTOTYPES **/ diff --git a/main.c b/main.c index 3bf1c93..d3e8710 100644 --- a/main.c +++ b/main.c @@ -86,6 +86,7 @@ void reset_counters(void) { reset_buffer_count(m_info.usb_buffer); // #TODO: Clear stats: m_info.drdy_trigger_count = 0; + m_info.seconds_elapsed = 0; // #TODO: elapsed time Milliseconds (need last second timer). #endif } @@ -115,11 +116,14 @@ void write_ic_settings(uint8_t* new_packet) { case TN_IC_ADS1298: { // #TODO: &new_packet[1] #if ADS1298 + ads1298_stop_rdatac(); NRF_LOG_INFO("Writing new ADS1298 registers:"); NRF_LOG_HEXDUMP_INFO(&new_packet[1], ADS1298_REGISTER_COUNT); memcpy(m_info.registers, &new_packet[1], ADS1298_REGISTER_COUNT); ads1298_update_registers(&m_info); ads1298_set_data_buffer_length(&m_info); + ads1298_start_rdatac(); + ads1298_standby(); // #TODO: readback registers into m_info.registers to confirm correct write. #endif } break; @@ -132,9 +136,9 @@ void read_ic_settings(uint8_t* new_packet) { switch (SECOND_NIBBLE(new_packet[0])) { case TN_IC_ADS1298: { // #NOTE: you will not be able to read registers while in RDATAC mode. - ads1298_stop_rdatac(); - // ads1298_check_id(&m_info); + // ads1298_check_id(&m_info); + ads1298_stop_rdatac(); // read all registers into m_info.registers ads1298_readback_registers(&m_info); // Send back over USB. @@ -172,6 +176,7 @@ static void process_new_packet(uint8_t* new_packet) { NRF_LOG_INFO("[ADS129x] Active channels: 0x%X", m_info.active_chs); } #endif + reset_counters(); } if (SECOND_NIBBLE(new_packet[0]) == TN_STREAM_STOP) { recording_mode = RECORDING_MODE_DISABLED; @@ -236,18 +241,6 @@ static void cdc_acm_user_ev_handler(app_usbd_class_inst_t const * p_inst, process_new_packet(usb_read_buffer); - // if (usb_read_buffer[0] == 0xBE) { - - // } - - // if (usb_read_buffer[0] == 0xEF) { - // run_throughput_test = true; - // } - // if (usb_read_buffer[0] == 0xE1) { - // run_throughput_test = false; - // } - // NRF_LOG_INFO("Received packet; first byte: 0x%X", new_packet[0]); - /* Fetch data until internal buffer is empty */ ret = app_usbd_cdc_acm_read(&m_app_cdc_acm, usb_read_buffer, READ_SIZE); } while (ret == NRF_SUCCESS); @@ -291,15 +284,12 @@ static void usbd_user_ev_handler(app_usbd_event_type_t event) { } } -void idle_state_handle(void) { - -} - #if ADS1298 void drdy_pin_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) { UNUSED_PARAMETER(pin); UNUSED_PARAMETER(action); drdy_flag = true; + m_info.drdy_trigger_count += 1; } void ads1298_interrupt_setup(void) { @@ -323,6 +313,38 @@ void ads1298_interrupt_setup(void) { } #endif +#if ADS1298_STATS +APP_TIMER_DEF(ads_timer_id); +#define APP_TIMER_INTERVAL APP_TIMER_TICKS(1000) // 1 second. +static volatile bool ads_timer_timeout = false; + +static void ads_timer_timeout_handler(void* p_context) { + UNUSED_PARAMETER(p_context); + + ads_timer_timeout = true; + m_info.seconds_elapsed += 1; +} +#endif + +static void application_timers_start(void) { +#if ADS1298_STATS + ret_code_t err_code; + err_code = app_timer_start(ads_timer_id, APP_TIMER_INTERVAL, NULL); + APP_ERROR_CHECK(err_code); +#endif +} + +static void timers_init(void) { + ret_code_t ret = app_timer_init(); + APP_ERROR_CHECK(ret); + +#if ADS1298_STATS + ret_code_t err_code = + app_timer_create(&ads_timer_id, APP_TIMER_MODE_REPEATED, ads_timer_timeout_handler); + APP_ERROR_CHECK(err_code); +#endif +} + int main(void) { ret_code_t ret; static const app_usbd_config_t usbd_config = { @@ -342,8 +364,7 @@ int main(void) { // Wait for LFCLK to init. while(!nrf_drv_clock_lfclk_is_running()) { } - ret = app_timer_init(); - APP_ERROR_CHECK(ret); + timers_init(); app_usbd_serial_num_generate(); @@ -368,6 +389,7 @@ int main(void) { // Init peripherals: #if ADS1298 ads1298_interrupt_setup(); + nrf_delay_ms(200); ads1298_initialize(&m_info); #endif @@ -375,15 +397,26 @@ int main(void) { reset_counters(); + // #TEMP: application_timers_start + application_timers_start(); + while (true) { while (app_usbd_event_queue_process()) { /* Nothing to do */ } if (recording_mode == RECORDING_MODE_ALL) { // if (recording_mode & drdy_flag) { // may be faster if we're just using ADS1298 - if (drdy_flag) { #if ADS1298 - // #TODO: Count samples - // #Maybe this should select based on the number of *active* channels? + if (drdy_flag) { + drdy_flag = false; + #if ADS1298_STATS + + if (ads_timer_timeout) { + ads_timer_timeout = false; + //NRF_LOG_INFO("[ADS1298] Collected %lu samples in %d seconds", m_info.drdy_trigger_count, m_info.seconds_elapsed); + NRF_LOG_INFO("[ADS1298] DR: %lu", m_info.drdy_trigger_count / m_info.seconds_elapsed); + } + #endif + switch (m_info.nChs) { case 4: ads1294_get_data(&m_info); @@ -400,11 +433,13 @@ int main(void) { if (m_info.usb_buffer_count >= m_info.usb_buffer_size_max) { m_info.usb_buffer_count = ADS1298_PACKET_OFFSET; - app_usbd_cdc_acm_write(&m_app_cdc_acm, m_info.usb_buffer, NRF_DRV_USBD_EPSIZE); + app_usbd_cdc_acm_write(&m_app_cdc_acm, m_info.usb_buffer, m_info.usb_buffer_size_max); increment_packet(m_info.usb_buffer); + + // NRF_LOG_INFO("Current time tick: %lu", app_timer_cnt_get()); } - #endif } + #endif } if (run_throughput_test) { diff --git a/pca10056/blank/config/custom_board.h b/pca10056/blank/config/custom_board.h index 43d3ff5..77b70d3 100644 --- a/pca10056/blank/config/custom_board.h +++ b/pca10056/blank/config/custom_board.h @@ -3,6 +3,9 @@ #define NRF52840_BREAKOUT_BOARD 1 #define ADS1298 1 +#if ADS1298 + #define ADS1298_STATS 1 +#endif // Testing with nRF52840: #if NRF52840_BREAKOUT_BOARD