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
Warum probierst Du es nicht? Die Hardware zu verstricken, sollte doch kein Problem sein. Sei ein Pionier!
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)???
Casey Burns schrieb: > Die Codezeile > uint16_t Adress = &PORTA; uint16_t Adress = (uint16_t) &PORTA;
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.