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

Basic SPI reads and writes

Hi,

I have a SPI peripheral connected to the nRF960 DK. In order to access this correctly, I need to be able to write a byte to a specific address first and then read back from specific addresses. 

I can run the basic SPI example

https://github.com/Rallare/fw-nrfconnect-nrf/tree/nrf9160_samples/samples/nrf9160/spi

which carries out a basic loop back. This all works fine but I can't see how to write a specific byte to a specific address or read a specific address.

So, ideally I would like to write 0xD2 to address 0x80, wait 1 second and then read data from address 0x00.

Can you point me to a simple example please?

Ta,
Rod

Parents
  • Hello Rod, 

    The SPI example you are using is the only one we have at the moment. The example is using the built-in SPI functions of the Zephyr project, perhaps you are able to find what you are looking for in the Zephyr samples? Also, have a look at the Zephyr SPI API and the SPI header file.

    Ref. similar answer given by my colleague Jan Tore here

    Kind regards,
    Øyvind

  • Hi Øyvind,

    I went back to the reply from Jan Tore on the ticket here. I realised that the BME280 has both an I2C and an SPI interface. So, I thought if I can get this sensor working over SPI and I can then try and migrate it to my own SPI sensor.

    I have successfully connected and ran the BME280 sensor over I2C. I am now trying to access this over SPI. 

    Im using the sample given here, 

    https://github.com/zephyrproject-rtos/zephyr/blob/master/samples/sensor/bme280/src/main.c

    I have set up SPI in my overlay file as suggested by Jan in the other ticket.

    /*
     *
     * Copyright (c) 2018 Linaro Limited
     *
     * SPDX-License-Identifier: Apache-2.0
     */
    
    
    &i2c2 {
            status = "ok";
            sda-pin = <1>;
            scl-pin = <0>;
            clock-frequency = <I2C_BITRATE_FAST>;
            };
    
    &spi3 {
            status = "ok";
    	sck-pin = <10>;
    	mosi-pin = <11>;
    	miso-pin = <12>;
    	ss-pin = <13>;
    	spi-max-frequency = <8000000>;
    	bme280@0 {
    		compatible = "bosch,bme280";
    		reg = <0>;
    		spi-max-frequency = <8000000>;
    		label = "BME280";
    	};
    
    };
    

    and also I have enabled SPI in my conf file

    CONFIG_CONSOLE_SUBSYS=y
    CONFIG_CONSOLE_GETCHAR=y
    CONFIG_GPIO=y
    CONFIG_STDOUT_CONSOLE=y
    
    CONFIG_SERIAL=y
    CONFIG_STDOUT_CONSOLE=y
    CONFIG_UART_INTERRUPT_DRIVEN=y
    CONFIG_TEST_RANDOM_GENERATOR=y
    
    CONFIG_I2C=y
    CONFIG_SENSOR=y
    
    CONFIG_NET_BUF_USER_DATA_SIZE=1
    
    CONFIG_LOG=n
    CONFIG_LOG_DEFAULT_LEVEL=4
    CONFIG_HEAP_MEM_POOL_SIZE=1024
    CONFIG_MAIN_STACK_SIZE=4096
    CONFIG_NEWLIB_LIBC=y
    
    # SPI
    CONFIG_SPI=y
    CONFIG_SPI_3=y
    CONFIG_SPI_3_NRF_SPIM=y
    CONFIG_BME280=y
    CONFIG_SPI_NRFX=y

    However, I get an error

    Secure Boot: MSP_NS 200216b0

    Secure Boot: prepare to jump to Non-Secure image

    ***** Booting Zephyr OS v1.13.99-ncs1-5561-gde69d2df908f *****

    Exception occurred in Secure State

    ***** HARD FAULT *****

      Fault escalation (see below)

    ***** BUS FAULT *****

      Precise data bus error

      BFAR Address: 0x50008120

    ***** Hardware exception *****

    Current thread ID = 0x20020154

    Faulting instruction address = 0x41f98

    Fatal fault in ISR! Spinning...

    Any thoughts?

  • Hi Øyvind,

    I have enabled debug and I see this error .

    Secure Boot: MSP_NS 20021a58

    Secure Boot: prepare to jump to Non-Secure image

    ***** Booting Zephyr OS v1.13.99-ncs1-5561-gde69d2df908f *****

    [00:00:00.000,061] <inf> spi_nrfx_spim: CS control inhibited (no GPIO device)

    Exception occurred in Secure State

    ***** HARD FAULT *****

      Fault escalation (see below)

    ***** BUS FAULT *****

      Precise data bus error

      BFAR Address: 0x50008120

    ***** Hardware exception *****

    Current thread ID = 0x200201f8

    Faulting instruction address = 0x41fa6

    Fatal fault in ISR! Spinning...

    I have googled "CS control inhibited (no GPIO device)" but didn't see anything obvious, any ideas?

    Rod

  • Hi Rod, 

    I am not able to reproduce the Hard Fault you are seeing. Using the SPI example, and latest update with west, I was able to run it with your overlay config and proj.conf, but setting

    CONFIG_BME280=n

    There seems to be an issue with the BME280 driver provided by Zephyr and I suggest contacting the Zephyr forum for more assistance on how to configure this driver for SPI. We expect the issue is with how the BME280 is configured in the overlay file, as it seems to how you configure for SPI.  

    Maybe can be of more assistance?

    Kind regards,
    Øyvind

  • Hi Øyvind,

    Ok, I have put the BME280 code to the side for the minute and am just trying to get SPI to work with my own device, a MAX31865. I am basing my code on code that was supplied by Jeff Seaman on this thread.

    https://devzone.nordicsemi.com/f/nordic-q-a/42736/problems-with-spi-on-nrf9160-and-zephyr/182841#182841

    In this code, Jeff sets up the CS pin using

    cs_control.gpio_dev = gpio_dev;
    cs_control.gpio_pin = 22;

    I have added this and this seems to have fixed my 

    [00:00:00.000,061] <inf> spi_nrfx_spim: CS control inhibited (no GPIO device)

    problem. I am still playing around with this. Once I have the code tidied up, I will let you know if I have made any progress,

    Regards,

    Rod

  • Hi Rod,

    I tried to reproduce the issues you're seing locally with the BME280 sample, but didn't see the error. I used the overlay and prj.conf that you pasted earlier in the thread. The prj.conf contains a bit of unnecessary configurations for this sample, but I can't see anything that should cause these issues. This hardfault type is typically seen when attempting to use uninitialized memory from non-secure, such as dereferecing a pointer, that points to an address within the secure address space.

    To help more, I'd need to know which commit SHA on the -nrf repo you're working on. I assume you have checked out the -nrf repository, then run west update, before moving to <ncs folder>/zephyr/samples/sensor/bme280.

    The CS message is caused by the chip select pin not being set in your ovarlay file. If you have a chip select for the chip, you can add this line to the overlay:

    &spi3 {
        ...
        cs-gpios = <&gpio0 CS-pin-number 0>;
        
        bme280@0 {
        ...
    };

    Regards,

    Jan Tore

  • Hi Jan,

    Thanks for your reply. I will add the cs-gpios... code as above in my overlay file and see if that helps.

    I have updated my code base using the following 

    cd ncs/nrf
    git checkout c1939d963fe2c18013ffb8de0bd8f6fc1d91724d
    git checkout -b <choose_branch_name>
    west update 

    Previously, Øyvind suggested I replace the secure boot code with the new SPM. You will see above that I have tried to install and build this but I keep getting errors. 

    Could you have a look at the errors above please and let me know if you see what Im doing wrong

    Thanks,

    Rod

Reply
  • Hi Jan,

    Thanks for your reply. I will add the cs-gpios... code as above in my overlay file and see if that helps.

    I have updated my code base using the following 

    cd ncs/nrf
    git checkout c1939d963fe2c18013ffb8de0bd8f6fc1d91724d
    git checkout -b <choose_branch_name>
    west update 

    Previously, Øyvind suggested I replace the secure boot code with the new SPM. You will see above that I have tried to install and build this but I keep getting errors. 

    Could you have a look at the errors above please and let me know if you see what Im doing wrong

    Thanks,

    Rod

Children
  • Hi Rod,

    If you are on the latest NCS master ("git fetch ncs" and checkout ncs/master or rebase your branch on top of it, then "west update"), SPM will automatically be included when you compile for nrf9160_pca10090ns. It will be compiled and merged with your application, so that when you run "west flash" to program the DK, both SPM and application are programmed together. You don't need to compile and program secure_boot/SPM separately. By default SPI3 instance is then set as non-secure and you should be good to go.

    Let us know how it goes.

    Regards,

    Jan Tore

  • Hi Jan,

    So just to clarify the update process, (sorry for this, I just want to check I'm not missing any steps.)

    cd ncs
    git fetch ncs
    west update 

    I am then building my application and flashing as follows

    cmake -GNinja -DBOARD=nrf9160_pca10090ns ..
    ninja flash

    Regards,

    Rod

  • Hi Jan,

    Just wanted to nudge you on this again :-) I have now written a simple SPI program which I wish to test. When I run this, I am reading zeros back. However, I am still using "secure_boot" and have not yet migrated to "spm". I am hoping that a move to SPM will help.

    Please can you clarify the steps to build my test program, with SPM merged and flash my board. Is it as simple as the code below?

    west build -b nrf9160_pca10090ns -d build
    west flash -d build

    Thanks,
    Rod 

  • Hi Rod, 

    Please can you clarify the steps to build my test program, with SPM merged and flash my board. Is it as simple as the code below?

    Using the latest version of NCS, (v0.4.0), just remember to set zephyr environment first. After that, you should be able to run these commands and program your board.
    Edit: See more information here.

    Kind regards, 
    Øyvind

     

      

  • Hi Øyvind,

    Sorry, I just want to check I her the latest tools. Im running everyone from a command line 

    So, to update to the latest version of NCS, is it just this....

    cd ncs
    git fetch ncs
    west update 

    You say I need to set the zephyr environment first, is this necessary? This should be set already?

    Rod

Related