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.
T800w schrieb: > https://learn.adafruit.com/adafruit-spi-fram-breakout/wiring-and-test). Das 2.te Bild (Arduino Wiring) ist falsch Der VCC-Anschluss darf nicht an Gnd (s. Bildunterschrift)
@Wolfgang Genau, das habe ich auch nicht so übernommen, klappt aber trotzdem nicht.
@Rufus Das habe ich schon probiert, CS und HOLD gleichzeichtig auf VCC zu ziehen, hat aber beides nicht funktioniert.
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.
T800w schrieb: > Aber das Programm kann nur lesen anstatt lesen und schreiben. Hallo Beratungsresistenter, das hier funktioniert nicht:
1 | void framWrenWrite(int CS, byte Adress_1, byte Adress_2, int framWriteData) |
2 | {
|
3 | digitalWrite(CS, LOW); |
4 | SPI.transfer(OPCODE_WREN); //WREN-OP-CODE |
5 | SPI.transfer(OPCODE_WRITE); //WRITE-OP-CODE |
6 | SPI.transfer(Adress_1); //Speicheradresse wird gesendet |
7 | SPI.transfer(Adress_2); //Speicheradresse wird gesendet |
8 | SPI.transfer(framWriteData); //FRAM speichert Daten |
9 | digitalWrite(CS, HIGH); |
10 | }
|
da man nicht zwei Opcodes hintereinander senden kann wie A. B. bereits beschrieben hat.
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 :-(
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.