Forum: Mikrocontroller und Digitale Elektronik LPC2294 und External Memory Controller


von Michael B. (m_blum)


Lesenswert?

Hallo an alle erstmal,

im Rahmen eines gerade laufenden Projektes arbeite ich mich in den
LPC2294 ein.
Beim in betrieb nehmen des EMC ist mir ein gerade nicht erklärliches
Verhalten aufgefallen.
Wenn ich den externen Bus als 8 oder 16 Bitbreit konfiguriere bekomme
ich Verzögerungen bei der Ausgabe von Daten. Wenn ich ihn aber als 32
Bit konfiguriere ist alles in Ordnung und ich erhalte keine
Verzögerung.

Kann mir bitte jemand erklären was ich übersehe!

PS.   IDCY = 0; WST1 = 0; WST2 = 30; RBLE = ja WP,BM nein;
        PINSEL2 = 0x0FE149E4;

von Dominic R. (dominic)


Lesenswert?

Könntest du "Verzögerung bei der Ausgabe von Daten" etwas näher
erklären?

z.B. wäre es ja verständlich, dass ein 32-bit Zugriff auf einem 8-bit
breiten Datenbus länger dauert als auf einem 32-bit breiten Bus.

Gruss,

Dominic

von Michael B. (m_blum)


Lesenswert?

Ich gebe eine int mit 255 aus, ohne andere Programmaufrufe.
Mit meinen Einstellungen dauert diese Datenausgabe ca. 500 ns,
danach habe ich die besagte Verzögerung von ca. 1.2µs (bei 8 Bit).

von Robert (Gast)


Lesenswert?

Also wenn Du in einer Schleife arbeitest und vom externen Bus die
Befehle holst, dann dauert das mit 16-bit doppelt so lange und mit
8-bit bus 4x so lange wie mit einem 32-bit Bus. Der Prozessor kann erst
einen weiteren Befehl ausfuehren, wenn die 32-bit beisamen sind.
Solltest Du im Thumb mode arbeiten, dann ist ein Befehl 16-bit breit
und sollte vom externen Bus gleich schnell laufen wie vom 32-bit Bus.
Im ARM mode (default) ist alles 32-bit breit.

Robert

von Michael B. (m_blum)


Lesenswert?

OK danke ,denke das ist es gewesen.

Gruß Michael

von Michael B. (m_blum)


Lesenswert?

Hallo ist anscheinend doch noch nicht ganz gegessen!
Habe immer noch Verständnis Probleme bei dem EMC.
Ich möchte konkret einen Flash an den EMC anschließen.
Dieser besitzt einen 19Bit Adr- und 16 Bit Datenbus. Nach Datenblatt
habe ich den Flash mit A1-A20 (vom LPC) angeschlossen und in Keil den
Startupcode  folgendermaßen eingestellt:
IDCY =1; WST1 und WST2 =5; RBLE =0;WP & BM =0;MW = 16 Bit
PINSEL2 ist folgendermaßen konfiguriert (PINSEL2 =0x0f000924), also
A1-A23 sind ein A0 ist aus, kein PLCK, kein CL2/3.

Dabei ergeben sich im Moment zwei Probleme beim Testen dieser
Einstellungen.

Erstens ist bei der 16Bit- Einstellung auf dem A1(LPC) also A0 am Flash
ein Takt egal ob ich auf Adressen mit A0 schreibe oder nicht. Bei der
32Bit Einstellung ist dieser nicht da, ist auch nicht auf A2(LPC). Gibt
es bei µVision3 noch Besonderheiten die man dazu wissen sollte?

Zweitens ist es für mich immer noch ein wenig unlogisch einen 8/16 Bit
Modus anzubieten wenn ich im Endeffekt eh immer 32 Bit ausgebe! Diese
dann aber auf die Entsprechende Busbreite anpasse und 4x1Byte oder 2x1
Word ausgebe um ein Lese- oder Schreibzyklus  durchzuführen. Liegt das
an dem Verwendeten Bustypen im LPC?

Danke für jeden hilfreichen Gedanken
  Michael

von roberto (Gast)


Lesenswert?

Hallo Michael,

