Good day
Due to I am very new with NRF chips and I did not find direct answer on forum I require some clarification on that moment...
The task is to detect input pulse ( trailing edge ) of original length 2 us and extend it for <time_us>
For now I have implementation that uses PPI channel: GPIOTE input event lowToHigh + GPIOTE output task TOGGLE( init_low ). When I detect edge -> toggle task fires ( output becomes high ) -> I nrf_delay_us( <time_us> ) in in_event_handler and trigger task manually nrf_drv_gpiote_out_task_trigger( out_pin ) -> pin becomes low. Edge trigger delay is acceptable and is about 400 ns: blue - input signal, yellow - output

I plan to improve this implementation with hw timer + PPI to produce <time_us> delay with falling edge
But the question is whether it is possible to implement this using only one pin ?
I successfully get trailing edge detection but when I re-configure input pin for output inside in_event_handler and produce extended pulse I get such picture. Input and output pins are connected with resistor so we get original pulse -> "falldown" while re-configuring -> high level

#if (_PROLONG_WITH_2_PINS)
static const nrf_drv_gpiote_out_config_t m_txir_out_config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(false );
#else
static const nrf_drv_gpiote_out_config_t m_txir_out_config = GPIOTE_CONFIG_OUT_SIMPLE( false );
#endif
static const nrf_drv_gpiote_in_config_t m_txir_in_config = {
.sense = NRF_GPIOTE_POLARITY_LOTOHI,
.pull = NRF_GPIO_PIN_PULLUP,
.is_watcher = true,
.hi_accuracy = true,
.skip_gpio_setup = false,
};
static void configure_txir_pin( bool input);
static void in_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action) {
UNUSED_PARAMETER( pin ); /* only one pin event is enabled - no need to distinguish for now */
UNUSED_PARAMETER( action );
#if( _PROLONG_WITH_2_PINS)
nrf_delay_us( 70 );
nrf_drv_gpiote_out_task_trigger( TXIR_OUT_PIN );
#else
configure_txir_pin( false );
nrf_drv_gpiote_out_set( TXIR_OUT_PIN );
nrf_delay_us( 70 );
configure_txir_pin( true );
#endif
}
void configure_txir_pin( bool input) {
ret_code_t err_code;
if( input ) {
nrf_drv_gpiote_out_uninit( TXIR_OUT_PIN );
err_code = nrf_drv_gpiote_in_init( TXIR_IN_PIN, &m_txir_in_config, in_pin_handler );
APP_ERROR_CHECK(err_code);
nrf_drv_gpiote_in_event_enable( TXIR_IN_PIN, true );
}
else {
nrf_drv_gpiote_in_uninit( TXIR_IN_PIN );
err_code = nrf_drv_gpiote_out_init( TXIR_OUT_PIN, &m_txir_out_config );
APP_ERROR_CHECK(err_code);
}
}
static void txir_prolong_setup() {
ret_code_t err_code;
#if( _PROLONG_WITH_2_PINS )
uint32_t gpiote_in_task_addr;
uint32_t gpiote_out_task_addr;
nrf_ppi_channel_t ppi_channel;
nrf_drv_ppi_init();
#endif
if( !nrf_drv_gpiote_is_init() ) {
err_code = nrf_drv_gpiote_init();
APP_ERROR_CHECK(err_code);
}
configure_txir_pin( true );
#if( _PROLONG_WITH_2_PINS )
err_code = nrf_drv_gpiote_out_init(TXIR_OUT_PIN, &m_txir_out_config);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_ppi_channel_alloc(&ppi_channel);
APP_ERROR_CHECK(err_code);
gpiote_in_task_addr = nrf_drv_gpiote_in_event_addr_get(TXIR_IN_PIN );
gpiote_out_task_addr = nrf_drv_gpiote_out_task_addr_get(TXIR_OUT_PIN );
err_code = nrf_drv_ppi_channel_assign(ppi_channel, gpiote_in_task_addr, gpiote_out_task_addr);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_ppi_channel_enable(ppi_channel);
APP_ERROR_CHECK(err_code);
nrf_drv_gpiote_out_task_enable(TXIR_OUT_PIN);
#endif
}
