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

nRF 52810 reset with PA

Hi,

   I'm sorry to borther you in your holiday.I got a issuse about 52810 (s112) with PA.I found my device would reset when I call ble_advertising_start() after calling pa_lna_init().The device work fine without calling pa_lna_init().There are 3 ports that I need to use them with interruption,the interruption of ports will affect the PA?What do I miss?There are my code below.

#include <stdint.h>
#include <string.h>

#include "ble.h"
#include "app_error.h"
#include "nrf_drv_gpiote.h"
#include "nrf_drv_ppi.h"
#include "nrfx_ppi.h"

#include "pa_lna.h"

void pa_lna_init(uint32_t gpio_pa_pin, uint32_t gpio_lna_pin)
{
    ble_opt_t opt;
    uint32_t gpiote_ch = NULL;
    ret_code_t err_code;        

    memset(&opt, 0, sizeof(ble_opt_t));
    
    err_code = nrf_drv_gpiote_init( );
    if(err_code != NRF_ERROR_INVALID_STATE)
        APP_ERROR_CHECK(err_code);
    
    err_code = nrf_drv_ppi_init( );
    if(err_code != NRF_ERROR_MODULE_ALREADY_INITIALIZED)
        APP_ERROR_CHECK(err_code);
    
    nrf_ppi_channel_t ppi_set_ch;
    nrf_ppi_channel_t ppi_clr_ch;
    
    err_code = nrf_drv_ppi_channel_alloc(&ppi_set_ch);
    APP_ERROR_CHECK(err_code);
    
    err_code = nrf_drv_ppi_channel_alloc(&ppi_clr_ch);
    APP_ERROR_CHECK(err_code);

    nrf_drv_gpiote_out_config_t config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(false);
    
    if((gpio_pa_pin == NULL) && (gpio_lna_pin == NULL))
    {
        err_code = NRF_ERROR_INVALID_PARAM;
        APP_ERROR_CHECK(err_code);
    }    

    if(gpio_pa_pin != NULL)
    {
        if(gpiote_ch == NULL)
        {
            err_code = nrf_drv_gpiote_out_init(gpio_pa_pin, &config);
            APP_ERROR_CHECK(err_code);
            
            gpiote_ch = nrf_drv_gpiote_out_task_addr_get(gpio_pa_pin); 
        }
        
        // PA config
        opt.common_opt.pa_lna.pa_cfg.active_high = 1;   // Set the pin to be active high
        opt.common_opt.pa_lna.pa_cfg.enable      = 1;   // Enable toggling
        opt.common_opt.pa_lna.pa_cfg.gpio_pin    = gpio_pa_pin; // The GPIO pin to toggle tx  
    }
    
    if(gpio_lna_pin != NULL)
    {
        if(gpiote_ch == NULL)
        {
            err_code = nrf_drv_gpiote_out_init(gpio_lna_pin, &config);
            APP_ERROR_CHECK(err_code);        
            
            gpiote_ch = nrf_drv_gpiote_out_task_addr_get(gpio_lna_pin); 
        }
        
        // LNA config
        opt.common_opt.pa_lna.lna_cfg.active_high  = 1; // Set the pin to be active high
        opt.common_opt.pa_lna.lna_cfg.enable       = 1; // Enable toggling
        opt.common_opt.pa_lna.lna_cfg.gpio_pin     = gpio_lna_pin;  // The GPIO pin to toggle rx
    }

    // Common PA/LNA config
    opt.common_opt.pa_lna.gpiote_ch_id  = (gpiote_ch - NRF_GPIOTE_BASE) >> 2;   // GPIOTE channel used for radio pin toggling
    opt.common_opt.pa_lna.ppi_ch_id_clr = ppi_clr_ch;   // PPI channel used for radio pin clearing
    opt.common_opt.pa_lna.ppi_ch_id_set = ppi_set_ch;   // PPI channel used for radio pin setting
    
    err_code = sd_ble_opt_set(BLE_COMMON_OPT_PA_LNA, &opt);
    APP_ERROR_CHECK(err_code);    
}


/*********************************************************
*                   ports interruption
*********************************************************/

static void gpiote_event_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
		if( ( action == NRF_GPIOTE_POLARITY_HITOLO )&&( ( pin == KeyLight ) 
				|| ( pin == KeyPower ) || ( pin == KeyBLE ) ) )
		 {
			  if( !(nrf_drv_gpiote_in_is_set(pin)) )
				 {
						if( ( !keyToggleFlag ) && ( !( keyFlag&KEY_Timer_FLAG ) ) )
						 {
								keyToggleFlag = true;
						 }
				 }
		 }
}

void PortInit( )
{
   //Key
   uint32_t err_code = nrf_drv_gpiote_init( );
   if(err_code != NRF_ERROR_INVALID_STATE)
        APP_ERROR_CHECK(err_code);
	 
	 nrf_drv_gpiote_in_config_t config = NRFX_GPIOTE_CONFIG_IN_SENSE_HITOLO(false);
   config.pull = NRF_GPIO_PIN_PULLUP;

   err_code = nrf_drv_gpiote_in_init(KeyLight, &config, gpiote_event_handler);
   APP_ERROR_CHECK(err_code);
	 
	 err_code = nrf_drv_gpiote_in_init(KeyPower, &config, gpiote_event_handler);
   APP_ERROR_CHECK(err_code);
	 
	 err_code = nrf_drv_gpiote_in_init(KeyBLE, &config, gpiote_event_handler);
   APP_ERROR_CHECK(err_code);
	 
	 err_code = nrf_drv_gpiote_in_init( CHRG, &config, charge_event_handler );
   APP_ERROR_CHECK(err_code);
}

Parents Reply Children
Related