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 Reply Children
  • Hi Paul,

    I have not looked at this for a while so I can't say 100% that this code is correct, but I have shared it anyway. Let me know if it works and if not, I will do a bit more digging my end.

    &spi3 {
            status = "ok";
    	sck-pin = <10>;
    	mosi-pin = <11>;
    	miso-pin = <12>;
    	ss-pin = <13>;
    	spi-max-frequency = <4000000>;
    	bme280@76 {
    		compatible = "bosch,bme280";
    		reg = <0x76>;
    		spi-max-frequency = <4000000>;
    		label = "BME280";
    	};
    
    };
    

    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_SENSOR=y
    
    CONFIG_NET_BUF_USER_DATA_SIZE=1
    
    CONFIG_LOG=y
    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
    CONFIG_SENSOR_LOG_LEVEL_WRN=y
    
    CONFIG_TRUSTED_EXECUTION_NONSECURE=y
    
    
    

    #include <zephyr.h>
    #include <device.h>
    #include <sensor.h>
    #include <stdio.h>
    
    #undef DT_BOSCH_BME280_BUS_I2C
    #define DT_BOSCH_BME280_BUS_SPI
    
    void main(void)
    {
    
    int i;
    	printf("Boiler Guardian Test Code - BME280 over SPI \n");
    	printf(" \n");
    
    	struct device *dev = device_get_binding("BME280");
    
    	printf("dev %p name %s\n", dev, dev->config->name);
    
    	printf("Boiler Guardian Test Code - BME280 - got binding  \n");
    	printf(" \n");
    
    	for(i = 1; i < 2; i++) {
    		struct sensor_value temp, press, humidity;
    
    		sensor_sample_fetch(dev);
    		sensor_channel_get(dev, SENSOR_CHAN_AMBIENT_TEMP, &temp);
    		sensor_channel_get(dev, SENSOR_CHAN_PRESS, &press);
    		sensor_channel_get(dev, SENSOR_CHAN_HUMIDITY, &humidity);
    
    
    		printf("Environmental Temperature: %d.%d Degrees Cent. \n", temp.val1, temp.val2);
    		printf("Environmental Pressure: %d.%02d Bar \n", press.val1, press.val2);
    		printf("Environmental Humidity: %d.%02d per/cent \n", humidity.val1, humidity.val2);
    
    
    	}
    }
    

  • Many thanks Rod.

    Things have moved on a lot but this was very helpful in getting me unstuck.

    With a bit of help from Simon this is now sorted out.

    devzone.nordicsemi.com/.../290233

    Regards, Paul

Related