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

Reading JEDEC ID External Flash

Hello,

 I have an external flash w25q32 spi nor flash. I tried to communicate with my flash using spi_nor driver code in zephery however it didn't detect the external flash saying "flash driver was not found" .The device get binding was returning false. Then I tried to just read the jedec id with spi_transceive. I am sending 9F command and dummy bytes to detect the jedec id however still I am not able to get the jedec id. You can see the logic analyzer output attached. The jedec id  has to be ef 40 16.

My main.c is:

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

#include <zephyr.h>

#include <sys/printk.h>

#include <drivers/spi.h>

//addition for combining blinky

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

struct device * spi_dev;

static void spi_init(void) {
    const char *
      const spiName = "SPI_3";
    spi_dev = device_get_binding(spiName);

    if (spi_dev == NULL) {
      printk("Could not get %s device\n", spiName);
      return;
    }
}

void spi_test_send(void) {
  int err;
  //static u8_t tx_buffer[1];
  //static u8_t rx_buffer[1];
  static u8_t tx_buffer[5] = {
	0X9F,
        0x00,
        0x00,
        0x00,
        0x00
        

  };
  static u8_t rx_buffer[5];

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

  struct device * gpio_dev;
  struct spi_cs_control cs_control;

  gpio_dev = device_get_binding("GPIO_0");
  if (!gpio_dev) {
	printk("could not find GPIO device\n");
	return;
  }

  gpio_pin_configure(gpio_dev,13,GPIO_OUTPUT_ACTIVE);
  gpio_pin_set(gpio_dev,13,0);
  err = spi_transceive(spi_dev, & spi_cfg, & tx, & rx);
  gpio_pin_set(gpio_dev,13,1);
  if (err) {
	printk("SPI error: %d\n", err);
  } else {
	/* Connect MISO to MOSI for loopback */

	for (int i = 0; i < sizeof(tx_buffer); i++) {
	  printk("TX transmit: %x\n", tx_buffer[i]);
	}

	for (int i = 0; i <sizeof(rx_buffer); i++) {
	  printk("RX recv: %x\n", rx_buffer[i]);
	}
  }
}

void main(void) {
  printk("SPIM Example\n");
  spi_init();
  printk("After init\n");
  while (1) {
	spi_test_send();
	k_sleep(K_MSEC(10));
	printk(".");
  }
}
,

my overlay is:

&spi3 {
	compatible = "nordic,nrf-spim";
	status = "okay";
	sck-pin = <10>;
	mosi-pin = <11>;
	miso-pin = <12>;
    //cs-gpios = <&gpio0 13 0>;

};

My proj.conf:

CONFIG_SPI=y
CONFIG_MAIN_STACK_SIZE=4096
# CONFIG_SPI_0=y
# UART, SPIM, and I2C are shared peripherals on nrf9160
# therefore we choose SPI3
CONFIG_SPI_3=y
CONFIG_SPI_NRFX=y
CONFIG_DEPRECATED_ZEPHYR_INT_TYPES=y

#addition for combining blinky
CONFIG_GPIO=y

The logic analyzer output is:

Can you help me with this issue. I couldn't understand why it is not working for detecting jedec id. Any help would be so helpful.

Thank you

Related