LPC2468 External Memory Controller Frage

OP #1328374
Lesenswert?

Hallo,
ich sitze gerade vor einer Leiterplatte mit einem LPC2468 drauf.
Ich will die beiden SDRAM ansteuern, welche auf dem Board verbaut sind:

IS42S16160B (http://www.issi.com/pdf/42S83200B-16160B.pdf).

Ich habe nun gemäss LPC2468-Handbuch alle Register des EMC 
initialisiert; doch ich stelle 2 Probleme fest:

1. Es funktioniert nicht;
2. Manche Pins werden nicht richtig auf Masse gezogen. Namentlich 
DQM0..DQM3. Diese haben zwar einen ordentlichen High-Pegel von +3.3V, 
aber sie kommen nie auf Masse runter (Oszi-Bild folgt noch). Im PINMODE 
habe ich die Pullups aber ausgeschaltet (weder Pullup noch Pulldown sind 
aktiv).

Hier noch mein Code:

#include "targets/LPC2468.h"

int main(void)
{
  int i;
  int j;
  int* x = 0xA0000000; /* base addr of the sdram */

  /* setup pll */
  MAMCR = 2;
  MAMTIM = 7;
  IRCTRIM = 0xe0;
  PLLCON &= 0xFFFFFFFD;
  PLLFEED = 0xAA;
  PLLFEED = 0x55;
  PLLCON &= 0xFFFFFFFE;
  PLLFEED = 0xAA;
  PLLFEED = 0x55;
  CCLKCFG = 0;
  PLLCFG = 0x000700FC;
  PLLFEED = 0xAA;
  PLLFEED = 0x55;
  PLLCON |= 0x00000001;
  PLLFEED = 0xAA;
  PLLFEED = 0x55;
  CCLKCFG = 3;
  while(!(PLLSTAT & (1 << 26)));
  PLLCON |= 0x00000002;
  PLLFEED = 0xAA;
  PLLFEED = 0x55; // 40 MHz

  /* for test only */
  PINSEL1 = 0;
  PINSEL1 |= (1 << 21);
  PCLKSEL1 |= 4;
  PINSEL2 = 0;
  PINMODE2 = 0;
  FIO1DIR = 0x10;
  FIO1MASK = 0;
  PCLKSEL0 = 4;

  /* setup emc */
  PCONP |= (1 << 11);
  PINSEL5 = 0x55010115;
  PINMODE5 = 0xAA02022A;
  PINSEL6 = 0x55555555;
  PINMODE6 = 0xAAAAAAAA;
  PINSEL7 = 0x55555555;
  PINMODE7 = 0xAAAAAAAA;
  PINSEL8 = 0x15555555;
  PINMODE8 = 0x2AAAAAAA;
  PINSEL9 = (1 << 18);
  PINMODE9 = 0x80000;
  EMCControl = 1;
  EMCDynamicReadConfig = 1;
  EMCDynamicRasCas0 = 0x203;
  EMCDynamictRP = 0;
  EMCDynamictRAS = 1;
  EMCDynamictSREX = 2;
  EMCDynamictAPR = 1; // ??
  EMCDynamictDAL = 2;
  EMCDynamictWR = 1; // ??
  EMCDynamictRC = 2;
  EMCDynamictRFC = 2;
  EMCDynamictXSR = 2;
  EMCDynamictRRD = 0;
  EMCDynamictMRD = 0;
  EMCDynamicConfig0 = ((1 << 14) | (1 << 12) | (1 << 10) | (1 << 9) | (1 
<< 7));
  for(i = 0; i < 100; i++);
  EMCDynamicControl = 0x181; // nop
  for(i = 0; i < 100; i++);
  EMCDynamicControl = 0x101; // pall
  EMCDynamicRefresh = 1; // ??
  for(i = 0; i < 100; i++);
  EMCDynamicRefresh = 19;
  EMCDynamicControl = 0x081;
  j = (*(volatile int*)0xA0000023); // 8 burst 2 cas
  EMCDynamicControl = 0;

  while(1)
  {
    if(x < 0xFFFFFFF)
    {
      *x = 0;
      x++;
    }
    FIO1SET = 0x10;
    FIO1CLR = 0x10;
  }
  return 0;
}

interessant ist auch, dass der Code nur bis zur Zeile *x = 0; läuft 
(auch im single-step Modus). Ist das Programm bei dieser Zeile 
angekommen, und man will den nächsten Befehl ausführen, dann 'hängt' 
sich die CPU auf und der Debugger meldet "cannot stop target", was man 
jeweils nur durch aus- und wieder einschalten des LPC beheben kann.

Ah ja: als Takt benutze ich vorläufig noch den internen RC-Oszillator, 
da die Quarzoszillatoren, die ich bestellt habe, noch nicht da sind.
Mittels PLL wird aber ein Takt von ca. 40 MHz (genau 39.39 oder sowas) 
erzeugt, was auch funktioniert.

Wer kann helfen?
OP #1328402
Lesenswert?

Hey,
also der Clock ist wirklich hässlich, ja.
Der Tastkopf vom Oszi ist abgeglichen und sollte lt. Hersteller bis 1 
GHz funktionieren. Daran wird es also nicht liegen.
Ich kann mir auch nicht erklären, warum der Clock so scheisse ist! ein 
Kondensator hängt bestimmt nicht dran. Was aber interessant ist:
Unterbreche ich die Verbindung vom Clock zu den RAMs, dann sieht er 
relativ 'normal' aus (in der Verbindung habe ich 2 Pads vorgesehen, um 
ggf. einen Terminierungswiderstand einfügen zu können - der ist momentan 
mit 0 Ohm überbrückt).
Ich poste mal ein Bild...
#1328405
Lesenswert?

Hallo Tobias,

also deine Timings sehen mir etwas optimistisch aus, aber das könnte mit 
deinem relativ langsamen Takt passen.
Auf jeden Fall wird das Mode-Register definitiv falsch geschrieben und 
du hast den Puffer auch nicht aktiviert.

Probier mal folgendes aus:
1
  ...
2
  j = (*(volatile int*)(0xA0000000 | (0x22 << 13))); // 4 burst 2 cas
3
  EMCDynamicControl = 0;
4
  EMCDynamicConfig0 |= 0x80000;
5
  ...

evtl. mal noch diese Zeile ändern:
1
  EMCDynamicConfig0 = ((1 << 14) | (1 << 12) | (1 << 10) | (1 << 9) | (1 << 7));
2
{/c]
3
in
4
[c]
5
  EMCDynamicConfig0 = ((1 << 14) | (1 << 10) | (1 << 9) | (1 << 7));

Gruß,
Kai
OP #1328415
Lesenswert?

Hallo Kai,
ich werde das gleich ausprobieren. Danke!
Kannst du mir vielleicht auch erklären, warum der Clock vom uC so 
hässlich aussieht? Ich mein, es sind doch nur 40 MHz. Der Controller 
geht aber bis 72! und in dem Bild, das ich vorhin angehangen habe, ist 
der Clock _unbelastet_, nur mit ner 4 mm langen Leiterbahn.
OP #1328432
Lesenswert?

Hallo Tobias,
ja richtig, ich habe das Layout für eine Serienterminierung vorgesehen.
Beim ersten Oszibild, das ich postete, war eine Brücke anstatt des 
Widerstands drin, und beim zweiten war gar nichts bestückt.

Ich wollte eigentlich erst testen, ob es ohne Terminierungswiderstand 
geht (deshalb die Brücke) und falls nicht ggf. den richtigen Wert durch 
probieren herausfinden.

Im Anhang mein Schema.

Die SDRAMs sind auch definitiv richtig herum bestückt! Mit den im Schema 
gezeichneten Abblock Cs.
Angehängte Dateien:
#1328434
Lesenswert?

Also das mit der Clock kann ich dir leider nicht so recht beantworten. 
Meine Platine läuft hier ohne Murren mit 72MHz. Selbst bei testweise 
aktivierten 96MHz lief die Kiste noch ohne Probleme.
Leider kann ich mir die Clock-Leitung z.Z. nicht anschauen, da mein 
Scope nur 30MHz macht.

Hast du auf dem Pin 67 (P2.19) eine Funktion drauf? Wenn nicht, dann 
könntest du den probeweise auch mal ClockOut konfigurieren und sehen wie 
das Signal dort aussieht.
#1328510
Lesenswert?

Also auf dem aktuellen Layout ist nur in der Clockleitung der 
Serienwiderstand und der Kondensator gegen Masse. Für das Redesign habe 
ich aber zusätzlich einen Serienwiderstand in den Steuerleitungen 
vorgesehen, also RAS, CAS, DYCS0, CKE0, DQM3-1 und WE.

Layout ist auch ein 4-lagiges, allerdings durchgehend 8mil 
Leiterbahnbreite. Länge der Clock-Leitung ca. 3,5cm.
OP #1328515
Lesenswert?

Hast du das SDRAM auch 32 Bit breit angebunden?

Übrigens war wohl vorhin mit meiner Lötbrücke was nicht in Ordnung, dass 
der Clock am CLKOUT0 so schlecht war. Er sieht jetzt einigermassen 
annehmbar aus; aber mit 72 MHz funktioniert das SDRAM dennoch nicht. 
Hast du irgend einen Clock-Treiber noch eingebaut?
#1328533
Lesenswert?

Ja, ich habe auf zwei 16-Bit breite SD-RAMs (Micron) zu 32 Bit 
zusammengeschaltet. Einen Treiber habe ich nicht angeschlossen.

Den 18pF hatte ich ursprünglich nur aufgrund eines Hinweises von 
EmbeddedArtists vorgesehen, da bei einigen Boards mit Samsung SDRAM die 
mögliche Taktfrequenz auf 48MHz beschränkt war. Durch den Einsatz des 
18pF am SDRAM können die betreffenden Boards auch mit 72MHz laufen.

Der 18pF bringt auf jeden Fall eine Verbesserung in Sachen Crosstalk 
durch steile Flanken auf benachbarten Leitungen. Ich weiß nicht, wie 
dein Layout aussieht. Evtl. ist das ja bei dir auch ein Problem.
OP #1328539
Lesenswert?

Crosstalk wäre möglich; die Leitungen sind sehr nahe beieinander.
Ich versuch das dann auch mal; aber die genannten 48 MHz passen ja recht 
gut! Obwohl ich zwar kein Samsung SDRAM habe. Schön wärs, wenn die 
Erklärung so einfach wäre :-)
Ich muss das dann wie gesagt ausprobieren.
Was ist übrigens mit unserem Digikey Kram? erinnerst du dich an die 
Mail?

