Hallo,
im Anhang finden Sie ein Datasheet zum 25fm256. Ich habe den fm25w256
auf eine Platine gelötet und alle Pins mit der Platine ohne weitere
Schaltungselemente (Pull-UP/ -DOWN, etc.) verbunden. Dabei sind der HOLD
sowie der WP PIN nicht mit der Platine verbunden (wie auf dem 2. Bild
von
https://learn.adafruit.com/adafruit-spi-fram-breakout/wiring-and-test).
Ich habe ebenfalls die MISO, MOSI und SCK PINs mit den dort angegebenen
Arduino Pins verbunden. Ich habe dann versucht den dort gezeigten
Sketch-Code MB85RS64V (vgl. Bild 3) hochzuladen, was alles perfekt
funktioniert hat. Doch das Serielle Kommunikations Fenster zeigt nur "No
FRAM found, check your Connections...". Ich weiß auch nicht, was ich
jetzt noch versuchen kann.
Hier der Code:
#include <SPI.h>
#include "Adafruit_FRAM_SPI.h"
/* Example code for the Adafruit SPI FRAM breakout */
uint8_t FRAM_CS = 10;
//Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_CS); // use hardware
SPI
uint8_t FRAM_SCK= 13;
uint8_t FRAM_MISO = 12;
uint8_t FRAM_MOSI = 11;
//Or use software SPI, any pins!
Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_SCK, FRAM_MISO,
FRAM_MOSI, FRAM_CS);
uint16_t addr = 0;
#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using
programming port to program the Zero!
#define Serial SerialUSB
#endif
void setup(void) {
#ifndef ESP8266
while (!Serial); // will pause Zero, Leonardo, etc until serial
console opens
#endif
Serial.begin(9600);
if (fram.begin()) {
Serial.println("Found SPI FRAM");
} else {
Serial.println("No SPI FRAM found ... check your connections\r\n");
while (1);
}
// Read the first byte
uint8_t test = fram.read8(0x0);
Serial.print("Restarted "); Serial.print(test); Serial.println("
times");
// Test write ++
fram.writeEnable(true);
fram.write8(0x0, test+1);
fram.writeEnable(false);
fram.writeEnable(true);
fram.write(0x1, (uint8_t *)"FTW!", 5);
fram.writeEnable(false);
// dump the entire 8K of memory!
uint8_t value;
for (uint16_t a = 0; a < 8192; a++) {
value = fram.read8(a);
if ((a % 32) == 0) {
Serial.print("\n 0x"); Serial.print(a, HEX); Serial.print(": ");
}
Serial.print("0x");
if (value < 0x1)
Serial.print('0');
Serial.print(value, HEX); Serial.print(" ");
}
}
void loop(void) {
}
T800w schrieb:> Dabei sind der HOLD sowie der WP PIN nicht mit der Platine verbunden
Das sind beides Eingänge. Offene Eingänge sind ein Fehler, die nehmen
dann nämlich keinen definierten Pegel an.
> (wie auf dem 2. Bild von ...)
Da kann man die Platine erkennen, auf der ein Widerstand verbaut ist.
Und der verbindet /HOLD mit VCC, ist also ein Pullup.
Mindestens den solltest Du in Deiner Schaltung auch vorsehen, oder den
/HOLD-Pin direkt mit VCC verbinden, wenn sicher ist, daß Du den niemals
benutzen willst.
Die Device ID vom MB85RS64V Fram wird eine andere sein
als vom FM25W256. Deshalb kommt vermutlich "No SPI FRAM found".
Schau mal in fram.begin() rein. Da wird vermutlich irgendwo
die Device ID gelesen. Dort musst du dann deine ID eintragen.
T800w schrieb:> Ich weiß auch nicht, was ich jetzt noch versuchen kann.
Da ist systematische Vorgehensweise gefragt.
Prüfe, ob die Signale auf dem SPI (SCK, MOSI) ordentlich aussehen und
gucke nach, ob und wie das F-RAM auf MISO reagiert.
>Das habe ich schon probiert, CS und HOLD gleichzeichtig auf VCC zu>ziehen, hat aber beides nicht funktioniert.
CS darf nicht dauerhaft an VCC. Wenn schon dann GND weil es low aktiv
ist. Aber das muss von einem Pin angesteuert werden, sonst geht gar nix.
T800w schrieb:> Das habe ich schon probiert, CS und HOLD gleichzeichtig auf VCC zu> ziehen
Jetzt ist plötzlich von /CS die Rede. Wenn Du /CS auf VCC-Pegel legst,
ist das IC dauerhaft deaktiviert.
Wie wäre es, wenn Du Dir erst mal in Ruhe das Datenblatt durchliest,
welches der verschiedenen Eingangssignale welche Bedeutung hat?
Auf Seite 3 sind sie alle recht schön beschrieben.
Rufus Τ. F. schrieb:> T800w schrieb:>> Das habe ich schon probiert, CS und HOLD gleichzeichtig auf VCC zu>> ziehen>> Jetzt ist plötzlich von /CS die Rede. Wenn Du /CS auf VCC-Pegel legst,> ist das IC dauerhaft deaktiviert.
Tut mir leid ich hatte mich verschrieben, ich meinte ursprünglich WP.
@holger
> Die Device ID vom MB85RS64V Fram wird eine andere sein> als vom FM25W256. Deshalb kommt vermutlich "No SPI FRAM found".> Schau mal in fram.begin() rein. Da wird vermutlich irgendwo> die Device ID gelesen. Dort musst du dann deine ID eintragen.
Im Anhang finden Sie eine Tabelle mit verschiedenen FRAMs. Wenn ich die
Tabelle richtig Interpretiere liegt für den fm25w256 kein Device ID vor,
soll ich dann die Device ID aus dem fram.begin() komplett entfernen odr
gibt es noch andere Wege.
>liegt für den fm25w256 kein Device ID vor,
Das Teil hat tatsächlich keine.
>soll ich dann die Device ID aus dem fram.begin() komplett entfernen oder>gibt es noch andere Wege.
Das musst du wohl.
Hallo,
ich habe jetzt ein eigenes Programm geschrieben(siehe Anhang), aber auch
das Funktioniert nicht. Ziel des Programms ist es das Statusregister zu
lesen und es umzuschreiben, damit ich den FRAM Speicher beschreiben und
lesen kann. Das Programm kann das Statusregister und den allgemeinen
Speicher lesen aber in beiden fällen nicht beschreiben, obwohl das
Programm so ausgelegt ist. Hat jemand eine Idee woran das liegen könnte.
Nötige Kommentare sind im Skript enthalten, bei Fragen einfach melden.
T800w schrieb:> lesen kann. Das Programm kann das Statusregister und den allgemeinen> Speicher lesen aber in beiden fällen nicht beschreiben, obwohl das> Programm so ausgelegt ist. Hat jemand eine Idee woran das liegen könnte.
Wie äußert sich, dass es das nicht kann? Wiehert das Programm, oder
pfeift es? Es wäre hilfreich, das Problem halbwegs vernünftig zu
beschreiben. Ein "geht nicht" ist absolut nichtssagend.
Zur Info: Fallende Flanke an /CS startet ein neues Kommando, beendet
wird die Sequenz (Kommando und event. Daten) mit der steigenden Flanke
von /CS.
Also: /CS auf Low, WREN-Kommando herausschieben, /CS auf High, dann z.
B. /CS wieder auf Low, WRITE-Kommando, Adressebytes und Daten-Bytes
herausschieben, /CS auf High.
Zwischen dem WREN-Kommando und WRITE-Kommando (oder was immer ...) muss
/CS mal auf High gehen!
Zum Testen sollte man vielleicht erst nur WREN senden, danach
(zwischendurch /CS auf High nicht vergessen) das Statusregister lesen,
um festzustellen, ob das WE-Bit gesetzt wurde.
@A.B
Das Programm läuft zwar komplett ab, wie man es auch im Serial Monitor
Bild (Anhang) sieht.
Aber das Programm kann nur lesen anstatt lesen und schreiben.
> Wie wäre es, wenn Du Dir erst mal in Ruhe das Datenblatt durchliest,> welches der verschiedenen Eingangssignale welche Bedeutung hat?>> Auf Seite 3 sind sie alle recht schön beschrieben.
Hm, manche Leute sind halt beratungsresistent. Mehr als das und mein
Hinweis auf das /CS (findet man schön in Fig. 6 und Fig. 10) kann man
wohl nicht machen ..., seufz. Anscheinend ist die Erwartungshaltung
wohl, dass jemand eine korrekte Version zum Copy&Paste hier einstellt.
Schön, dass es jetzt geht.
Da der betreffende Chip (ebenso wie die meisten EEPROMs) leider keine
auslesbare Chip-Id hat, ist es durchaus sinnvoll, vor und nach einem
WREN das Statusregister zu lesen und zu kontrollieren, ob vorher Bit 0
gelöscht und hinterher Bit 1 (das WE-Bit) dann auch gesetzt ist. Damit
weiß man, dass tatsächlich "wer da" ist.
Bit 0 ist bei diesem Chip zwar immer 0, bei EEPROMs ist's aber das
BUSY-Bit.
Baut man die Abfrage mit Warteschleife ein, kann man problemlos mal
wechseln ...
Nur ob man 2 oder 3 Adressbytes braucht, findet man leider nicht
automatisch heraus :-(