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

nrf52832 , SPI interface with LIS3DH

Hello,

TASK:----------------------------------------------------------------------------------------------------------------------------------

I'm trying to interface LIS3DH in SPI, and read the who_am_i register.

INFORMATION:----------------------------------------------------------------------------------------------------------------------

Im using the SDK nRF5_SDK_15.3.0_59ac345.

I copied the SPI program and edited the main program to the below code. In the sdk_config, i have changed the SPI related tags to 1.

Ex: #ifndef NRFX_SPIM_ENABLED
#define NRFX_SPIM_ENABLED 1
#endif

i have disabled the EASY_DMA for all three, as below

For detailed info, information refer the project.

spi (2).zip

The main file is as below. 

/**
 * Copyright (c) 2015 - 2019, 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"

#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[]={0x8F, 0x00}; /**< TX buffer. */
static uint8_t m_rx_buf[]={0x00, 0x00 }; /**< 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;
    NRF_LOG_INFO("Transfer completed.");
    if (m_rx_buf[0] != 0)
    {
        NRF_LOG_INFO(" Received:");
        NRF_LOG_HEXDUMP_INFO(m_rx_buf, strlen((const char *)m_rx_buf));
    }
}
int main(void)
{
    bsp_board_init(BSP_INIT_LEDS);

    APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
    NRF_LOG_DEFAULT_BACKENDS_INIT();

    NRF_LOG_INFO("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;
    spi_config.frequency= NRF_DRV_SPI_FREQ_125K;
    spi_config.bit_order = NRF_DRV_SPI_BIT_ORDER_MSB_FIRST;
    spi_config.mode      = NRF_DRV_SPI_MODE_0; 

    APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL));

    NRF_LOG_INFO("SPI example started.");
    NRF_LOG_FLUSH();

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

        bsp_board_led_invert(BSP_BOARD_LED_0);
        
        APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, m_tx_buf, 2, m_rx_buf, 2));
       
        while (!spi_xfer_done)
        {
            __WFE();
        }

        NRF_LOG_FLUSH();

        bsp_board_led_invert(BSP_BOARD_LED_0);
        nrf_delay_ms(1000);

    }
}

PROBLEM:---------------------------------------------------------------------------------------------------------------------------

The code compiles successfully with no error. When I debug, the control gets stuck in the highlighted function below.

, the NRFX_SPI_ENABLED is enabled in sdk_config, but it still appears grayed out, as below

 .

DEBUGGING:---------------------------------------------------------------------------------------------------------------------

Thus while debugging, i get the following pattern,

1. in main.c

2. nrf_drv_spi.c, the highlighted code gets executed.

3. as the nrfx_spi_xfer is grayed out as below,

The control shows result as 0 at step 2 and gets stuff at the while loop.

I'm not able to transfer or receive I suppose, as the control is not printing the transfer complete nrf log also. (i.e., the SPI event handler function is never executed)

Kindly help me resolve this

Parents
  • Hello,

    The fact that your nrfx_spi defines are grayed out indicated that they are not defined, and thus not visible to the preprocessor.
    Most likely, this is caused by having unused defines in your sdk_config file - I recommend that you do not set *_ENABLED to 0 in the SDK config, because this will still leave them as defined, even though they are set to 0.
    For more information about this, please see this and this ticket. In essence, leaving the *_ENABLED defined to 0 will still make the apply_old override the nrfx driver.

    So, could you try to comment out or remove the legacy spi *_ENABLED 0 defines from your sdk_config, and see if this resolves your issue?

    Best regards,
    Karl

Reply
  • Hello,

    The fact that your nrfx_spi defines are grayed out indicated that they are not defined, and thus not visible to the preprocessor.
    Most likely, this is caused by having unused defines in your sdk_config file - I recommend that you do not set *_ENABLED to 0 in the SDK config, because this will still leave them as defined, even though they are set to 0.
    For more information about this, please see this and this ticket. In essence, leaving the *_ENABLED defined to 0 will still make the apply_old override the nrfx driver.

    So, could you try to comment out or remove the legacy spi *_ENABLED 0 defines from your sdk_config, and see if this resolves your issue?

    Best regards,
    Karl

Children
  • Thank you, the greyed out area problem is resolved. But the spi_event handler doesnt execute.

    Debugging flow

    1. nrf_drv_spi_transfer function call

    2. from nrf_drv_spi_transfer , nrfx_spi_xfer is called from 

    3. from nrfx_spi_xfer, the spi_xfer is called

    4 nrf_spi_int_enable is called from  the spi_xfer 

    And they start reverting the function values back,(backtrack the above path.) and finally return 0.

  • Hello,

    Nats said:
    Thank you, the greyed out area problem is resolved.

    I am happy to hear that issue is resolved.

    Could you configure DEBUG is SES, so that you may see any errors that are called?
    I suspect that the 0 you are seeing being returned is in fact the NRF_SUCCESS, indicating your call to spi_transfer was successful.
     

    Furthermore, what are you seeing on your sensor side of things - does the sensor indicate in any way that communication is happening ( such as a LED blinking ) ?
    What is the output of your logs when your code is running?
    I would recommend that you base your project upon the nrfx_spim example, rather than the spi_master example, since it makes use of the newest nrfx drivers rather than the legacy nrf_drv driver.

    Best regards,
    Karl

  • Dear Karl,

    There is no indication on the Sensor module. And i have used SES in debug mode.

    The Nrfx_spim example is for PCA10056 only and not PCA10040. Even if i implement on this, as soon as i goto debug mode, it shows system handler error.

  • Hello,

    Nats said:
    And i have used SES in debug mode.

    Great! Could you confirm for me that the "DEBUG" is included in the "Preprocessor definitions"?
    It is not enough to just select "debug" instead of "release" configuration.
    If DEBUG is defined in SES then you should be able to see where an error was generated.

    Nats said:
    The Nrfx_spim example is for PCA10056 only and not PCA10040.

    You have nRF52832 in the title of your ticket, and you have tagged the ticket with nRF52 DK.
    Do I understand you correctly that you have now changed your development kit to an nRF52840 DK?

    Nats said:
    Even if i implement on this, as soon as i goto debug mode, it shows system handler error.

    Can you tell me more about this behavior? What error is generated, and where is it generated?
    If you have SES in debug mode then it should be visible as soon as the error handler is called.

    Best regards,
    Karl

Related