Gruss
OP #1328576
Lesenswert?

Also ich hab jetzt den Terminierungswiderstand rein gepfriemelt. Den 
braucht es offensichtlich wirklich hier.
Jaa, und der Grund, warum ganz am Anfang der Takt so mies war, war eine 
nicht so dolle Lötstelle. Nach dem nachlöten jedenfalls war das Zeug 
besser.
Die Frage ist jetzt eigentlich nur noch, wie ich es auch auf 72 MHz 
schaffe, wie Kai ;-)

@Kai
du sagtest weiter oben, dass mein Timing etwas "optimistisch" sei. Warum 
meinst du denn?
Ich habe nämlich jetzt mal ein kleines RAM-Test Programm geschrieben, 
und festgestellt, dass das SDRAM nicht so ganz zuverlässig funktioniert. 
Gelegentlich kippt mal ein Bit. Ich schiebe die Schuld jetzt einfach mal 
auf das optimistische Timing ;-) denn der Rest passt ja jetzt, denke 
ich?
#1328585
Lesenswert?

Verändere mal deine Timings auf folgende Werte:
1
  EMCDynamictRP = 3;
2
  EMCDynamictRAS = 5;
3
  EMCDynamictSREX = 2;
4
  EMCDynamictAPR = 2;
5
  EMCDynamictDAL = 5;
