Cómo leer la ID del dispositivo de una memoria de flash de datos

2

Estoy intentando leer la identificación del dispositivo de una memoria flash serie utilizando las conexiones SPI en un mbed. En la hoja de datos de la memoria flash serie W25Q80 hay esta figura.

El siguiente es el código que estoy usando para intentar leer la ID del dispositivo.

#include "mbed.h"

SPI spi(p5, p6, p7); // mosi, miso, sclk
DigitalOut cs(p8);

Serial pc(p9, p10); // tx, rx

int main() {
    // Setup the spi for 8 bit data, high steady state clock,
    // second edge capture, with a 1MHz clock rate
    spi.format(8,0);
    spi.frequency(1000000);

    // Select the device by seting chip select low
    cs = 0;

    wait(1.0);

    pc.printf("response from sending 90h: %d\r\n", spi.write(0x90));
    pc.printf("response from sending 00h: %d\r\n", spi.write(0x00));
    pc.printf("response from sending 00h: %d\r\n", spi.write(0x00));

    cs = 1;
}

Todo lo que leo son 0s. A veces se lee 128 o 255. Eso está mal, ¿verdad?

    
pregunta 200ok404notfound

1 respuesta

1

La hoja de datos para la parte que indica indica que es de 24 bits. La dirección debe escribirse después del código 0x90. Luego se pueden leer los códigos del fabricante y del dispositivo de 2 bytes. Así que inserte 3 instrucciones de escritura y debería funcionar.

pc.printf("response from sending 90h: %d\r\n", spi.write(0x90));
pc.printf("response from sending 00h: %d\r\n", spi.write(0x00)); //Address 23..16
pc.printf("response from sending 00h: %d\r\n", spi.write(0x00)); //Address 15..8
pc.printf("response from sending 00h: %d\r\n", spi.write(0x00)); //Address 7..0
pc.printf("response from sending 00h: %d\r\n", spi.write(0x00)); //Manufacturer ID
pc.printf("response from sending 00h: %d\r\n", spi.write(0x00)); //Device ID

Si obtiene resultados inconsistentes, puede querer hacer sus escrituras en un bucle, luego imprimir cuando termine. No estoy seguro de cómo afecta el IO de printf al tiempo de implementación de SPI de mbed, pero si obtiene espacios entre las escrituras de bytes, eso puede afectar la respuesta de la parte flash.

unsigned char command[6] = {0x90, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char response[6];

for(int i=0; i<6; i++)
{
    response[i] = spi.write(command[i]);
}

pc.printf("Manufacturer ID: %d\r\n", command[4]);
pc.printf("Device ID: %d:\r\n", command[5]);

También tiene la instrucción 90h en su fuente, pero su diagrama es para la instrucción 9Fh. El solo hecho de cambiar la instrucción puede permitir que su código original funcione.

    
respondido por el Erik

Lea otras preguntas en las etiquetas