Forum: Mikrocontroller und Digitale Elektronik mehrere XmegaA1 per EBI verbinden?


von Casey Burns (Gast)


Lesenswert?

Hallo Zusammen,

ist es möglich meherere XmegaA1(U) per EBI (SRAM/ALE1) zu koppeln?
Die idee ist, einen als BUS-Master zu verwenden, der das EBI betreibt.

Eine Anzahl von Slaves, auch XmegaA1(U), sollten den Zugriff auf die vom 
Master angelegte Adresse erlauben und die entsprechenden Daten 
zurückgeben bzw. dort hin schreiben.
Ein Ansatz wäre der interne DMA-Controller des Slaves. Wäre nur die 
Frage obs geht und das EBI des Masters noch mit 32MHz zu betreiben wäre,
ohne dass die Slaves (selbst bei 32MHz) nen Rappel bekommen.
Ohne WaitStates wird nicht funktionieren, aber können die maximal 7 
Waits dafür ausreichen um Daten beim Lesen sicher am Datenbus anliegen 
zu haben?

Die Idee dahinter ist mein vorheriger Beitrag:
Beitrag "XmegaA1U als I/O-Controller"

Der Zugriff könnte per !CS-Signale auf bis zu 4 Slaves stattfinden,
oder per A16..A19 sogar auf bis zu 16 Slaves (natürlich unsinn), was 
eine massive Anzahl an I/Os und Funktionen zur verfügung stellt.

Grüße
Casey Burns

von Casey Burns (Gast)


Lesenswert?

hat keiner Erfahrung damit?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Warum probierst Du es nicht? Die Hardware zu verstricken, sollte doch 
kein Problem sein. Sei ein Pionier!

von Casey Burns (Gast)


Lesenswert?

Ich muss den Thread doch noch einmal reaktivieren, da mir das Thema 
immernoch unter den Fingernäglen juckt.

Nach meinen bisherigen Ermittlungen ist eine direkte Verbindung zwischen 
zwei XMegas per EBI nicht so ohne weiteres möglich.

Ein Zugriff eines Masters auf einen (von möglicherweise mehreren) 
Slave(s) innerhalb des Slaves per DMA zu lösen funktioniert nicht, da 
verschiedene Register für den Datenbus eine rolle spielen (DIR, IN, 
OUT), die entsprechend der Anfrage des Masters gesetzt werden müssen.

Slaveseitig mit Interrupts zu arbeiten dauert entweder zu lange oder 
würde bedeuten, dass der Master mit reduzierter Geschwindigkeit arbeiten 
kann.
Laut Manual dauert Aufwachen aus IDLE + retten des PC + anspringen des 
ISR (worst case betrachtung) 11 Systemtakte. Danach beginnt erst die 
Bearbeitung des codes im ISR.

Alles in allem läuft mein Vorhaben auf eine Softwarelösung hinaus, die 
mit Port-Interrupts arbeitet.
Dazu eine Frage:
In der "iox128a1u.h" ist folgendes Definiert:
#define PORTA    (*(PORT_t *) 0x0600)

Um vom Master auf PORTA des Slaves zugreifen zu können, muss die Adresse 
des Ports übertragen werden auf die zugegriffen werden soll. Das gigne 
leichter, wenn ich in der Lage wäre die zu grunde liegende Adresse des 
PORTA (hier 0x0600) in ein uint16_t ablegen zu können um sie dann zu 
übertragen.

Die Codezeile
uint16_t Adress = &PORTA;

führt selbstverständlich zum Fehler, da der zu grunde liegende Datentyp 
Port_t ist und nicht konvertiert werden kann. Wie komme ich denn jetzt 
an die Adresse ohne mit einem riesen Berg an #define [Benennung] 
[Adresse] jede Registeradresse neu zu definieren (was in der 
Header-Datei ja eigendlich schon geschehen ist)???

von Christian K. (the_kirsch)


Lesenswert?

Casey Burns schrieb:
> Die Codezeile
> uint16_t Adress = &PORTA;

uint16_t Adress = (uint16_t) &PORTA;

von Casey Burns (Gast)


Lesenswert?

kleine Klammer, große Wirkung!
Simulator bestätigt den Inhalt der Variable.

Hätt ich auch selber drauf kommen können...

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.