6
  EMCDynamictWR = 3;
7
  EMCDynamictRC = 6;
8
  EMCDynamictRFC = 6;
9
  EMCDynamictXSR = 2;
10
  EMCDynamictRRD = 3;
11
  EMCDynamictMRD = 3;

Und fast am Ende wird EMCDynamicRefresh bei dir auf 19 gesetzt. Mach 
dort mal eine 0x23, also 35 dezimal.

Das sind zumindest die Werte, die ich bei meinen Microns bei 72MHz 
nutze. Man müsste nochmal ins Datenblatt der ISSI-Chips schauen und 
deren Werte umrechnen. (Im Datenblatt stehen immer ns-Werte. Der 
Controller will aber Taktwerte haben.)

Jetzt sollte es eigentlich besser aussehen.
OP #1329165
Lesenswert?

Hi Robert,
nee es ist eine Rev "B" die ich hier habe.
Andere Frage:
ich bin ein bisschen skeptisch, was den Treiber im Chip angeht. Der muss 
ja bei 72 MHz ganz ordentlich Dampf haben, wenn er die Clock-Leitung, 
die ja schon einiges an Länge haben kann, so schnell umschalten muss! 
und die Flanken müssen dabei immer noch ordentlich sein. Kannst du mir 
vielleicht sagen, warum die bei mir so schlecht sind? Sie sind ja sogar 
am CLKOUT1-Pin, der ja gar keine angeschlossene Last hat, schlecht!
Wäre es vielleicht eine gute Idee, bei einem Redesign dort einen 
externen Buffer vorzusehen? respektive zwei, einen pro SDRAM-Chip.

