I am developing an application that get information from a thermocouple sensor that use a IC (max6675k) to communicate with the NRF52832 via SPI.
The application needs to get the information from the sensor each certain time, and print it on the serial monitor. As well, I need to get the account of times that buttom is push thus I defined a GPIO interrupt to register it. Also I need communication with the NRF using the NUS and get the battery level using BAS.
when I call "nrf_drv_spi_transfer()" the first time, I have no Errors, however I notice that the SPI handler functions it is never called. When the "nrf_drv_spi_transfer()" is called for second time, I get the ERROR 17 [NRF_ERROR_BUSY].
I will describe the steps that the application take: /*Init Functions*/
{
ret_code_t err_code;
uart_init();
log_init();
timers_init();
gpio_init();
gpiote_init();
saadc_init();
spi_init();
init_pin_MAX6675();
power_management_init();
ble_stack_init();
err_code = nrf_fstorage_init(&fstorage, &nrf_fstorage_sd, NULL);
APP_ERROR_CHECK(err_code);
gap_params_init();
gatt_init();
services_init();
advertising_init();
conn_params_init();
}
// Start execution.
advertising_start();
start_send_info();
NRF_LOG_INFO("STARTED");
loop:
for (;;)
{
idle_state_handle();
if (SEND_INFO_FLAG){
// ***** Get The values ******//
stop_send_info();
SEND_INFO_FLAG=0;
/* Battery status: true - battery ok, false - battery low */
bool batteryStatus = get_battery_status();
/* Channels Counter DRYCON's */
uint32_t conunterDif1 = dryConCounter1 - dryConCounter1_p;
uint32_t conunterDif2 = dryConCounter2 - dryConCounter2_p;
uint32_t conunterDif3 = dryConCounter3 - dryConCounter3_p;
storage_counter_data(dryConCounter1Flash, conunterDif1);
storage_counter_data(dryConCounter2Flash, conunterDif2);
storage_counter_data(dryConCounter3Flash, conunterDif3);
uint32_t channel1counter = dryConCounter1;
uint32_t channel2counter = dryConCounter2;
uint32_t channel3counter = dryConCounter3;
dryConCounter1_p=dryConCounter1;
dryConCounter2_p=dryConCounter2;
dryConCounter3_p=dryConCounter3;
uint32_t channel1counter_h = get_historical_counter(dryConCounter1Flash) ;
uint32_t channel2counter_h = get_historical_counter(dryConCounter2Flash);
uint32_t channel3counter_h = get_historical_counter(dryConCounter3Flash);
/* Digitals Values */
bool digital1Value = get_digital_status(DIGITAL1);
bool digital2Value = get_digital_status(DIGITAL2);
/* Analogs Values */
float analog1Value = get_analog_reading(ANALOG1);
float analog2Value = get_analog_reading(ANALOG2);
float analog3Value = get_analog_reading(ANALOG3);
/* Temperature reading*/
uint16_t temp=max6675_readcelsius(); //<---- error occurs here
/*PRINT THE DATA IN SERIAL MONITOR*/
}
Function called in the loop:uint16_t max6675_readcelsius(void) {
ret_code_t err_code;
uint8_t outbuffer[2];
uint16_t temp;
err_code = nrf_drv_spi_transfer(&spi,NULL,0,outbuffer,2);
APP_ERROR_CHECK(err_code);
nrf_gpio_pin_set(CS_MAX6675);
temp = ((uint16_t)outbuffer[0]<<8)|((uint16_t)outbuffer[1]);
temp = temp>>3;
temp = temp*25;
return temp;
}
static void send_info (void *p_context){
NRF_LOG_INFO("TIMER handler.");
SEND_INFO_FLAG = 1;
}
I has read some forums where it is indicate that the problem could be that into the interrupts other interrupts functios are be called, but it is not the case. I am not calling other functions into the interrupts. However the SPI functions handler it is never called.
what is it wrong?