mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATXMEGA128A1 synchrone SPI-Ausgabe


Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..?

Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank an alle!

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.