@Kai
also, ich werde die Timings mal erhöhen, aber ich muss ehrlich sagen: 
ich bin enttäuscht, wie schlecht das funktioniert. Eigentlich habe ich 
das Datenblatt vom ISSI durchgelesen, und die Timings so berechnet, dass 
es klappen sollte. Angenommen, ich fahre 40 MHz ergibt das eine 
Periodendauer von 25 ns. Dann habe ich einfach alle Zeiten, die im DB 
aufgeführt sind durch diese 25 ns geteilt und aufgerundet. Das ergibt 
dann die Werte, die ich in die Register rein schreiben muss. Richtig?
Dann MUSS es doch einfach funktionieren.
Langsam bin ich mit meinem Latein am Ende :-(
Gast #1329203
Lesenswert?

Wie sieht bei dir die Versorgung des Controllers aus.
Ist das Layout dieser schlecht, kann durchaus auch hier
der Grund für die unsauberen Pegel bzw. Flanken liegen.

Die Sache mit den Buffern würde ich nicht in Betracht ziehen.
Die verlängern deine Signallaufzeit des Takts zu den restlichen
Signalen. Da musst du erst kucken wieviel Spiel du hast.
OP #1329214
Lesenswert?

Hi Tobias,
Also die Versorgung habe ich mit Planes gemacht.
Einen Layer mit 3.3V und einen mit GND. Durchgehend, nirgends 
unterbrochen.
Und dann halt bei jedem Pin mit einem kurzen Stück Leiterbahn (so ca. 3 
mm) rausgefahren und dort ein Via platziert, welches den Pin 
entsprechend mit GND oder VCC verbindet. Das ist doch schon richtig so 
oder?
Jaa, und dann die Abblock-Cs. Die habe ich vorgesehen, aber noch nicht 
alle bestückt, weil ich nicht mehr genug da hatte :-(
Die SDRAMs sind aber beide vollständig abgeblockt, der Controller leider 
nur teilweise. Meinst du das macht so viel aus?
#1329260
Lesenswert?

Hallo Tobias,

ich habe mir gerade nochmal deinen Schaltplan angeschaut. Du hast deine 
Abblockkondensatoren alle nur mit 10nF ausgelegt. Ich habe hier überall 
100nF. Am Controller habe ich 13x 100nF in 0402. Du hast hier nur 11x 
10nF.
An den SD-RAMs habe ich jeweils 7x 100nF in 0603. Du hast hier nur 3. 
Vermutlich nur an den VDD-Pins, nicht an den VDDQ. Könnte natürlich eine 
Erklärung sein.

Vielleicht kannst du in diese Richtung noch etwas probieren.

Zu den Timings: Prinzipiell ist dein Vorgehen richtig. Wenn du den 
Controller aber mit 72MHz betreibst, dann hast du nurnoch eine 
Periodendauer von 13,88ns.
OP #1329275
Lesenswert?

Hallo Kai,
also das mit den 10 nF liegt an folgendem:
ich habe mit meinem Chef vor einiger Zeit eine lange Diskussion darüber 
geführt, ob man 100 nF Kondensatoren oder irgend etwas anderes braucht. 
Er ist aber DER EMV-Guru; er meinte bei einer Leiterplatte >= 4 Lagen 
sind 10 nF besser als 100, deshalb habe ich 10 verbaut. Ob es wirklich 
so ist, kann ich nicht beurteilen, aber ich besorge mir heute Nachmittag 
ein paar 10 nF unfd versuche es damit mal. Vielleicht hat er ja Recht 
;-)

> Wenn du den Controller aber mit 72MHz betreibst, dann hast du nurnoch eine
> Periodendauer von 13,88ns.

Jaaa, schon, aber bei dir läuft er ja auch noch mit 96 MHz ?!
ich frage mich aber vor allem, wieso die Pegel nicht sauber auf 0 runter 
kommen....
Gast #1329282
Lesenswert?

Und das haben Chefs leider so an sich. Meiner denkt auch er wäre
der EMV Guru höchst persönlich. Allerdings durfte das Redesign des
letzten 8 Layers ich machen, nachdem die ersten Protos floppten ...
OP #1329289
Lesenswert?

@Tobias
Hehe, jaaa.... meinst du 10 nF sind Quatsch?
Ein bekannter von mir arbeitet in einer Firma, welche irgendwelche 
Sachen mit High-Speed digital Zeugs machen, so mit Frequenzen im 
GHz-Bereich. Der sagt sogar, an jedem VCC-Pin muss 1 x 10pF, 1 x 1 nF 
und 1 x 10 nF sein, und dann verteilt auf der Platine 100 nF und Elkos 
mit 1 u. Was sagst du denn dazu?
#1329294
Lesenswert?

Ich will deinem Chef jetzt echt nix unterstellen, aber diese Aussage 
kommt mir etwas überholt vor.
Ich kann es mir nur so vorstellen: Früher, als die 
Kondensatortechnologie, d.h. die Keramiken, noch nicht so gut waren, 
hatte man das Problem, dass die größeren Kondensatoren schlechtere 
Keramiken und somit ein schlechteres Ansprechverhalten hatten. Heutige 
Kondensatoren bis hin zu 10uF und sogar noch höher bestehen selbst in 
0805 aus X5R oder X7R. Damit sollte sich das marginal schlechtere 
Ansprechverhalten eines 100nF gegenüber 10nF durch die höhere Kapazität 
locker ausgleichen.
Mein "Lehrmeister" setzt auch überall 100nF als Abblockkondensator ein. 
Wenn es etwas kritischer ist, dann kommt noch ein 1nF dahinter. Und wenn 
es ganz ordentlich sein muß, dann kommt davor noch eine Ferritperle und 
ein Kondensator.
OP #1329300
Lesenswert?

@Kai
okay, deine Erklärung hat auch was für sich.
Nun gut, notfalls könnte ich ja immernoch 100 nF einlöten statt der 10 
nF.
Btw.: ist dein Board eigentlich auch ein selbst gemachtes? hast du das 
professionell bestücken lassen oder wie? du sagst du hast 0402 drauf. Da 
braucht man ja ein Mikroskop ;-)
Gast #1329312
Lesenswert?

