Forum: Mikrocontroller und Digitale Elektronik ATXMEGA128A1 synchrone SPI-Ausgabe


von Toni (Gast)


Lesenswert?

Hallo Leute,

vielleicht gibts ja schon jemanden mit ATXMEGA Erfahrung...?
Ich verwende momentan ein Gespann aus AT90CAN128 und FPGA. Damit mache 
ich:

Aufgabe1: 5 externe DACs über SPI mit 4MHz Takt synchron ansteuern (d.h. 
nur ein Taktausgang aber 5 verschiedene Datenleitungen). Grund: 
Leitungseinsparung (DACs sind galvanisch getrennt)

weiters möchte ich:

Aufgabe2: 16 PWM-Signale gleichzeitig vermessen (im Bereich bis 15kHz)

Aufgabe3: 4 PWM-Signale gleichzeitig generieren und invertiert/nicht 
invertiert an Push/pull Stufe ausgeben (bis 15kHz).

Das sollte ja theoretisch alles auch mit dem XMEGA128A1 alleine gehen.
Meine Frage: Hat schon wer ausprobiert, ob die 8 UARTS (im SPI-Modus) 
oder die 4 SPI-Schnittstellen synchron betrieben werden können?

Vielen Dank
Gruß
Toni

von Simon K. (simon) Benutzerseite


Lesenswert?

Die SPI könntest du mit viel Glück auch in Software hinkriegen bei 4MHz. 
Aber ob man dann noch das 15kHz Signal vermessen kann..


Andere Idee: Was ist denn, wenn du eine SPI Einheit als Master laufen 
lässt und die anderen als Slave. Dann nimmst du die Taktleitung vom 
Master und schließt sie (neben den DACs auch noch) an die Slaves an. Die 
Dateneingänge der Slaves bekommen die Datenausgänge der DACs. So kannst 
du alles mit einem Takt reintakten.

Den Takt kannst du statt mit einem SPI Master auch über einen Timer 
erzeugen.

von Toni (Gast)


Lesenswert?

versteh ich nicht:

Wenn nur 1 SPI Master ist, dann können die Slaves zwar den Clock 
mitbenützen, aber selbst nicht direkt Daten an die DACs raussenden. 
Stattdessen empfangen sie Daten von den DACs (was nicht geht, denn die 
AD5441 haben keinen Datenausgang, macht ja auch keinen Sinn?).

Wenn die Slaves aber aus anderer Quelle mit den zu schreibenden Daten 
gefüttert würden, tackern sie am MISO ebendiese wieder raus (verzögert). 
Das Problem dabei: einerseits die Verzögerung, andererseits die 
Datenquelle, die ja auch taktsynchron ausgeben muss....

Ist wohl doch nicht so einfach wie gedacht. Vielleicht kann ich die 5 
SPI-Übertragungen auch sequentiell starten (genau 1 Takt verzögert)? 
Dann kann das zuerst gestartete Wort noch 4 Dummy-Bits zu Beginn 
enthalten, die aus dem Empfangsregister des AD5441 hinten wieder 
rauspurzeln. Bis der letzte Master sendet, sind alle 5 Datenleitungen 
synchron. Problem dabei: wie kann ich die weiteren SPI-Master genau 1 
Takt später starten?

von Simon K. (simon) Benutzerseite


Lesenswert?

Toni schrieb:
> versteh ich nicht:
>
> Wenn nur 1 SPI Master ist, dann können die Slaves zwar den Clock
> mitbenützen, aber selbst nicht direkt Daten an die DACs raussenden.
> Stattdessen empfangen sie Daten von den DACs (was nicht geht, denn die
> AD5441 haben keinen Datenausgang, macht ja auch keinen Sinn?).
Stimmt, habe im Kopf an ADCs gedacht :-)
Aber andersherum geht's doch auch.

Stell dir vor die SPI Slaves sind einfach Schieberegister (Parallel In, 
Serial Out). Du gibst den Takt von extern an die SPI Slaves und die DACs 
raus. Dann wird das Byte aus den Slaves rausgetaktet und in die DACs 
rein.

von Toni (Gast)


Lesenswert?

Die SPI-Slaves sind tatsächlich Schieberegister, aber nicht parallel in 
sondern serial in! Und genau da liegt das Problem, wie bekomme ich einen 
synchronen seriellen Eingang für jeden Slave?

von holger (Gast)


Lesenswert?

>Und genau da liegt das Problem, wie bekomme ich einen
>synchronen seriellen Eingang für jeden Slave?

Da hat jetzt aber jemand ein ziemliches Brett vorm Kopf;)
Hat Simon doch oben schon erklärt.

von Simon K. (simon) Benutzerseite


Lesenswert?

Toni schrieb:
> Die SPI-Slaves sind tatsächlich Schieberegister, aber nicht parallel in
> sondern serial in! Und genau da liegt das Problem, wie bekomme ich einen
> synchronen seriellen Eingang für jeden Slave?

Pfff!
Slaves können auch senden.

Genauer gesagt haben SPI Teilnehmer (egal ob Master oder Slave) ein 
SI-PO und ein PI-SO Schieberegister.
Beim Slave liegt das SI-PO Register hinter dem MOSI Pin. Beim Master am 
MISO Pin.
Das PO-SI Register liegt am MISO Pin beim Slave und am MOSI Pin beim 
Master.

Noch mal:
Du baust dir ein SPI Netzwerk auf, wo es keinen Master gibt. Bzw. der 
Master erzeugt hier NUR den Takt und sendet keine Daten.
Das tut er, damit sich die Slaves gegenseitig synchron austauschen.
Die SPI Module im ATxmega müssen natürlich auf Slave gestellt werden.

von Toni (Gast)


Lesenswert?

@Holger:
sorry, ich habs wohl wirklich noch nicht geschnallt. Nämlich wie ich ein 
SPI-Slave-(Empfangs)-Schieberegister parallel laden kann?? Wenn das 
nämlich nicht geht, muss ich seriell meine Daten reinbekommen, damit sie 
am anderen Ende an die DACs wieder rauspurzeln können. Und da seh ich 
die Sync-Probleme.

von holger (Gast)


Lesenswert?

ATXMega:
Ein SPI Modul Master die anderen Slaves.
Clock an alle Beteiligten legen. Die Ausgänge der Slaves
im ATXMega an die DAC Slaves legen. Bevor der Master
sendet gibt er erst mal alle Slave Daten in die SPI
Register. SS low für die Slaves, Master schreibt in sein
SPI Register, und ab gehts! Völlig synchron.

von Toni (Gast)


Lesenswert?

Aha, scheint wohl doch zu gehen:

"When configured as a Slave, the SPI interface will remain sleeping with 
MISO tri-stated as long
as the SS pin is driven high. In this state, software may update the 
contents of the Data register,
but the data will not be shifted out by incoming clock pulses on the SCK 
pin until the SS pin is
driven low."

Also kann ich doch das Schieberegister parallel laden und dann nach /SS 
low und Taktanlegen damit rechnen, dass mein Inhalt an die DACs geht..?

von Toni (Gast)


Lesenswert?

Vielen Dank an alle!

von Simon K. (simon) Benutzerseite


Lesenswert?

Toni schrieb:
> Also kann ich doch das Schieberegister parallel laden und dann nach /SS
> low und Taktanlegen damit rechnen, dass mein Inhalt an die DACs geht..?

Natürlich, Lies dir mal die xmega AppNote von Atmel über das SPI durch. 
Der SPI Slave bekommt einen Takt und shiftet gleichzeitig Daten über 
MISO raus und über MOSI rein.

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.