HI , I am having difficulty in interfacing the flash with my DK board
1) The spi flash sample is getting stuck at flash erase function without any error responses
2) I have used SPI interfacing with other devices and it is working .
3) Flash Board has been tested with other controllers
4) I wrote a sample code to just read manufacture id from the flash but it is not giving any response , the code and logic analyzer capture is below
#include <zephyr.h>
#include <sys/printk.h>
#include <device.h>
#include <drivers/spi.h>
#include <hal/nrf_gpio.h>
#include <kernel.h>
#include <devicetree.h>
#define SPI_MODE_CPOL 0
#define SPI_MODE_CPHA 0
struct spi_cs_control spim_cs_one = {
.gpio.dt_flags=GPIO_ACTIVE_LOW,
.gpio.pin=20,
.delay = 0,
};
static const struct spi_config spi_cfg = {
.operation = SPI_WORD_SET(8) | SPI_TRANSFER_MSB |
SPI_MODE_CPOL | SPI_MODE_CPHA,
.frequency = 1000000,
.slave = 0,
.cs= &spim_cs_one
};
struct device * spi_dev;
void spi_init(void)
{
spim_cs_one.gpio.port= DEVICE_DT_GET(DT_NODELABEL(gpio0));
spi_dev = device_get_binding("SPI_1");
if (spi_dev == NULL) {
printk("Could not get %s device\n", spi_dev);
return;
}
}
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
};
tx_buffer[0]=0x9F;
err = spi_transceive(spi_dev, &spi_cfg, &tx,&rx);
tx_buffer[0]=0x00;
err = spi_transceive(spi_dev, &spi_cfg, &tx,&rx);
tx_buffer[0]=0x00;
err = spi_transceive(spi_dev, &spi_cfg, &tx,&rx);
tx_buffer[0]=0x00;
err = spi_transceive(spi_dev, &spi_cfg, &tx,&rx);
}
void main(void)
{
printk("SPIM Example\n");
spi_init();
while (1) {
spi_test_send();
k_sleep(K_SECONDS(1));
}
}
--------------------------------------------------------------------------------------------------------
also tried
void spi_test_send(void)
{
int err;
static uint8_t tx_buffer[4]={
0x9F,
0x00,
0x00,
0x00
};
static uint8_t rx_buffer[4];
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_pin_set(20);
nrf_gpio_pin_clear(20);
k_busy_wait(80);
nrf_gpio_pin_set(20);
k_busy_wait(20);
nrf_gpio_pin_clear(20);
err = spi_transceive(spi_dev, &spi_cfg, &tx,&rx);
if (err) {
printk("SPI error: %d\n", err);
}
for(int i =4 ;i>0;i--){
printk("%x",rx_buffer[3]);
}
}
----------------------------------------------------------------------------------------------------------
DT
&spi1 {
compatible = "nordic,nrf-spi";
status = "okay";
cs-gpios = <&arduino_header 20 GPIO_ACTIVE_LOW>; /* D10 */
pinctrl-0 = <&spi3_default>;
pinctrl-1 = <&spi3_sleep>;
pinctrl-names = "default", "sleep";
label = "SPI_3";
};
------------------------------------------------------------------------------------------------------------
overlay
&spi1 {
w25q16jv: w25q16jv@0 {
compatible = "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <2000000>;
label = "w25q16jv";
};
};
-------------------------------------------------------------------------------------------------------------
proj.conf
CONFIG_SPI=y
Working Capture for reading ID
My code output Capture