In der Beziehung scheiden sich die Geister.

Auf der einen Seite möchte man über ein möglichst breites
Spektrum einen niedrigen Impedanzverlauf erzielen.
Deswegen setzt man gerne unterschiedlich große Cs ein.
Das ist jedoch ein Fehler der sich seit Jahren in der
Schaltungstechnik fortpflanzt.
Das Problem liegt darin, dass unterschiedliche C-Werte genommen
werden die Baugröße jedoch gleich bleibt. Allerdings wird die
parasitäre Induktivität der Cs durch die Geometrie und damit der
Bauform bestimmt, nicht durch den Wert des Kondensators.

Auf der anderen Seite kann eine "unglückliche" Wahl deiner
C-Werte zu einem sauberen Parallelschwingkreis führen.

Ich blocke deswegen grundsätzlich nur mit einem C-Wert ab.

Wenn du Zeit hast, lies dir mal diesen Artikel durch.
http://www.eue24.net/pi/index.php?forward=downloadPdf.php&p=mJ3rC2nsGxWFBanjU.jGmQF3Ccl_ExFxccClnMfiMg3pRUO0SLjfEtfros@@G@I0PVRxmd8uaJOnQULfAxj_HXyzBcTor_ZxV_NXHQBuqthscYWqAh.vEg.GYEO9
#1329315
Lesenswert?

Also das Board wurde von mir entwickelt. Bisher gibt es zwei Prototypen, 
die ich beide per Hand bestückt habe. Insgesamt sind da jeweils gut 300 
Bauteile drauf. Die passiven Bauteile sind fast ausschließlich in 0603. 
Die Abblockkondensatoren am LPC sind in 0402 und ein paar größere Cs 
(1µF-10µF) sind in 0805. Ansonsten noch ein paar größere Elkos.
Die Serie wird noch einmal ein wenig überarbeitet und dann professionell 
bestückt.

Also ich muß sagen, dass sich 0402 noch ganz bequem bestücken lässt. Da 
sehe ich keinen großen Unterschied mehr zu 0603 (das richtige Werkzeug 
vorausgesetzt). Ab 0201 macht es dann aber auch keinen rechten Spaß 
mehr. Aber das setzte ich nur in der größten Not und bisher auch nur 
privat ein.
OP #1329327
Lesenswert?

@Tobias
danke für den Link. Der Artikel sieht recht interessant aus.
Ich habe mir jetzt auch auf die schnelle ein paar 10 nF besorgt (mein 
PDA musste dran glauben.... da waren tatsächlich noch ein paar 0603 
drin).
Und ich kann es kaum glauben, aber!!! die SDRAM scheinen jetzt 
tatsächlich zu funktionieren. Es kippt kein Bit mehr, die Flanken sind 
nochmal etwas besser geworden. Ich habe nochmal ein RAM-Test Programm 
geschrieben. Erst wird alles mit 0 überschrieben, danach mit 0xAAAAAAAA 
und dann mit 0x55555555. Nach jedem Überschreiben wird alles überprüft. 
Nach 10 Durchläufen kein Fehler. Dann wird in jede Speicherzelle die 
Adresse der jeweiligen rein geschrieben. Hier bis jetzt nach 5 
Durchläufen kein Fehler. Scheint also tatsächlich an den blöden 
Kondensatoren gelegen zu haben!
OP #1329347
Lesenswert?

