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

Failed to read/write ADXL362 data using nRF52840

Hello All,

I have connected nRF52840 with ADXL362 over SPI, and try to read/write data on "Power Control register".

The process I follow,

1. Rest ADXL362.

2. Write data 0x02 in "Power Control register" of ADXL362.

2. Read value of  "Power Control register" of ADXL362.

But every time I read data form ADXL362 I got 0x00 value.

Logs are attached.

For testing this I have modify SPI test code located at "nRF5_SDK_15.0.0_a53641a\examples\peripheral\spi"

Code is also attached here, will you please guide me, If I did any wrong in SPI configuration?

I am little bit confuse of "tx_buffer_length" & "rx_buffer_length" value passing in nrf_drv_spi_transfer() function.

Does the values of "tx_buffer_length" & "rx_buffer_length" are correct at line no 101 & 118 in main.c file?

Thanks in advance.

<info> app: #########################################################
<info> app: SPI example started.
<info> SPIM: Function: nrfx_spim_init, error code: NRF_SUCCESS.
<info> app: <---- ADXL325 reset ---->
<info> SPIM: Function: spim_xfer, error code: NRF_SUCCESS.
<debug> SPIM: Event: NRF_SPIM_EVENT_END.
<info> app: Transfer completed.
<info> app:  00 00 00               |...     
<info> app: soft reset
<info> app: <--- ADXL325 set power control register --->
<info> SPIM: Function: spim_xfer, error code: NRF_SUCCESS.
<info> app: ** 0 0 0
<info> app:  00 00                  |..      
<info> app: Setting Measeurement Mode - Reg 2D before = 0
<debug> SPIM: Event: NRF_SPIM_EVENT_END.
<info> app: Transfer completed.
<info> app:  00 00 00               |...     
<info> SPIM: Function: spim_xfer, error code: NRF_SUCCESS.
<debug> SPIM: Event: NRF_SPIM_EVENT_END.
<info> app: Transfer completed.
<info> app:  00 00 00               |...     
<info> app: -----------
<info> SPIM: Function: spim_xfer, error code: NRF_SUCCESS.
<info> app: ** 0 0 0
<info> app:  00 00                  |..      
<info> app: , Reg 2D after = 0
<debug> SPIM: Event: NRF_SPIM_EVENT_END.
<info> app: Transfer completed.
<info> app:  00 00 00               |...     
/**
 * Copyright (c) 2015 - 2018, 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[] = 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. */

uint8_t tx[3] = { 0x0B, 0x00, 0x00 };
uint8_t rx[3] = { 0 };


