w25q16jv interfacing with nRF 52833 board

I am trying to interface winbond flash with the 33 board using ncs and VS code , I am able to get the code to compile and not receiving any errors , it is working and no matter what i send i am getting FF as a response

I have referred to Case ID: 261312

But As mentioned in the first link provided to change the .dts file . I cannot put in any pin configurations , if i do it is showing me a assert error for not having pin control in it , even when i try changing the pin numbers in the .overlay file I am getting the same issues . 

/*
* Copyright (c) 2012-2014 Wind River Systems, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/

#include <zephyr.h>
#include <sys/printk.h>
#include <device.h>
#include <drivers/spi.h>
#include <hal/nrf_gpio.h>
#define MY_SPI DT_NODELABEL(spi3)
#define CS_PIN 16
#define SPI_MODE_CPOL 0
#define SPI_MODE_CPHA 0

static const struct spi_config spi_cfg = {
	.operation = SPI_WORD_SET(8) | SPI_TRANSFER_MSB |
		     SPI_MODE_CPOL | SPI_MODE_CPHA,
	.frequency = 50000000,
	.slave = 1,
	
};

static const struct spi_cs_control cs_pin = {
	.gpio_pin=16,

};

const struct spi_dt_spec *spi_dev = DEVICE_DT_GET(MY_SPI);

static void spi_init(void)
{

if (!device_is_ready(spi_dev)) {
       	printk("Could not get device\n");
}
}

void spi_test_send(void)
{
	int err;
	static uint8_t tx_buffer[1];
	static uint8_t rx_buffer[1];

	const struct spi_buf tx_buf = {
		.buf = tx_buffer,
		.len = sizeof(tx_buffer)
	};
	const struct spi_buf_set tx = {
		.buffers = &tx_buf,
		.count = 1
	};

	struct spi_buf rx_buf = {
		.buf = rx_buffer,
		.len = sizeof(rx_buffer),
	};
	const struct spi_buf_set rx = {
		.buffers = &rx_buf,
		.count = 1
	};
		nrf_gpio_cfg_output(&cs_pin);
		// GPIO_SetBits(SPI_CS_MS_DEMO_PIN);
		nrf_gpio_pin_set(&cs_pin);
		k_busy_wait(100000);
		// GPIO_ResetBits(SPI_CS_MS_DEMO_PIN);
		nrf_gpio_pin_clear(&cs_pin);
		tx_buffer[0]=0x9F;
		// SPI_Send_Receive_Data(&a, &a1);
		err = spi_transceive(spi_dev, &spi_cfg, &tx, &rx);
			//k_busy_wait(1000);
	if (err) {
		printk("SPI error: %d\n", err);
	}else{
		printk("TX sent: %x\n", tx_buffer[0]);
		printk("RX recv: %x\n", rx_buffer[0]);
	}
		rx_buffer[0]=0x00;
		tx_buffer[0]=0x00;
		// b1=SPI_Send_Receive_Data(&a, &a1);
		err = spi_transceive(spi_dev, &spi_cfg, &tx, &rx);
	if (err) {
		printk("SPI error: %d\n", err);
	}else{
		printk("TX sent: %x\n", tx_buffer[0]);
		printk("RX recv: %x\n", rx_buffer[0]);
	}
		rx_buffer[0]=0x00;
		tx_buffer[0]=0x00;
		// b2=SPI_Send_Receive_Data(&a, &a1);
		err = spi_transceive(spi_dev, &spi_cfg, &tx, &rx);
	if (err) {
		printk("SPI error: %d\n", err);
	}else{
		printk("TX sent: %x\n", tx_buffer[0]);
		printk("RX recv: %x\n", rx_buffer[0]);
	}
		rx_buffer[0]=0x00;
		tx_buffer[0]=0x00;
		// b3=SPI_Send_Receive_Data(&a, &a1);
		err = spi_transceive(spi_dev, &spi_cfg, &tx, &rx);
	if (err) {
		printk("SPI error: %d\n", err);
	}else{
		printk("TX sent: %x\n", tx_buffer[0]);
		printk("RX recv: %x\n", rx_buffer[0]);
	}
		// GPIO_SetBits(SPI_CS_MS_DEMO_PIN);
		nrf_gpio_pin_set(CS_PIN);
	
}

void main(void)
{
	printk("SPIM Example\n");
	spi_init();

	while (1) {
		spi_test_send();
		k_sleep(K_SECONDS(1));
	}
}
 

&spi3 {
    compatible = "nordic,nrf-spim";
    status = "okay";
    //sck-pin = <11>;
   // mosi-pin = <10>;
    //miso-pin = <12>;
};
this works and only gives me read values as FF

  • Hi

    If you could make the snippets include the names of the lines that would be better. What function is it that returns error -22 that points to the previous write not being finished? The general meaning of error -22 means there is an invalid argument somewhere in a function.

    Best regards,

    Simon

  • Hi Simon , 

    I am getting the error in spi_transceive.

    working

    not working

  • Hi

    Since the w25q16jv is a NOR flash device, I would recommend using the spi_nor.c driver instead of the basic spi functions I think. Please check out the driver located in NCS_FOLDER\v2.x.x\zephyr\drivers\flash\spi_nor.c and rather use spi_nor_access() and spi_nor_wait_until_ready() functions to make sure the flash device is ready to receive the next message before transmitting a new message. As I think the flash might not be ready to receive a new message when you call the transceive function and it returns this error.

    Best regards,

    Simon

  • HI simon ,

    I tried using the spi_nor driver but I cannot get to configure it properly , 

    I had started a different question thread for it but did not get any satisfactory help with it , 

    problem 1 - to use the spi_nor.c I have to include it manually to my src folder of my project 

    problem 2- I need it to get SFDP run time configuration which I cant seem to get it write ,

    problem 3 - in the spi_nor.c file I am getting this error  

    DEVICE_DT_INST_DEFINE(0, &spi_nor_init, NULL,
    		 &spi_nor_data_0, &spi_nor_config_0,
    		 POST_KERNEL, CONFIG_SPI_NOR_INIT_PRIORITY,
    		 &spi_nor_api);
    		 
    		 
    error - too few arguments in invocation of macro "Z_FOR_LOOP_1"C/C++(54)

  • Hi

    I see that my colleague Kazi is helping you out in your recently created case, I suggest we you keep the discussion there, as getting information from two places at once will likely lead to confusion. Here are some quick answers to the questions you've asked here, but let's close this case for now and continue it in your latest one. In the future, please don't create multiple cases on one thread.

    1. Yes, spi_nor.c must be included in your project to be used.

    3. too few arguments means that you have not entered enough arguments/parameters in a given function.

    Best regards,

    Simon

Related