Hello everyone,
I use SDK14.2 and s132 softdevice. I can read "NRF_SAADC_INPUT_AIN0" and "NRF_SAADC_INPUT_VDD" pins and system is working properly.
Working Code like this;
#define ADC_RESULT_IN_MILLI_VOLTS(ADC_VALUE)\ ((((ADC_VALUE) * ADC_REF_VOLTAGE_IN_MILLIVOLTS) / ADC_RES_10BIT) * ADC_PRE_SCALING_COMPENSATION) #define ADC_REF_VOLTAGE_IN_MILLIVOLTS 600 /**< Reference voltage (in milli volts) used by ADC while doing conversion. */ #define ADC_PRE_SCALING_COMPENSATION 6 /**< The ADC is configured to use VDD with 1/3 prescaling as input. And hence the result of conversion is to be multiplied by 3 to get the actual value of the battery voltage.*/ #define DIODE_FWD_VOLT_DROP_MILLIVOLTS 34 /**< Typical forward voltage drop of the diode . */ #define ADC_RES_10BIT 1024 /**< Maximum digital value for 10-bit ADC conversion. */ #define SAADC_SAMPLE_RATE 250 /**< SAADC sample rate in ms. */ static const nrf_drv_timer_t m_timer = NRF_DRV_TIMER_INSTANCE(3); static nrf_ppi_channel_t m_ppi_channel; static nrf_saadc_value_t adc_buffer[2]; /**< SAADC Parameter */ void timer_handler(nrf_timer_event_t event_type, void* p_context) { } void saadc_sampling_event_init(void) { ret_code_t err_code; err_code = nrf_drv_ppi_init(); APP_ERROR_CHECK(err_code); nrf_drv_timer_config_t timer_config = NRF_DRV_TIMER_DEFAULT_CONFIG; timer_config.frequency = NRF_TIMER_FREQ_31250Hz; err_code = nrf_drv_timer_init(&m_timer, &timer_config, timer_handler); APP_ERROR_CHECK(err_code); /* setup m_timer for compare event */ uint32_t ticks = nrf_drv_timer_ms_to_ticks(&m_timer,SAADC_SAMPLE_RATE); nrf_drv_timer_extended_compare(&m_timer, NRF_TIMER_CC_CHANNEL0, ticks, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, false); nrf_drv_timer_enable(&m_timer); uint32_t timer_compare_event_addr = nrf_drv_timer_compare_event_address_get(&m_timer, NRF_TIMER_CC_CHANNEL0); uint32_t saadc_sample_event_addr = nrf_drv_saadc_sample_task_get(); /* setup ppi channel so that timer compare event is triggering sample task in SAADC */ err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel); APP_ERROR_CHECK(err_code); err_code = nrf_drv_ppi_channel_assign(m_ppi_channel, timer_compare_event_addr, saadc_sample_event_addr); APP_ERROR_CHECK(err_code); } void saadc_sampling_event_enable(void) { ret_code_t err_code = nrf_drv_ppi_channel_enable(m_ppi_channel); APP_ERROR_CHECK(err_code); } void saadc_callback(nrf_drv_saadc_evt_t const * p_event) { if (p_event->type == NRF_DRV_SAADC_EVT_DONE) { ret_code_t err_code; nrf_saadc_value_t adc_bat; nrf_saadc_value_t adc_value_1; uint16_t batt_lvl_in_milli_volts; uint8_t percentage_batt_lvl; adc_bat = p_event->data.done.p_buffer[0]; adc_value_1 = p_event->data.done.p_buffer[1]; // set buffers err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, 2); APP_ERROR_CHECK(err_code); batt_lvl_in_milli_volts = ADC_RESULT_IN_MILLI_VOLTS(adc_bat) + DIODE_FWD_VOLT_DROP_MILLIVOLTS; percentage_batt_lvl = battery_level_in_percent(batt_lvl_in_milli_volts); err_code = ble_bas_battery_level_update(&m_bas, percentage_batt_lvl); if ( (err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_RESOURCES) && (err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING) ) { APP_ERROR_HANDLER(err_code); } // NRF_LOG_INFO("adc_bat = %u", adc_bat); NRF_LOG_INFO("adc_value_1 = %u",adc_value_1); // NRF_LOG_INFO("percentage_batt_lvl = %u", percentage_batt_lvl); } } void saadc_init(void) { ret_code_t err_code; nrf_saadc_channel_config_t channel_0_config = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_VDD); nrf_saadc_channel_config_t channel_1_config = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN0); err_code = nrf_drv_saadc_init(NULL, saadc_callback); APP_ERROR_CHECK(err_code); err_code = nrf_drv_saadc_channel_init(0, &channel_0_config); APP_ERROR_CHECK(err_code); err_code = nrf_drv_saadc_channel_init(1, &channel_1_config); APP_ERROR_CHECK(err_code); err_code = nrf_drv_saadc_buffer_convert(&adc_buffer[0], 2); APP_ERROR_CHECK(err_code); err_code = nrf_drv_saadc_buffer_convert(&adc_buffer[1], 2); APP_ERROR_CHECK(err_code); }
Now I want to add new ADC pin and read "NRF_SAADC_INPUT_AIN1". I added new configuration in saadc_init function;
nrf_saadc_channel_config_t channel_2_config =
NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN1);
err_code = nrf_drv_saadc_channel_init(2, &channel_2_config);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_saadc_buffer_convert(&adc_buffer[2], 2);
APP_ERROR_CHECK(err_code);
And I add new value variable in saadc_calback function
nrf_saadc_value_t adc_value_2;
adc_value_2= p_event->data.done.p_buffer[2];
NRF_LOG_INFO("adc_value_2= %u",adc_value_2);
I can compile the code but when I upload the code device can not advertise and RTT Viewer output get fail.
"0> <error> app: Fatal error"
Do you have any suggestion ?