Was wars denn für ein Proto?
hehe, ich hab auch an einer Stelle einen falschen Footprint. Tja, ich 
hätte die Reihenfolge bei der Pinnummerierung kontrollieren sollen.... 
Auf jeden Fall sind da jetzt 2 Pads über Kreuz verdreht. Mit ein 
bisschen Wrap-Draht lässt sich das allerdings recht gut retten ;-)
#1329352
Lesenswert?

Also auf dem Board werkelt ein LPC2478 im LQFP208 mit zwei Micron SDRAMs 
(MT48LC16M16A2P), ein MicroSD-Kartenhalter, ein Touchscreen-Controller 
(TSC2046), ein Atmel Dataflash (AT45DB161D) und ein 4,3"-TFT mit 
Touchscreen von Sharp (LQ043T1DG02) sowie ein DAC8551 + LM386 für 
Sound-Ausgabe. Der Rest der Schaltung (Analogteil) ist 
Applikationsspezifisch und dazu will ich hier nicht mehr ausführen, da 
es sich dabei um ein kommerzielles Produkt handelt.

Privat bin ich aber im Moment noch über einem recht universell 
gehaltenen Board mit LPC2478, 64MB SD-RAM, USB-Host/Device, Ethernet, 
SD-Karte, NAND-Flash, VS1053 und ein paar anderen Kleinigkeiten. Der EMC 
wird 16-Bit breit und gepuffert über einen Steckverbinder verfügbar 
sein, sodass man noch Memory-Mapped-Devices anbinden kann. Außerdem gibt 
es einen Steckverbinder für die ganzen LCD-Signale und einen weiteren 
Steckverbinden für sonstige IO-Pins, die noch nicht genutzt sind, bzw. 
die man mehrfach nutzen kann.
Das Board ist 110x100mm² groß und die Stecker (USB-Device, USB-Host, 
Power, Ethernet, Audio, ...) sind auf einer Seite (100mm lang) 
herausgeführt, sodass das Board recht einfach in einem Gehäuse verbaut 
werden kann.
OP #1329364
Lesenswert?

@Kai
wow, coole Sache! Das mit dem LCD klint auch interessant.
Ich möchte dann, wenn ich alles getestet hab, und es funktioniert, auch 
was ähnliches machen. Halbe Europakarte, also 100 x 80, und da drauf 
sollen SD-Karten, irgend ein Flash mit paar 100 MB sowie natürlich SDRAM 
und Etherne. Ein kleiner FPGA soll dann als Memory-Mapped IO-Controller 
fungieren; er könnte dann vielfältige I/O Aufgaben übernehmen....
Jaa, irgend sowas bin ich am planen. Deshalb habe ich erstmal diesen 
Prototypen hier gebastelt, um alles testen zu können (jetzt sehe ich 
z.B. wie heikel SDRAM ist!).
Gast #1329388
Lesenswert?

Ja, in der Richtung bin ich mir immer noch unschlüssig.
Wollte anfangs alles auf ein Board schmeisen. Allerdings
bin ich in den letzten Tagen immer mehr zum modularen Aufbau
abgedriftet und wollte sowohl auf dem uC Board einen FPGA und
dann auf den Modulen wieder jeweils einen FPGA verwenden um
eine möglichst hohe Datenrate zu gewährleisten.
#1329405
Lesenswert?

Naja, zocken will ich damit auch nicht, aber wenn du ein Display mit 
VGA-Auflösung (640x480) über den UART mit 500kBaud mit Pixeldaten füllen 
willst, dann braucht das immerhin gut 12s. Ich denke mal, dass das 
Display irgendwelche Zeichenoperationen (Punkt, Linie, Rechteck, Kreis, 
...) unterstützt, aber für alles was darüber hinausgeht, ist es doch 
sehr langsam. Da kann man nur hoffen, dass es Double-Buffering 
unterstützt.
Nee, aber mal ehrlich: Für einfache Visualisierungen mag es gut sein, 
aber wenn du eh schon den LPC2468 einsetzt, dann kannst du eigentlich 
auch gleich den LPC2478 nehmen und ein LCD dranhängen. Ich muß aber 
ehrlich zugeben, dass sich das Layout doch um einiger verkompliziert, 
aber es ist auf 4 Lagen durchaus möglich. (Das Display ist bei mir 
übrigens 24 Bit-breit angeschlossen.)

Wenn ich den erwische, der das Pinout des LPC24xx verzapft hat, dann ... 
;-)
OP #1329473
Lesenswert?

