This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

SPI master doesn't call spi_event_handler when transferred.

Hi!

I made same code for SDK15 and it works. Now I want to rebuild project on the new SDK17.0.2 and same part of code doesn't work with SPI master.

For notice- doesn't work native example 

...examples\peripheral\spi\

And I made on the my project all settings like it was on SDK15 and can't call interrupt spi_event_handler.

my settings:

#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. */

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));
    }
}

static __INLINE uint8_t lis3dh_spi_read_write(const uint8_t reg, const uint8_t data)
{
//	uint8_t rx_buffer[2], tx_buffer[] = { reg, data };
    m_tx_buf [0] = reg;
    m_tx_buf [1] = data;
    
    spi_xfer_done = false;
    
    APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, m_tx_buf, m_length, m_rx_buf, m_length));
    
    while (!spi_xfer_done)
    {
        __WFE();
    }
	return m_rx_buf[1];
}

uint8_t lis3dh_read(const uint8_t reg) 
{		
	return lis3dh_spi_read_write(reg | LIS3DH_READ_MSK, 0xAA);	
}

void lis3dh_write(const uint8_t reg, const uint8_t data) 
{
	lis3dh_spi_read_write(reg | LIS3DH_WRITE_MSK, data);	
}
    
void lis3dh_init(void)
{
    nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
    spi_config.ss_pin   = 7;
    spi_config.miso_pin = 8;
    spi_config.mosi_pin = 9;
    spi_config.sck_pin  = 10;

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

	lis3dh_write(CTRL_REG1, 0x2F); 		
}

What I make wrong?

  • I figured out that my code works only with pins number from example. If I changed pins to another, doesn't work.

    But I can't understand where new pins already defined? 

  • Ok, I've tested a little and sck_pin = 9/10 doesn't work, not even on 15.0.0 or any other version that I tested.

    This let's the spi_event_handler be called, but has other issues:

        spi_config.ss_pin   = 10;
        spi_config.miso_pin = 9;
        spi_config.mosi_pin = 8;
        spi_config.sck_pin  = 7;

    P0.09 and P0.10 are used for NFC(in that documentation page, pin 11 == P0.09, pin 12 == P0.10), and if you want to use them for GPIO, you will have to cut R25 and R26, and short R27 and R28.

  • Hi!

    I made a picture:

    where you can observe SDK15.0.2

    and pins 7, 8, 9, 10

    and I used board 10040 and got a break point.

    Can you reproduce it on the native example of SDK15.0.2?

    I leaved a file with it. just replace native file to my.

    /**
     * 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. */
    
    
    
    
    #define CTRL_REG1		0x20
    #define CTRL_REG2		0x21
    #define CTRL_REG3		0x22
    #define CTRL_REG4		0x23
    #define CTRL_REG5		0x24
    #define CTRL_REG6		0x25
    #define INT1_CFG		0x30
    #define INT1_SRC		0x31
    #define INT1_THS		0x32
    #define INT1_DUR		0x33
    
    #define LIS3DH_READ_MSK	128
    #define LIS3DH_WRITE_MSK  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.");
        if (m_rx_buf[0] != 0)
        {
            NRF_LOG_INFO(" Received:");
            NRF_LOG_HEXDUMP_INFO(m_rx_buf, strlen((const char *)m_rx_buf));
        }
    }
    
    static __INLINE uint8_t lis3dh_spi_read_write(const uint8_t reg, const uint8_t data)
    {
    //	uint8_t rx_buffer[2], tx_buffer[] = { reg, data };
        m_tx_buf [0] = reg;
        m_tx_buf [1] = data;
        
        spi_xfer_done = false;
        
        APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, m_tx_buf, m_length, m_rx_buf, m_length));
        
        while (!spi_xfer_done)
        {
            __WFE();
        }
    	return m_rx_buf[1];
    }
    
    uint8_t lis3dh_read(const uint8_t reg) 
    {		
    	return lis3dh_spi_read_write(reg | LIS3DH_READ_MSK, 0xAA);	
    }
    
    void lis3dh_write(const uint8_t reg, const uint8_t data) 
    {
    	lis3dh_spi_read_write(reg | LIS3DH_WRITE_MSK, data);	
    }
    
    
    
    
    int main(void)
    {
        bsp_board_init(BSP_INIT_LEDS);
    
        APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
        NRF_LOG_DEFAULT_BACKENDS_INIT();
    
        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.ss_pin   = 10;
        spi_config.miso_pin = 9;
        spi_config.mosi_pin = 8;
        spi_config.sck_pin  = 7;
        
        APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL));
    
        NRF_LOG_INFO("SPI example started.");
    
            
        
        lis3dh_write(CTRL_REG1, 0x2F); 			// low power mode, 10Hz
    //	lis3dh_write(CTRL_REG2, 0x01); 			// high pass filter enabled for AOI1
    //	lis3dh_write(CTRL_REG3, 0x40); 			// AOI1 interrupt on INT1
    //	lis3dh_write(CTRL_REG4, 0x80); 			// BDU, full scale = +-2g
    //	lis3dh_write(CTRL_REG5, 0x00); 			
    //	lis3dh_write(INT1_CFG, 	0x15);			// X Or Y Or Z low events	
        
        if (lis3dh_read(CTRL_REG1) != 0x2F)
        {
            int a = 10; // �������� ��� ���������� �� 5 ���, ���� ������ ������ SPI
            a++;
        }
        nrf_drv_spi_uninit(&spi); // ��������������� SPI
        
        
        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));
    
    //        while (!spi_xfer_done)
    //        {
    //            __WFE();
    //        }
    
    //        NRF_LOG_FLUSH();
    
    //        bsp_board_led_invert(BSP_BOARD_LED_0);
    //        nrf_delay_ms(200);
        }
    }
    

  • Yes, that code will call the spi_event_handler in 15.2.0, and in 17.0.2 also.

    But that does not mean that the SPI works. P0.09 and P0.10 can only be used as GPIO if you cut R25 and R26, and short R27 and R28. Otherwise they are NFC pins, not GPIO. You can of course use different pins instead.

  • Very strange I got break in the SDK15 and don't in the SDK 17.

    these pins are correct to assign without any R25 R26 R27 modifications?

     

    #define MOSI_PIN 13
    #define SCK_PIN 14
    #define SS_PIN 15

Related