/**
 * @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.");
    //NRF_LOG_INFO("%d.", p_event->type);
    //NRF_LOG_INFO("%d %d %s", p_event->data.done.rx_length, p_event->data.done.tx_length, p_event->data.done.p_tx_buffer);
//    if (m_rx_buf[0] != 0)
    if (rx[0] != 0)
    {
        NRF_LOG_INFO(" Received:");
        NRF_LOG_HEXDUMP_INFO(m_rx_buf, strlen((const char *)m_rx_buf));
    }
   NRF_LOG_HEXDUMP_INFO(rx, 3);
}


#define XL362_REG_WRITE          0x0a
#define XL362_REG_READ           0x0b
#define XL362_POWER_CTL          0x2d
#define XL362_SOFT_RESET         0x1f
#define XL362_SOFT_RESET_KEY     0x52

uint8_t adxl362_read_one_reg(uint8_t reg_address)
{
  uint8_t tx_buff[3] = {0};
  uint8_t rx_buff[3] = {0};

  // </CS down> <command byte (0x0A or 0x0B)> <address byte> <data byte> <additional data bytes for multi-byte> � </CS up>
  tx_buff[0] = XL362_REG_READ;
  tx_buff[1] = reg_address;
  tx_buff[2] = 0x00;            // dummy byte

   APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, tx_buff, 3, rx_buff, 1));
   NRF_LOG_INFO("** %d %d %d", rx[0], rx[1], rx[2]);
   NRF_LOG_HEXDUMP_INFO(rx, 2);

   return rx_buff[2];
}

void adxl362_write_one_reg(uint8_t reg_address, uint8_t reg_value)
{
  uint8_t tx_buff[3] = {0};
  uint8_t rx_buff[3] = {0};

  // </CS down> <command byte (0x0A or 0x0B)> <address byte> <data byte> <additional data bytes for multi-byte> � </CS up>
  tx_buff[0] = XL362_REG_WRITE;
  tx_buff[1] = reg_address;
  tx_buff[2] = reg_value;

   APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, tx_buff, 3, rx_buff, 3));
//   NRF_LOG_INFO("** %d %d %d", rx[0], rx[1], rx[2]);
//   NRF_LOG_HEXDUMP_INFO(rx, 2);
}

void adxl362_reset()
{
  // soft reset
  adxl362_write_one_reg(XL362_SOFT_RESET, XL362_SOFT_RESET_KEY);

  // Note: A latency of approximately 0.5 ms is required after soft reset.
  nrf_delay_ms(200);
  NRF_LOG_INFO("soft reset");
}

void beginMeasure()
{
  uint8_t reg_val = 0x0;
  // read Reg 2D before modifying for measure mode
  reg_val = adxl362_read_one_reg(XL362_POWER_CTL);
  
  NRF_LOG_INFO("Setting Measeurement Mode - Reg 2D before = %d", reg_val);

  // turn on measurement mode
  uint8_t temp_write = (reg_val | 0x02);  // turn on measurement bit in Reg 2D

  adxl362_write_one_reg(XL362_POWER_CTL, temp_write);

  nrf_delay_ms(10);
  //nrf_delay_ms(200);

  NRF_LOG_INFO("-----------");
  // read Reg 2D before modifying for measure mode
  reg_val = adxl362_read_one_reg(XL362_POWER_CTL);
  NRF_LOG_INFO(", Reg 2D after = %d", reg_val);
}

int main(void)
{
    bsp_board_init(BSP_INIT_LEDS);

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

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

    nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
#if 1
    spi_config.ss_pin   = NRF_GPIO_PIN_MAP(0,17);       //17
    spi_config.miso_pin = NRF_GPIO_PIN_MAP(0,23);       //23
    spi_config.mosi_pin = NRF_GPIO_PIN_MAP(0,21);       //21
    spi_config.sck_pin  = NRF_GPIO_PIN_MAP(0,19);       //19
#else
    spi_config.ss_pin   = SPI_SS_PIN;
    spi_config.miso_pin = SPI_MOSI_PIN;
    spi_config.mosi_pin = SPI_MISO_PIN;
    spi_config.sck_pin  = SPI_SCK_PIN;
#endif

    spi_config.frequency = NRF_SPIM_FREQ_1M;
//    spi_config.bit_order    = NRF_DRV_SPI_BIT_ORDER_LSB_FIRST;
//    spi_config.irq_priority = NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY;
//    spi_config.mode = NRF_SPIM_MODE_3;
     
     ret_code_t ret = nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL);
     if(ret != NRF_SUCCESS)
        NRF_LOG_INFO("SPI init failed:  %d", ret);
    //APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, NULL, NULL));

    NRF_LOG_INFO("<---- ADXL325 reset ---->");
    adxl362_reset();

    NRF_LOG_INFO("<--- ADXL325 set power control register --->");
    beginMeasure();

    while (1)
    {
#if 0
        // 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, tx, 3, rx, 3));
          nrf_drv_spi_transfer(&spi, tx, 3, rx, 1);
   
        NRF_LOG_INFO("SPI tx: %d", ret);

        NRF_LOG_INFO("** %d %d %d", rx[0], rx[1], rx[2]);
//        NRF_LOG_HEXDUMP_INFO(rx, 2);
 
        // read Reg 2D before modifying for measure mode
      uint8_t  reg_val = adxl362_read_one_reg(XL362_POWER_CTL);
      NRF_LOG_INFO(", Reg 2D after = %d", reg_val);
#endif
        while (!spi_xfer_done)
        {
            __WFE();
        }

        NRF_LOG_FLUSH();

//        bsp_board_led_invert(BSP_BOARD_LED_0);
        nrf_delay_ms(200);
    }
}
sdk_config.h

Parents
  • I recently had the same problem with the ADXL362 on an nRF52832DK board. I connected the ADXL362 (on a developer board "ADXL362/346") with a short cable (about 5 cm).

    After many attempts in all possible directions (clock, source code, waveform, resistances in signal lines), I found a solution:

    I removed the cables and soldered a pin strip directly to the "ADXL362/346" developer board (without VIN, this is connected to VDD on P1 by cable) and plugged it directly into P4 (pin 0.19 to GND). Since this is plugged in directly, the ADXL362 works without any problems.

    I don't find that plausible, but I was able to continue my project with it.

    I'm not sure if it will help others, but it's worth a try.

    And it would be nice to hear if this has helped others as well.

    Best regards

    Marko

Reply
  • I recently had the same problem with the ADXL362 on an nRF52832DK board. I connected the ADXL362 (on a developer board "ADXL362/346") with a short cable (about 5 cm).

    After many attempts in all possible directions (clock, source code, waveform, resistances in signal lines), I found a solution:

    I removed the cables and soldered a pin strip directly to the "ADXL362/346" developer board (without VIN, this is connected to VDD on P1 by cable) and plugged it directly into P4 (pin 0.19 to GND). Since this is plugged in directly, the ADXL362 works without any problems.

    I don't find that plausible, but I was able to continue my project with it.

    I'm not sure if it will help others, but it's worth a try.

    And it would be nice to hear if this has helped others as well.

    Best regards

    Marko

Children
No Data
Related