Forum: Mikrocontroller und Digitale Elektronik 16 Bit SDRAM am LPC1788


von The H. (helge_k)


Lesenswert?

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?

von Martin (Gast)


Lesenswert?

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

von W.S. (Gast)


Lesenswert?

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.

von The H. (helge_k)


Lesenswert?

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

von The H. (helge_k)


Lesenswert?

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.

von Lothar (Gast)


Lesenswert?

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/

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

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 :-)

von The H. (helge_k)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von The H. (helge_k)


Lesenswert?

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
Noch kein Account? Hier anmelden.