This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

GPIOTE events firing as soon as they are enabled

I am trying to implement a simple matrix 4X4 keypad. I have an issue in enabling gpiote events. I disable gpiote events when there is a row event and i scan the keys by turining off/on columns and reading the row states. Then i re-enable them. However as soon as i enable there is a new event firing (probably because button is still physically closed) but i set the event lotohi so i'd still expect it to not fire..

Any suggestion is welcome thanks! 

static const uint8_t column_to_pin_map[4] =
{
    (uint8_t)(KBC_1_PIN),
    (uint8_t)(KBC_2_PIN),
    (uint8_t)(KBC_3_PIN),
    (uint8_t)(KBC_4_PIN),
};

static const uint8_t row_to_pin_map[4] =
{
    (uint8_t)(KBR_1_PIN),
    (uint8_t)(KBR_2_PIN),
    (uint8_t)(KBR_3_PIN),
    (uint8_t)(KBR_4_PIN),
};


static void scan_keyboard_for(uint8_t row_pin){
    
    uint8_t column = NULL;
    uint8_t row = NULL;
    disable_row_events();
    for(uint8_t c = 0; c < 4;c++){
        nrfx_gpiote_out_clear(column_to_pin_map[c]);
        nrf_delay_us(PROPAGATION_DELAY);
        if(!nrfx_gpiote_in_is_set(row_pin)){
            column = 1 + c;
            break; 
        }
    }
    if(KBR_1_PIN == row_pin) row = 1;
    if(KBR_2_PIN == row_pin) row = 2;
    if(KBR_3_PIN == row_pin) row = 3;
    if(KBR_4_PIN == row_pin) row = 4;

    NRF_LOG_INFO("COLUMN: %d ROW: %d", column, row);

    nrf_delay_us(PROPAGATION_DELAY);

    nrfx_gpiote_out_set(KBC_1_PIN);
    nrfx_gpiote_out_set(KBC_2_PIN);
    nrfx_gpiote_out_set(KBC_3_PIN);
    nrfx_gpiote_out_set(KBC_4_PIN);

    enable_row_events();
    //return column;
}

static void gpiote_in_event_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
    scan_keyboard_for(pin);
}

static void enable_row_events(){
    nrfx_gpiote_in_event_enable( KBR_1_PIN, true );
    nrfx_gpiote_in_event_enable( KBR_2_PIN, true );
    nrfx_gpiote_in_event_enable( KBR_3_PIN, true );
    nrfx_gpiote_in_event_enable( KBR_4_PIN, true );
}
static void disable_row_events(){
    nrfx_gpiote_in_event_disable( KBR_1_PIN );
    nrfx_gpiote_in_event_disable( KBR_2_PIN );
    nrfx_gpiote_in_event_disable( KBR_3_PIN );
    nrfx_gpiote_in_event_disable( KBR_4_PIN );
}

void init_keyboard(){
    if(!nrfx_gpiote_is_init())
    {
        APP_ERROR_CHECK(nrfx_gpiote_init());
    }
    nrfx_gpiote_out_config_t config_out = NRFX_GPIOTE_CONFIG_OUT_SIMPLE(true); // true ==> init high
    nrfx_gpiote_in_config_t config_in = NRFX_GPIOTE_CONFIG_IN_SENSE_LOTOHI(false);//NRFX_GPIOTE_CONFIG_IN_SENSE_TOGGLE(false); // false ==> hi accu = false
    config_in.pull = NRF_GPIO_PIN_PULLDOWN;
    
    APP_ERROR_CHECK(nrfx_gpiote_out_init(KBC_1_PIN, &config_out ));
    APP_ERROR_CHECK(nrfx_gpiote_out_init(KBC_2_PIN, &config_out ));
    APP_ERROR_CHECK(nrfx_gpiote_out_init(KBC_3_PIN, &config_out ));
    APP_ERROR_CHECK(nrfx_gpiote_out_init(KBC_4_PIN, &config_out ));
    
    APP_ERROR_CHECK(nrfx_gpiote_in_init(KBR_1_PIN, &config_in, gpiote_in_event_handler));
    APP_ERROR_CHECK(nrfx_gpiote_in_init(KBR_2_PIN, &config_in, gpiote_in_event_handler));
    APP_ERROR_CHECK(nrfx_gpiote_in_init(KBR_3_PIN, &config_in, gpiote_in_event_handler));
    APP_ERROR_CHECK(nrfx_gpiote_in_init(KBR_4_PIN, &config_in, gpiote_in_event_handler));
    
    enable_row_events();


    NRF_LOG_INFO("keyboard init done");
}

Parents Reply Children
No Data
Related