Ich habe ein Projekt, bei dem ein 16 Bit SDRAM Modul an ein LPC1788 angeschlossen werden soll. Ich hatte im uEZ Beispielcode die Initialisierung für 32 Bit SDRAM gefunden. Die LPC1788 EMC Konfiguration ist aber nicht gerade einfach zu verstehen. Was außer den PCONP und IOCON Registern muss ich konfigurieren, um den IS42S16400J anzuschließen. Bereits das "Dynamic Memory Configuration" register ist mir ein Rätsel. In dem SDRAM Datenblatt finde ich keine passenden Angaben zur Geometrie. Ich denke aber, die anderen Register müssen auch sinvoll beschrieben werden. Wie finde ich die richtigen Werte?
Also was ins DYNAMICCONFIGn Register reingehört, siehst du im User Manual UM470 des LPC1788. Seite 199. MD => 0x0, da SDRAM AM => siehe Tabelle Adress Mapping S.199 (welche Configuration du aus der Tabelle nehmen musst, findest du in der Regel auf der ersten Seite des SDRAM-Datasheets) B => während der SDRAM-Initialisierung sollen die Buffer disabled werden, zum Schluss, wenn du den EMC in den NORMAL Mode versetzt, werden die Buffer wieder aktiviert (steht ebenfalls im UM470 unter der Registerbeschreibung S.199) P => Schreibschutz brauchst du erst mal nich Das einzige was ich noch nicht ergründet habe, woher man rausbekommt, ob die Reihenfolge Row-Bank-Column oder Bank-Row-Column ist. Da hilft glaub ich nur ausprobieren. Gruß Martin
Martin schrieb: > Row-Bank-Column oder Bank-Row-Column ist Wenn das so etwa die gleiche Konstruktion ist wie beim LPC2478, dann hängt das davon ab, ob man den SDRAM als normal oder lopower betreiben will. W.S.
Martin schrieb: > Also was ins DYNAMICCONFIGn Register reingehört, siehst du im User > Manual UM470 des LPC1788. Seite 199. > > MD => 0x0, da SDRAM > AM => siehe Tabelle Adress Mapping S.199 (welche Configuration du aus > der Tabelle nehmen musst, findest du in der Regel auf der ersten Seite > des SDRAM-Datasheets) Naja, vielleicht stell ich mich besonders dusselig an. Aber ich sehe das hier http://www.issi.com/WW/pdf/42-45S16400J.pdf nicht. > Das einzige was ich noch nicht ergründet habe, woher man rausbekommt, ob > die Reihenfolge Row-Bank-Column oder Bank-Row-Column ist. Da hilft glaub > ich nur ausprobieren. Ich habe alle drei möglichen Kombinationen erfolglos ausprobiert. DYNAMICCONFIG0 = 0x00001300, 0x00001200, 0x00001280 B und P waren damit auch disabled. > Gruß Martin Danke für die Tipps. Leider bin ich trotzdem noch nicht am Ziel. Kennst Du Beispielcode für die EMC Initialisierung? Favorisieren würde ich natürlich die Nutzung eines 16 bit Busses. Gruß Harper
W.S. schrieb: > Martin schrieb: >> Row-Bank-Column oder Bank-Row-Column ist > > Wenn das so etwa die gleiche Konstruktion ist wie beim LPC2478, dann > hängt das davon ab, ob man den SDRAM als normal oder lopower betreiben > will. Und was mache ich im normalen Fall? Fahren SDRAMs denn in den Low Power Modus wenn man die Ansteuerung verdreht? Da bin ich etwas überrascht. /H.
The Harper schrieb: > 16 Bit SDRAM Modul an ein LPC1788 Hier ist ein Board mit genau dieser Konfiguration, einfach aus der Demo "sdram_64M_32bit_drv.c" nehmen und "#ifdef DATABUS_32" weglassen: https://www.olimex.com/Products/Modules/LCD/MOD-LCD4.3%27%27/
W.S. schrieb: > dann > hängt das davon ab, ob man den SDRAM als normal oder lopower betreiben > will. Hm das wäre denkbar, finde ich das irgendwo im Datenblatt? The Harper schrieb: > Naja, vielleicht stell ich mich besonders dusselig an. Aber ich sehe das > hier http://www.issi.com/WW/pdf/42-45S16400J.pdf nicht. Also die Tabelle mit den Adressmapping Bits des 1788 wirst du ja hoffentlich gefunden haben. Im angehängten Bild hab ich die nötigen Angaben vom SDRAM dazu: 64Mbits, 4Mx16, 4 banks, row length = 12, column length = 8 row length ergibt sich aus den Row Adresses A0 - A11 => sind 12 Bit column length => A0 - A7 => 8 Bit ...und die Reihenfolge RBC oder BRC bestimmt Bit 12 im DYNAMICCONFIGn Register The Harper schrieb: > Kennst Du Beispielcode für die EMC Initialisierung? Favorisieren würde > ich natürlich die Nutzung eines 16 bit Busses. Ja nimm Lothar seinen Code oder probier den vom emWin Board support package für das EA LPC1788Dev-Kit. Welche IDE nimmst du denn? Ich habe meinen SDRAM aber auch noch nicht erfolgreich zum Laufen gebracht :-( (siehe: Beitrag "LPC1857 ARM Cortex M3 Problem mit EMC und SDRAM") Wäre für hilfreiche Tips ebenfalls dankbar :-)
Martin schrieb: > row length ergibt sich aus den Row Adresses A0 - A11 => sind 12 Bit > column length => A0 - A7 => 8 Bit Ja, stimmt soweit. > ...und die Reihenfolge RBC oder BRC bestimmt Bit 12 im DYNAMICCONFIGn > Register Und die mache ich nach Gusto oder wie einigen sich da SDRAM und EMC? Ich habe beide Werte probiert, ohne Erfolg. > Welche IDE nimmst du denn? emIDE > Wäre für hilfreiche Tips ebenfalls dankbar :-) Tja, willkommen im Club.
The Harper schrieb: > Und was mache ich im normalen Fall? > Fahren SDRAMs denn in den Low Power Modus wenn man die Ansteuerung > verdreht? Guck in die Doku zum uC. Dort steht - irgendwo verklausuliert - wie der uC sich in Pausen benimmt, ob er den SD-Takt abschaltet oder nicht, oder nur Takt-Enable auf und zu und so weiter. Dem SDRAM ist sowas wahrscheinlich egal, aber der uC setzt je nach Modus ras,cas,bank unterschiedlich zusammen. Jedenfalls beim 2578. Der Knackpunkt ist eigentlich nur das Zusammenstellen des Mode-Wortes für den SDRAM. hier mal ein Auszug (LPC2478) /*----------- externer SDRAM --------------------------*/ PCONP |= (1<<11); // Power für EMC einschalten EMC_CTRL = 1; // EMC enable, Adressmirror aus, normal mode EMC_CONFIG = 0; //(0) Little Endian mode EMC_DYN_CTRL = 2; // wie nach Reset EMC_DYN_RP = 1; //(1) tRP (mind. 20ns) auf (n+1) = 2 Takte = 33 ns EMC_DYN_RAS = 4; //(3) tRAS (mind. 42ns) auf (n+1) = 4 Takte = 66 ns EMC_DYN_SREX = 5; // tSREX=tXSR (mind. 70ns) auf (n+1) = 6 Takte = 100 ns EMC_DYN_APR = 1; //(1) tAPR in Clocks (nicht gefunden) EMC_DYN_DAL = 5; // tDAL (CL=3) --> 5 Takte EMC_DYN_WR = 1; //(1) tWR (1 CLK+7ns) also (n+1) = 2 Takte EMC_DYN_RC = 5; // tRC (mind. 70ns) auf (n+1) = 6 Takte = 100 ns EMC_DYN_RFC = 5; // tRFC (mind. 70ns) auf (n+1) = 6 Takte = 100 ns EMC_DYN_XSR = 5; // tXSR (mind. 70ns) auf (n+1) = 6 Takte = 100 ns EMC_DYN_RRD = 1; // tRRD (mind. 14ns) auf (n+1) = 2 Takte = 33 ns EMC_DYN_MRD = 1; // tMRD = (n+1) = 2 Takte EMC_DYN_RD_CFG = 1; // "Command delayed strategie" --> benutzt EMCCLKDELAY EMC_DYN_RASCAS0 = 0x0202; //0202 je 2 Takte EMC_DYN_CFG0 = ValFor_EMC_DYN_CFG0; delay(1000); L = 2000; while (--L) { delay(1); EMC_DYN_CTRL = NOP_CMD | 3; // zuerst NOP Command + alle Takte ein } delay(20000); EMC_DYN_CTRL = PALL_CMD | 3; // Precharge Command + alle Takte ein EMC_DYN_RFSH = 2; // erstmal 2*16 = alle 32 CCLK's Refresh ..? delay(20000); // und das lange... EMC_DYN_RFSH = 14; // jetzt alle 14*16 CCLK's nen Refresh EMC_DYN_CTRL = MODE_CMD | 3; // jetzt kommt's zum Moderegister setzen PDW = (dword*)modesetadr; D = *PDW; // dummy read von berechneter Adresse delay(2000); EMC_DYN_CTRL = NORMAL_CMD; // endlich zum Normalmode kommen EMC_DYN_CFG0 = ValFor_EMC_DYN_CFG0 | BufferEnable; // Puffer einschalten delay(20000); // eigentlich sollte der SDRAM jetzt funktionieren W.S.
W.S. schrieb: > EMC_DYN_CFG0 = ValFor_EMC_DYN_CFG0; Jupp, ich hab den Wert eingetragen. Damit klappt's auch mit dem Nachbarn. Es musste nur noch das MODE Worte an die richtige Adresse geschrieben werden.
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.