This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

SPI Tx & Rx failure

Hi DevZone, 

I am doing my project base on SDK 14.2.0 example spi. I modified the PIN according to Arduino PIN map and connected the nRF52480 Preview DK with Arduino Uno. When I run spi example program, Arduino board does receive the data over SPI. However, when I add my own code, Arduino board cannot receive the data. I think I must incorrectly use the API nrf_drf_spi_transfer(), but I could not find the mistakes...  

Example Code:

APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, m_tx_buf, m_length, m_rx_buf, m_length));

My Code:

uint8_t tx_data = 5;
uint8_t dummy_receive;
APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, &tx_data, 1, &dummy_receive, 1));

Attached file is the main.c file... Could you please tell me what is the problem? 

/**
 * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA
 * 
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright notice, this
 *    list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form, except as embedded into a Nordic
 *    Semiconductor ASA integrated circuit in a product or a software update for
 *    such product, must reproduce the above copyright notice, this list of
 *    conditions and the following disclaimer in the documentation and/or other
 *    materials provided with the distribution.
 * 
 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
 *    contributors may be used to endorse or promote products derived from this
 *    software without specific prior written permission.
 * 
 * 4. This software, with or without modification, must only be used with a
 *    Nordic Semiconductor ASA integrated circuit.
 * 
 * 5. Any software provided in binary form under this license must not be reverse
 *    engineered, decompiled, modified and/or disassembled.
 * 
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 */
#include "nrf_drv_spi.h"
#include "app_util_platform.h"
#include "nrf_gpio.h"
#include "nrf_delay.h"
#include "boards.h"
#include "app_error.h"
#include <string.h>
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
#include "SEGGER_RTT.h"

#define SPI_INSTANCE  0 /**< SPI instance index. */
static const nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE(SPI_INSTANCE);  /**< SPI instance. */
static volatile bool spi_xfer_done;  /**< Flag used to indicate that SPI instance completed the transfer. */

#define TEST_STRING "Nordic"
static uint8_t       m_tx_buf[] = TEST_STRING;           /**< TX buffer. */
static uint8_t       m_rx_buf[sizeof(TEST_STRING) + 1];    /**< RX buffer. */
static const uint8_t m_length = sizeof(m_tx_buf);        /**< Transfer length. */

/**
 * @brief SPI user event handler.
 * @param event
 */
void spi_event_handler(nrf_drv_spi_evt_t const * p_event,
                       void *                    p_context)
{
    spi_xfer_done = true;
    SEGGER_RTT_printf(0, "Transfer completed.");
    if (m_rx_buf[0] != 0)
    {
        SEGGER_RTT_printf(0, " Received:");
        NRF_LOG_HEXDUMP_INFO(m_rx_buf, strlen((const char *)m_rx_buf));
    }
}

int main(void)
{
    bsp_board_leds_init();

    APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
    NRF_LOG_DEFAULT_BACKENDS_INIT();
    
    SEGGER_RTT_printf(0, "SPI example.");

    nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
    spi_config.ss_pin   = SPI_SS_PIN;     
    spi_config.miso_pin = SPI_MISO_PIN;
    spi_config.mosi_pin = SPI_MOSI_PIN;
    spi_config.sck_pin  = SPI_SCK_PIN;
    APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL));

    while (1)
    {
        // Reset rx buffer and transfer done flag
        memset(m_rx_buf, 0, m_length);
        spi_xfer_done = false;

        //APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, m_tx_buf, m_length, m_rx_buf, m_length));
        
        uint8_t tx_data = 5;
        uint8_t dummy_receive;
        APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, &tx_data, 1, &dummy_receive, 1));


        while (!spi_xfer_done)
        {
            __WFE();
        }

        NRF_LOG_FLUSH();

        bsp_board_led_invert(BSP_BOARD_LED_0);
        nrf_delay_ms(1000);
    }
}

Parents
  • Hi,

    I treied your code and can see data being output on MOSI line. How are you seeing that the Arduino does not receiving the data? Have you checked the SPI bus lines using a logic analyzer, to see if anything is sendt?

    Note this errata if you are using Eng A revision of nRF52840, with a single byte being sendt using SPI (with EasyDMA enabled).

    I modified the PIN according to Arduino PIN

    Which pins did you use?

    Best regards,
    Jørgen

  • I tested with P1.12-P1.15 pins as well and I'm still seeing data being transmitted. Have you tried sending more bytes? What does the Arduino SPI slave expect? Will it print logs on any data received? Do you have a link to the code of the Arduino example? I would really recommend getting a logic analyzer for debugging issues like this.

  • I am using nRF52480 Preview Development Kit. When I send more than one bytes, for example:

    uint8_t tx_data[] = {5,1};
    uint8_t dummy_receive[] = {0,0};
    APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, tx_data, 2, dummy_receive, 2));

    I still could not see the log in Arduino side.

    Below is arduino code I am used. The original code can be find in the link: https://arduino.stackexchange.com/questions/16348/how-do-you-use-spi-on-an-arduino


    // what to do with incoming data
    volatile byte command = 0; void setup (void) { Serial.begin(9600); // have to send on master in, *slave out* pinMode(MISO, OUTPUT); // turn on SPI in slave mode SPCR |= _BV(SPE); // turn on interrupts SPCR |= _BV(SPIE); } // end of setup // SPI interrupt routine ISR (SPI_STC_vect) { byte c = SPDR; if (command==1)
    SPDR = c -5;
    Serial.print("rx:);
    Serial.println(c, Hex);
    break; } // end of interrupt service routine (ISR) SPI_STC_vect void loop (void) { // if SPI not active, clear current command if (digitalRead (SS) == HIGH) command = 0;
    else command = 1; } // end of loop
Reply
  • I am using nRF52480 Preview Development Kit. When I send more than one bytes, for example:

    uint8_t tx_data[] = {5,1};
    uint8_t dummy_receive[] = {0,0};
    APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, tx_data, 2, dummy_receive, 2));

    I still could not see the log in Arduino side.

    Below is arduino code I am used. The original code can be find in the link: https://arduino.stackexchange.com/questions/16348/how-do-you-use-spi-on-an-arduino


    // what to do with incoming data
    volatile byte command = 0; void setup (void) { Serial.begin(9600); // have to send on master in, *slave out* pinMode(MISO, OUTPUT); // turn on SPI in slave mode SPCR |= _BV(SPE); // turn on interrupts SPCR |= _BV(SPIE); } // end of setup // SPI interrupt routine ISR (SPI_STC_vect) { byte c = SPDR; if (command==1)
    SPDR = c -5;
    Serial.print("rx:);
    Serial.println(c, Hex);
    break; } // end of interrupt service routine (ISR) SPI_STC_vect void loop (void) { // if SPI not active, clear current command if (digitalRead (SS) == HIGH) command = 0;
    else command = 1; } // end of loop
Children
No Data
Related