Aaah, ja dann ist das ja kein Problem ;-)
Sag mal Kai, noch ne Frage wegen des Datenbusses der SDRAM.
Sollte man den auch terminieren? Und wie sollte die Terminierung beim 
Clock aussehen? Tobias meinte ja, dass man eine Serieterminierung 
eigentlich nur bei Punkt-zu-Punkt Verbindungen machen sollte. Wie siehst 
du das?
Ich habe mir nur grade überlege - wenn dann noch der FPGA am Datenbus 
hängen soll, dann wird es ja immer schwieriger eine gescheite 
Terminierung zu machen.....
OP #1329483
Lesenswert?

Aaaaha. Jaa...
Hmm diese LVDS-Geschichte muss ich mir später noch genauer ansehen.

Aber wie der FPGA mit dem uC verbunden wird, das Problem bleibt! Wo soll 
denn da die Terminierung sitzen? Zumindest beim FPGA braucht es ganz 
sicher eine, schon bei einem Cyclone II sind die IOs sauschnell (500 ps 
rise time, wenn ich mich recht erinnere? stand irgendwo so was im 
Datenblatt....).
#1329488
Lesenswert?

Also von einer Terminierung des Datenbusses würde ich bei so kurzen 
Verbindungen absehen. Das absolut wichtigste ist, dass die Clock-Leitung 
recht sauber ist. Ich versuche bei sowas auch irgendwelche 
Sternverbindungen bzw. Abzweigungen zu vermeiden.
Wenn man den FPGA an den Datenbus hängt, dann ist es schon eine Frage 
der Platzierung, relativ zum Speicher und zum Controller. Kann man den 
SDRAM sauber zwischen den Controller und den FPGA routen und sind die 
beiden (µC und FPGA) nicht zu weit voneinander entfernt, so würde ich 
darauf versichten. Lediglich den Steuerleitungen würde ich eine 
Serienterminierung gönnen. Ist der FPGA noch weiter entfernt, oder 
hängen noch mehr Teilnehmer am Bus, so würde ich hinter den SDRAMs auch 
einen Bustreiber vorsehen, so wie ich es jetzt auch bei dem oben 
genannten Board mache.
OP #1329497
Lesenswert?

Könnte man den Bustreiber auch direkt an den LPC schalten? Ich bin mir 
nur nicht ganz sicher, mit welchem Signal man dem Bustreiber die 
Richtung vorgeben kann. Verwendet man SRAM, dann ist das klar: das 
Signal \OE legt fest, ob der Bustreiber in die eine oder in die andere 
Richtung treiben soll. Bei SDRAM gibts aber kein \OE.....
OP #1329517
Lesenswert?

Könnte man das SDRAM aber auch NACH den Bustreiber schaten? Das war ja 
eigentlich meine Frage ;-) Dass es funktioniert, wenn die SDRAMs vor dem 
Treiber sind, ist klar.
Der FPGA wird dann so programmiert, dass er sich wie ein SRAM verhält, 
oder? Also dass du per Adressbus ein Register auswählen kannst und per 
\WE wird was reingeschrieben und mit \OE raus gelesen. Richtig?
OP #1329528
Lesenswert?

> Direkt ist halt schneller, braucht aber auch die ganzen Adressleitungen.

Wie viele Adressen man braucht hängt ja auch davon ab, wie viele 
Register im FPGA adressiert werden sollen oder. Was schwebt dir da vor? 
Routest du den ganzen Adressbus des LPC zum FPGA? Das wird ja ein riesen 
Aufwand!
Ich persönlich würde wahrscheinlich nicht mehr als 10 Adressleitungen 
zum FPGA führen. Den Datenbus dafür 32 Bit breit, so kann man doch 
immerhin 1024 Register zu 32 Bits ansprechen. Was wohl reichen sollte, 
oder nicht?
Gast #1329529
Lesenswert?

Tobias, denke immer an das KISS-Prinzip. Du scheinst noch
im Studium zu sein, sehe ich das richtig ?
Du wirst noch einige schmerzliche Erfahrungen machen müssen.
Keep it simple, stupid kann dir aber bei 99% aller Probleme
den Hals retten :)
Gast #1329532
Lesenswert?

Zum FPGA, alle Adressleitungen wird man nicht brauchen.
kommt drauf an in welchem Bereich der Map man die Daten sehen möchte.

Wir sollten uns wirklich mal genauer austauschen.
Über dieses vertrollte Forum hier gehen leicht Sachen unter.
So hat ein offensichtlich überforderter Mod meine ersten
Posts gelöscht ....
#1329534
Lesenswert?

