Hi everyone, My configuration:
- nrf52832 microcontroller
- Softdevice S132 V4.0.2
- Nordic SDK 13.0
- IDE: Eclipse
I'm working with a "Stand-alone can bus controller" connected to nrf52832 with SPI interface. The CAN controller informs nrf52 micro, via an interrupt pin, that a “CAN packet" was received on the stand-alone controller. I analyzed that interrupt events are very frequent (about 500us). Interrupt pin is configured as input interrupt pin using GPIOTE:
void can_controller_interrupt_pin_init(uint8_t pin_int)
{
ret_code_t err_code;
err_code = nrf_drv_gpiote_init();
APP_ERROR_CHECK(err_code);
nrf_drv_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(true);
in_config.pull = NRF_GPIO_PIN_NOPULL;
err_code = nrf_drv_gpiote_in_init(pin_int, &in_config, can_controller_int_pin_handler);
APP_ERROR_CHECK(err_code);
nrf_drv_gpiote_in_event_enable(pin_int, true);
}
My problem is:
- During BT advertising, interrupt requests coming from CAN controller, are correctly detected.
- During BT connection, interrupt requests coming from CAN controller, are discarded.
It seems that Softdevice gives high priority to BLE connection and ignore interrupts.
How can I resolve this problem, without using a "polling solution"?
GATT Configuration:
#define APP_ADV_INTERVAL 64 /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
#define APP_ADV_TIMEOUT_IN_SECONDS 360 /**< The advertising timeout (in units of seconds). */
#define MIN_CONN_INTERVAL MSEC_TO_UNITS(15, UNIT_1_25_MS) /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
#define MAX_CONN_INTERVAL MSEC_TO_UNITS(75, UNIT_1_25_MS) /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
#define SLAVE_LATENCY 0 /**< Slave latency. */
#define CONN_SUP_TIMEOUT MSEC_TO_UNITS(6000, UNIT_10_MS) /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
#define FIRST_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(5000) /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
#define NEXT_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(30000) /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
#define MAX_CONN_PARAMS_UPDATE_COUNT 3 /**< Number of attempts before giving up the connection parameter negotiation. */
SPI Configuration:
ret_code_t spi1_init(void)
{
ret_code_t err_code;
nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
/* SPI Parameters */
spi_config.ss_pin = NRF_DRV_SPI_PIN_NOT_USED;
spi_config.miso_pin = SPIM1_MISO_PIN;
spi_config.mosi_pin = SPIM1_MOSI_PIN;
spi_config.sck_pin = SPIM1_SCK_PIN;
spi_config.orc = 0x00;
spi_config.frequency = NRF_DRV_SPI_FREQ_4M;
spi_config.mode = NRF_DRV_SPI_MODE_0;
spi_config.bit_order = NRF_DRV_SPI_BIT_ORDER_MSB_FIRST;
m_spi1.m_spi_instance = spi1;
m_spi1.m_spi_xfer_done = true;
/* Function for initializing the SPI master driver instance. */
err_code = nrf_drv_spi_init(&spi1,
&spi_config,
spi1_event_handler,
NULL);
m_spi1.m_init = (err_code == (NRF_SUCCESS)||NRF_ERROR_INVALID_STATE)? true : false;
return err_code;
}
Interrupt routine:
void can_controller_int_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
flag_can_msg = true;
}
Many thanks!