static __INLINE uint32_t frame_get() { uint32_t err_code; m_current_rx_packet_length = compute_current_packet_length(m_rx_packet_length, m_accumulated_rx_packet_length); if (mp_rx_buffer) { err_code = spi_master_send_recv(SER_PHY_SPI_MASTER, NULL, 0, &(mp_rx_buffer[m_accumulated_rx_packet_length]), m_current_rx_packet_length); } else { err_code = spi_master_send_recv(SER_PHY_SPI_MASTER, NULL, 0, m_frame_buffer, m_current_rx_packet_length); } return err_code; }
/**@brief Functions prepares buffers and starts data transfer. * * @param[in] p_tx_data A pointer to a buffer TX. * @param[in] p_rx_data A pointer to a buffer RX. * @param[in] len A length of the data buffers. */ static void spi_send_recv(uint8_t * const p_tx_data, uint8_t * const p_rx_data, const uint16_t len) { // Initalize buffers. init_buffers(p_tx_data, p_rx_data, len); // Start transfer. uint32_t err_code = spi_master_send_recv(SPI_MASTER_HW, p_tx_data, len, p_rx_data, len); APP_ERROR_CHECK(err_code); nrf_delay_ms(DELAY_MS); }
/**@brief Function for sending and receiving data. * * @param[in] spi_master_hw_instance SPI master instance. * @param[in] p_tx_data A pointer to a buffer TX. * @param[out] p_rx_data A pointer to a buffer RX. * @param[in] len A length of the data buffers. */ static void spi_send_recv(const spi_master_hw_instance_t spi_master_hw_instance, uint8_t * const p_tx_data, uint8_t * const p_rx_data, const uint16_t len) { // Initalize buffers. init_buf(p_tx_data, p_rx_data, len); // Start transfer. uint32_t err_code = spi_master_send_recv(spi_master_hw_instance, p_tx_data, len, p_rx_data, len); APP_ERROR_CHECK(err_code); }
static __INLINE uint32_t frame_send() { uint32_t err_code; m_current_tx_packet_length = compute_current_packet_length(m_tx_packet_length, m_accumulated_tx_packet_length); err_code = spi_master_send_recv(SER_PHY_SPI_MASTER, &mp_tx_buffer[m_accumulated_tx_packet_length], m_current_tx_packet_length, NULL, 0); m_accumulated_tx_packet_length += m_current_tx_packet_length; return err_code; }
static __INLINE uint32_t frame_get() { uint32_t err_code; m_current_rx_packet_length = compute_current_packet_length(m_rx_packet_length, m_accumulated_rx_packet_length); if (m_current_rx_packet_length < SER_PHY_SPI_5W_MTU_SIZE) { m_current_rx_packet_length++; //take into account guard byte when receiving } err_code = spi_master_send_recv(SER_PHY_SPI_MASTER, NULL, 0, m_recv_buffer, m_current_rx_packet_length); return err_code; }
static void send_single_packet() { uint16_t crc; uint32_t data_offset; // Include the length spim_com_tx_transaction.fields.len_lsb = (uint8_t)m_spim_com_tx_packet_length; spim_com_tx_transaction.fields.len_msb = (uint8_t)(m_spim_com_tx_packet_length >> 8); data_offset = (uint32_t)m_spim_com_tx_packet_fragment_num * SPI_COM_PCK_DATA_SIZE; if((m_spim_com_tx_packet_length - data_offset) > SPI_COM_PCK_DATA_SIZE) { memcpy(spim_com_tx_transaction.fields.data, m_spim_com_tx_packet + data_offset, SPI_COM_PCK_DATA_SIZE); } else { memcpy(spim_com_tx_transaction.fields.data, m_spim_com_tx_packet + data_offset, m_spim_com_tx_packet_length - data_offset); memset(spim_com_tx_transaction.fields.data + (m_spim_com_tx_packet_length - data_offset), 0, SPI_COM_PCK_DATA_SIZE - (m_spim_com_tx_packet_length - data_offset)); } // Calculate and include the CRC spim_com_tx_transaction.fields.crc_lsb = 0; spim_com_tx_transaction.fields.crc_msb = 0; crc = crc16_compute(spim_com_tx_transaction.data, SPI_COM_MAX_TRANSACTION_SIZE, 0); spim_com_tx_transaction.fields.crc_lsb = (uint8_t)crc; spim_com_tx_transaction.fields.crc_msb = (uint8_t)(crc >> 8); // Assert the RDY signal nrf_gpio_pin_clear(m_spim_com_pin_reqn); // Wait for the REQ line to be asserted by the slave while(nrf_gpio_pin_read(m_spim_com_pin_rdyn) != 0); // De-assert the RDY signal nrf_gpio_pin_set(m_spim_com_pin_reqn); m_spim_com_tx_packet_fragment_num++; spi_master_send_recv(SPI_MASTER_0, spim_com_tx_transaction.data, SPI_COM_MAX_TRANSACTION_SIZE, spim_com_rx_transaction.data, SPI_COM_MAX_TRANSACTION_SIZE); }
static __INLINE uint32_t header_get() { return spi_master_send_recv(SER_PHY_SPI_MASTER, NULL, 0, m_header_buffer, SER_PHY_HEADER_SIZE); }
static __INLINE uint32_t header_send(const uint16_t length) { uint8_t buf_len_size = uint16_encode(length, m_header_buffer); return spi_master_send_recv(SER_PHY_SPI_MASTER, m_header_buffer, buf_len_size, NULL, 0); }
static __INLINE uint32_t header_get() { return spi_master_send_recv(SER_PHY_SPI_MASTER, NULL, 0, m_len_buffer, SER_PHY_HEADER_SIZE + 1); //add 0 byte guard when receiving }