Ich arbeite auch mit einem lpc2294,und versuche daten duch den external 
bus auszulesen.Ich bin aber noch anfänger und habe leider noch keine 
klare idee wie es zu implementieren ist ,außerdem habe ich den Abschnitt 
vom EMC in user manual durchgelsen aber habe ehrlich gesagt nicht so 
viel verstanden .Koenntest du mir vielleicht ein bisshen erklaeren was 
diese external memory ist?und hast du vielleicht konkrete beispiele wie 
man sie implementieren kann? Danke.

Roberto.

von Micha (Gast)


Lesenswert?

Möchtest du Daten von einem externen Device auslesen oder schreiben?
mit welcher Umgebung arbeitest du ? ich habe mit Keil gearbeitet

generell ist sieht ein Zugriff folgender maßen aus:
1
#define EMC_FLASH_5555 *((volatile unsigned short *)0x8000AAAA)//ADRESSE 1  anstadt 5555<<1=AAAA wichtig da hier ein 16-bit zu griff erfolgt und die adr A0 nicht verwendet wird !!!
2
3
#define EMC_FLASH_BASE *((volatile unsigned short *)0x80000000)//Beginn Flash bereich
4
5
EMC_FLASH_5555=0x00AA; // schreiben
6
Producer = EMC_FLASH_BASE; // lesen

wichtig ist hierbei das du den Bus aktivierst und die Daten breite 
einstellst
achja bei mir musste ich noch das Register PINSEL2 im Hauptprogramm 
nochmal neu setzen ohne dies ging es nicht.

von roberto (Gast)


Lesenswert?

aso,Danke für die schnelle Antwort.Ich möchte daten durch ein SPC3
von einem profi bus auslesen.Ich benutze Eclispse GNU gcc compiler.Ich 
werde es ausprobieren .Bis dann.

Roberto.

von Micha (Gast)


Lesenswert?

kein Problem

BCFG Register musst du noch setzen für das Timing und Busbreite
und den Adressbereich den du verwenden willst eventuell im Programm 
angeben

viel erfolg

PS: für GCC sollte es auch Bsp. geben die auf den externen bus zugreifen
kann di aber nicht mehr sagen wo!

von roberto (Gast)


Lesenswert?

ok Michael,
Danke sehr für die Antwort.Ich werde es ausprobieren.Danke
Grüß
Roberto

von roberto (Gast)


Lesenswert?

Hallo,

ich habe eine Frage über den Code den du geshrieben hast :
EMC_FLASH_5555=0x00AA; // schreiben
Producer = EMC_FLASH_BASE; // lesen

was ist producer?Außerdem wenn ich auslesen will wie soll ich WST1 
einstellen? oder lass ich es auf null genauso wie du gemacht 
hast???Danke.

Roberto

von Micha (Gast)


Lesenswert?

Producer ist eine Variable entsprechend dem typ der ADR- Definition 
(unsigned short)

WST 1 und 2 musst du auf die Geschwindigkeit deines Devices anpassen 
(ist abhängig davon wie schnell der ARM getaktet ist)

RBLe auch einschalten

von Roberto (Gast)


Lesenswert?

Danke Michael,

jetzt ist die Sache ein klarer.Ich werde versuchen einzuarbeiten.

Grüß
Roberto

von Roberto (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe diese Funktion kopiert und eingefügt in meinem Code für die 
Configurration von der externen memory.Meine Frage ist :jetzt hat man 
die BCFG registers und PINSEL2 konfiguriert,wie klappt jetzt mit dem 
auslesen und schreiben weiter oder sobald das SPC3 angeschloßen ist und 
es auch zu funktionalität gebracht wird,werden automatisch daten 
gesendet und empfangen von und zum µC?Danke.

Roberto.

von Micha (Gast)


Lesenswert?

ne automatisch geht da nix !
muss als erstes versuchen mal die ID oder ein Testregister vom Chip zu 
lesen und dann eines zu schreiben.
Im Anschluss daran musst du dir ne Bibliothek schreiben die die 
gewünschten Funktionen bereitstellt. Mit dieser kannst du dann arbeiten.

von Roberto (Gast)


Lesenswert?

aso ok,
und wie kann ich auf einem Register auf dem Modul zugreiffen??soll das 
im user manual vom modul beschrieben werden? und wenn ja wie kann das 
programm das ich für den µC geschrieben habe auf die hardware vom Modul 
zugreiffen??Danke.

von Sani (Gast)


Lesenswert?

hi Roberto,

hast du schon dein Problem mit LPC2294 schon gelöst?

gruss Sani

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.