Naja, man muß die ganzen Samples des ADC ja auch irgendwo puffern, d.h. 
er hat selbst auch noch einen Speicher. Nun gäbe es halt die Möglichkeit 
diesen Samplepuffer direkt auf den Bus zu mappen, d.h. der LPC könnte 
sich dann jedes beliebige Sample aus dem Speicher des FPGA holen, ohne 
vorher in einem Register sagen zu müssen, welchen er denn gerne haben 
würde. Das heist natürlich nicht, dass der Speicher des FPGAs direkt am 
LPC hängt, sondern nur, dass der FPGA direkt auf die Anfordung am 
Adressbus reagiert und den Wert am Datenbus anlegt.
OP #1329540
Lesenswert?

@Kai
also, ich habe mir eigentlich überlegt, dass es doch eine 
'Verschwendung' von Platz wäre, wenn man alle Adressleitungen verbinden 
würde.
Stattdessen sieht man im FPGA ein "Datenregister" vor. Liest man aus 
diesem, dann holt sich der FPGA immer das letzte Sample vom ADC. So muss 
man nur von einer Adresse lesen, kann aber trotzdem alle Samples des 
ADCs holen.
Mit dem DMA des LPC kann man das sogar auch einstellen, dass er Daten 
immer von der selben Adresse holt. Ich weiss im Moment aber nicht 
auswendig, ob der DMA auch auf den EMC zugreifen kann....
OP #1329543
Lesenswert?

@Tobias
naja, ich habe erst eine abgeschlossene Berufslehre. Aber ich befasse 
mich, wie du merkst, privat sehr viel mit Elektronik ;-) Aber sonst eher 
Leistungs-Sachen, also Motorsteuerungen, Schaltnetzteile... meine 
praktische Abschlussarbeit war ein 1 kW Frequenzumformer.

@Kai
wir können ja Email Adressen austauschen. Deine hab ich ja ;-)
#1329549
Lesenswert?

Der DMA des LPC kann auf den EMC und den USB-RAM zugreifen, d.h. er 
könnte immer Daten vom FPGA holen und im 16kByte USB-RAM ablegen. Dann 
wieder von dort in den SD-RAM.

Also alle 24 Adressleitungen würde ich NIE verbinden. Das ist absoluter 
Overkill. Ich hätte an max. 16 gedacht. Evtl. reicht es ja auch den 
Datenbus 16 Bit breit anzubinden. Der ADC hat ja eh "bloß" 8 Bit. So 
könnte man bei zwei Kanälen auch ein Sample von beiden Kanälen einlesen, 
aber darüber kann man sich ja noch Gedanken machen.
Ich würde es nur vermeiden, das Ding komplett indirekt anzubinden.
Gast #1329586
Lesenswert?

Warum nicht, würde gut passen.
Es wurmt mich nur, dass ich mir schon eine Stunde lang (wohlgemerkt auf
der Arbeit) einen Namen für mein Projekt habe einfallen lassen.

e-TOval

Naja, eigentlich egal, der Inhalt muss stimmen :)
Gast #1329592
Lesenswert?

Ach schnick schnack, ich stimme dem TTKprojects zu.
Tobias (hubertus) ist damit quasi schon überstimmt :)
So muss eine Demokratie laufen ... ich klinke mich
jetzt mal für die nächsten Stunden aus und melde mich
dann heute abend in der bis dahin hoffentlich schon
vorhandenen yahoo group.
Meine E-Mail: Sepu2k@gmx.net
Gast #1329820
Lesenswert?

Der Troll ist wieder da :)
War wohl weil ich gestern in einem der vielen Troll Threats
einen etwas fieseren Seitenhieb ausgeteilt habe ...
Ich denke dass alle Posts die an diesem Tag unter meiner IP gemacht
wurden einfach deleted wurden.
Nun zur User Group.
Wie siehts aus Kai ?
Gast #1329832
Lesenswert?

Oh mach dir keine Sorgen, ich war wohl nur einer von vielen die da 
gestern
ihren Beitrag geleistet haben wenn man das so sagen kann.
Eigentlich hatte ich gehofft dadurch etwas silence zu erwirken ...
war ehr das gegenteil :)
#1329871
Lesenswert?

Tobias Plüss schrieb:
> Kai,
>
>> Ich bin begeistert! :-)
>
> wovon? von unserer Group oder von dem Link den ich gepostet hab? ;-)

Eigentlich davon, dass wir es nun alle in die Group geschafft haben.

@Tobias:
Ja, so sehr schnell sind die Yahoo Groups leider nicht. Aber ich denke, 
dass wir damit leben können?!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren