/** * \brief Callback function for ADC interrupts * * \param adc Pointer to ADC module. * \param channel ADC channel number. * \param result Conversion result from ADC channel. */ static void app_sampling_handler(ADC_t *adc, uint8_t channel, adc_result_t result) { /* Store ADC convertion result for the coresponding on-board sensor */ switch (adc_conv[adc_mux_index]) { case LIGHT_SENSOR_ADC_INPUT: light = 2048 - result; break; default: break; } /* Parse table of ADC conversions */ if (++adc_mux_index < sizeof(adc_conv)) { app_sampling_start_next_conversion(); return; } /* End of all conversions */ adc_mux_index = 0; /* Save values in FIFO */ if (2 > fifo_get_free_size(&app_sampling_fifo_desc)) { return; /* Error */ } fifo_push_uint16_nocheck(&app_sampling_fifo_desc, rtc_get_time()); fifo_push_uint16_nocheck(&app_sampling_fifo_desc, (uint16_t)light); LED_Off(LED1_GPIO); /* Enable the next RTC alarm */ app_sampling_rtc_run = true; rtc_set_alarm_relative(app_sampling_rate - 1); }
/** @ingroup spi_function @brief Send an array of bytes to to the SPI bus. @note Can only be used if SPI_USE_BUFFER are enabled in spi_iha_defs.h @see spi_iha_defs.h for SPI_USE_BUFFER setup. @return SPI_OK: OK byte send to SPI bus or put in tx_buffer.\n SPI_NO_ROOM_IN_TX_BUFFER: Buffer full no data send\n SPI_ILLEGAL_INSTANCE: instance is null. @param spi to send to. @param *buf pointer to buffer to be send. @param len no of bytes to send. */ uint8_t spi_send_bytes(spi_p spi, uint8_t buf[], uint8_t len) { uint8_t result = SPI_OK; uint32_t value; uint8_t tmp = 0; if (spi == NULL) { return SPI_ILLEGAL_INSTANCE; } // Select correct instance if (_this != spi ) { _select_instance(spi); } // Critical section { // disable interrupt spi_disable_interrupt(_spi_base, SPI_IDR_TDRE | SPI_IDR_RDRF); // Check if buffer is free if (len > fifo_get_free_size(spi->_spi_tx_fifo_desc)) { result = SPI_NO_ROOM_IN_TX_BUFFER; } else { // If SPI in idle send the first byte if (!_spi_active) { _spi_active = 1; // Send first byte value = SPI_TDR_TD(buf[0]) | SPI_TDR_PCS(spi_get_pcs(spi->_cs_pin)); if (len == 1) { // It was last byte value |= SPI_TDR_LASTXFER; } // Send byte _spi_base->SPI_TDR = value; //spi_enable_interrupt(_spi_base, SPI_IER_TDRE); tmp = 1; } // Put in the tx buffer for (uint8_t i = tmp; i < len; i++) { value = SPI_TDR_TD(buf[i]) | SPI_TDR_PCS(spi_get_pcs(spi->_cs_pin)); if (i == len-1) { // It was last byte value |= SPI_TDR_LASTXFER; } if ( fifo_push_uint32(spi->_spi_tx_fifo_desc, value) == FIFO_ERROR_OVERFLOW ) { result = SPI_NO_ROOM_IN_TX_BUFFER; } } } // restore interrupt state spi_enable_interrupt(_spi_base, SPI_IER_TDRE | SPI_IER_RDRF); } return result; }