So lesen Sie die Geräte-ID eines Dataflash-Speichers aus

Ich versuche, die Geräte-ID eines seriellen Flash-Speichers mithilfe der SPI-Verbindungen auf einem mbed zu lesen. Im Datenblatt des seriellen Flash-Speichers W25Q80 steht diese Zahl.

Das Folgende ist der Code, den ich verwende, um zu versuchen, die Geräte-ID zu lesen.

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

Alles, was ich lese, sind 0s. Manchmal wird 128 oder 255 angezeigt. Das ist falsch, oder?

ja das sollte funktionieren. Verwenden Sie dies als Referenz mbed.org/projects/libraries/api/mbed/trunk/SPI#SPI.Functions
Warum zeigt die Abbildung ein EFh für die Herstellerkennung? Soll ich das statt 0x00 senden?
Nein, Sie sollten nicht EFh senden, das ist die Hersteller-ID, die zurückgegeben werden sollte
Der Kommunikationsfluss sollte sein - 9F senden -> Speicher (Chip) sollte EF zurücksenden -> dann sollte ID15-ID0 auch an Ihr MBED gesendet werden
Ich lese nur 0. Ich habe meine Frage aktualisiert, um den Code anzuzeigen.
Senden Sie jemals den Befehl spi.write(0x9F) wie im Datenblatt gezeigt?
Ja ...... stellen Sie sicher, dass Sie die richtigen SPI-Pins und seriellen Pins (5, 6, 7) oder (11, 12, 13) verwenden
Hast du das zum Laufen gebracht, @200ok404notfound ?
Warum haben Sie in dieser Frage einen Screenshot eines YouTube-Videos eines Wasserschweins?

Antworten (1)

Das Datenblatt für den von Ihnen aufgelisteten Teil besagt, dass eine 24-Bit-Adresse nach dem 0x90-Code geschrieben werden sollte. Dann können die 2-Byte-Hersteller- und Gerätecodes gelesen werden. Also 3 Schreibbefehle einfügen und es sollte funktionieren.

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

Wenn Sie inkonsistente Ergebnisse erhalten, können Sie Ihre Schreibvorgänge in einer Schleife durchführen und dann drucken, wenn Sie fertig sind. Ich bin mir nicht sicher, wie sich das printf IO auf das Timing der mbed SPI-Implementierung auswirkt, aber wenn Lücken zwischen Byte-Schreibvorgängen auftreten, kann sich dies auf die Reaktion des Flash-Teils auswirken.

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]);

Sie haben auch die Anweisung 90h in Ihrer Quelle, aber Ihr Diagramm ist für die Anweisung 9Fh. Wenn Sie nur die Anweisung ändern, kann Ihr ursprünglicher Code möglicherweise funktionieren.