/** * @brief Function for receiving and sending data from IRQ. (The same for both IRQs). */ static __INLINE void spi_master_send_recv_irq(volatile spi_master_instance_t * const p_spi_instance) { APP_ERROR_CHECK_BOOL(p_spi_instance != NULL); p_spi_instance->bytes_count++; if (!p_spi_instance->started_flag) { p_spi_instance->started_flag = true; spi_master_signal_evt(p_spi_instance, SPI_MASTER_EVT_TRANSFER_STARTED, p_spi_instance->bytes_count); } uint8_t rx_byte = p_spi_instance->p_nrf_spi->RXD; uint8_t * p_rx_buffer = p_spi_instance->p_rx_buffer; uint16_t rx_length = p_spi_instance->rx_length; uint16_t rx_index = p_spi_instance->rx_index; if ((p_rx_buffer != NULL) && (rx_index < rx_length)) { p_rx_buffer[p_spi_instance->rx_index++] = rx_byte; } uint8_t * p_tx_buffer = p_spi_instance->p_tx_buffer; uint16_t tx_length = p_spi_instance->tx_length; uint16_t tx_index = p_spi_instance->tx_index; uint16_t max_length = p_spi_instance->max_length; if (tx_index < max_length) { p_spi_instance->p_nrf_spi->TXD = ((p_tx_buffer != NULL) && (tx_index < tx_length)) ? p_tx_buffer[tx_index] : SPI_DEFAULT_TX_BYTE; (p_spi_instance->tx_index)++; } if (p_spi_instance->bytes_count >= max_length) { nrf_gpio_pin_set(p_spi_instance->pin_slave_select); uint16_t transmited_bytes = p_spi_instance->tx_index; spi_master_buffer_release(&(p_spi_instance->p_tx_buffer), &(p_spi_instance->tx_length)); spi_master_buffer_release(&(p_spi_instance->p_rx_buffer), &(p_spi_instance->rx_length)); p_spi_instance->state = SPI_MASTER_STATE_IDLE; spi_master_signal_evt(p_spi_instance, SPI_MASTER_EVT_TRANSFER_COMPLETED, transmited_bytes); } }
/** * @brief Function for transmitting data between SPI master and SPI slave. */ uint32_t spi_master_send_recv(const spi_master_hw_instance_t spi_master_hw_instance, uint8_t * const p_tx_buf, const uint16_t tx_buf_len, uint8_t * const p_rx_buf, const uint16_t rx_buf_len) { #if defined(SPI_MASTER_0_ENABLE) || defined(SPI_MASTER_1_ENABLE) spi_master_instance_t * p_spi_instance = spi_master_get_instance(spi_master_hw_instance); uint32_t err_code = NRF_SUCCESS; uint16_t max_length = 0; if (p_spi_instance->state == SPI_MASTER_STATE_IDLE) { NVIC_DisableIRQ(p_spi_instance->irq_type); max_length = (rx_buf_len > tx_buf_len) ? rx_buf_len : tx_buf_len; if (max_length > 0) { p_spi_instance->state = SPI_MASTER_STATE_BUSY; p_spi_instance->start_flag = true; //abort_flag should set by abort and cleared only by restart p_spi_instance->bytes_count = 0; p_spi_instance->max_length = max_length; spi_master_buffer_release(&(p_spi_instance->p_tx_buffer), &(p_spi_instance->tx_length)); spi_master_buffer_release(&(p_spi_instance->p_rx_buffer), &(p_spi_instance->rx_length)); /* Initialize buffers */ spi_master_buffer_init(p_tx_buf, tx_buf_len, &(p_spi_instance->p_tx_buffer), &(p_spi_instance->tx_length), &(p_spi_instance->tx_index)); spi_master_buffer_init(p_rx_buf, rx_buf_len, &(p_spi_instance->p_rx_buffer), &(p_spi_instance->rx_length), &(p_spi_instance->rx_index)); nrf_gpio_pin_clear(p_spi_instance->pin_slave_select); spi_master_send_initial_bytes(p_spi_instance); spi_master_signal_evt(p_spi_instance, SPI_MASTER_EVT_TRANSFER_STARTED, max_length); } else { err_code = NRF_ERROR_INVALID_PARAM; } NVIC_EnableIRQ(p_spi_instance->irq_type); } else { err_code = NRF_ERROR_BUSY; } return err_code; #else return NRF_ERROR_NOT_SUPPORTED; #endif }