SPI Frequenz ARM

OP #427673
Hallo!
Ich steuere mit einem AT91Sam7S einen AD9834 DDS über SPI an um 
verschiedene Signalformen zu erzeugen.
Da ich auch noch USB brauche, läuft der ARM mit 48MHz. Der DDS verträgt 
maximal eine SPI Frequenz von 40Mhz, also habe ich den 2x-Teiler 
gesetzt, SPI läuft also mit 24Mhz.
Leider ist die Ansteuerung des DDS etwa zu langsam, ich müsste also mit 
der SPI Frequenz höher gehen, wenn möglich auf 40Mhz.
Gibt es eine Möglichkeit die SPI Frequenz zu ändern und dabei auch noch 
die richtige Frequenz für USB bereitzustellen?
OP
Ich steuere mit einem AT91Sam7S einen AD9834 DDS über SPI an um
verschiedene Signalformen zu erzeugen.
Und je schneller der DDS angesteuert wird desto bessere Signalformen 
kommen am Ende raus.
40MHz SPI Takt wären optimal, im Moment habe ich 24MHz (FCPU/2)
Gast
Soweit habe ich das schon verstanden. Der AD9834 kann Sinus und Dreieck 
und die Signalform bestimmt doch der DDS. Ob ich den Baustein via SPI 
jetzt mit 1kHz Takt oder mit 40MHz Takt einstelle, ist doch egal.
Gast
@lukas,
das wird mit dem at91sam7s nicht gehen da sowohl sub takt als auch spi 
takt von MCK abgeleitet sind und die prescaler nur mit vielfachem von 2 
einstellbar sind.

gruss
gerhard
Der LPC214x verfügt über zwei PLLs, wobei die zweite PLL nur für die 
48MHz des USB da sind. Leider läuft das SPI Interface nur mit maximal 
PCLK/8, der SSC mit PCLK/2. Damit wären 30MHz möglich, falls dir das 
etwas hilft.

Gruss,

Dominic
Ist die Hardware, also der AD9834 DDS mit dem AT91Sam7S fest verdrahtet?

Ansonsten schließe den SPI Periperie Baustein über einen seperaten Port 
an den µC an. Setze den MCK meinetwegen wieder auf 48MHz. Programmiere 
einen der Timer auf 40 MHz und erzeuge dir einen Timerinterrupt. In 
diesem Interrupt erzeugst du das SCK Signal für deinen Baustein. Zwei 
andere Ports benutzt du für MOSI und MISO eine dritte Leitung für CS und 
programmierst dir deine SPI Schnittstelle einfach selbst.

So müsste es funktionieren.
@ Toni & Der Albi,

wann habt ihr das letzte mal eine Software geschrieben, die einen 
seriellen Kanal emuliert hat oder einen Timer programmiert??

Ein Timer kann im allgemeinen ganzzahlige Teilerfaktoren der 
Prozessorfrequenz erzeugen, Ausnahmen, ein paar PWM Timer mit PLL. Also 
40 MHz mit einem 48 MHz Takt, das ist echt schwierig!
Ein software SPI, obwohl generell einfach, kann im besten Fall so ca. 
CPU-Takt / 20 erzeugen, dann passiert aber sonst nicht mehr viel im 
System.

Konnte mir das nicht verkneifen :-|

Robert
Gast
Eine Zweiten Contoller eisetzen, der mit 40MHZ arbeitet und die Daten 
8-Bit Paralell vom ersten abnimmt bzw. zum ersten ausgibt. (SPI-Paralell 
Wandler)
@  Robert Teufel

Ich habe letztes Jahr einen I²C Bus auf einem 8051 Derivat nachgebildet, 
Du hast aber mit der Geschwindigkeit vollkommen recht. Ich hatte 12 MHz 
Taktfrequenz zur Verfügung, wobei 1Mhz effektiv galt. (Da ein Befehl 12 
Maschinentakte benötigt) und habe 400kHz realisiert. Das System war 
ausgelastet.

Aber es hat funktioniert. Und vieleicht braucht - luky - in seinem 
System nur einen SPI, dann ist die Auslasstung egal, aber er kann mit 
der Hardware arbeiten und muss nichts neues entwickeln.
Persönliche Seite
Keinen zweiten Controller verwenden, sondern ein einfaches 
Schieberegister mit etwas externer Logik, das mit 40 MHz Takt betrieben 
wird und parallel vom ARM mit Daten gefüttert wird. Nach Befüllen des 
Schieberegisters und "Triggern" der externen Logik werden 8 Taktimpulse 
an das Schieberegister gesandt und danach der Takt abgeschaltet.

Das müsste sich mit einem PLD o.ä. realisieren lassen.

Allerdings sollte man auch mal eine Realismusbetrachung anstellen.
Bei 40 MHz SPI-Takt stehen gerade mal 200 nsec für die Übertragung eines 
einzelnen Bytes zur Verfügung. Das auf dem Controller laufende Programm 
muss also schon sehr schnell die entsprechenden Daten heranholen können, 
auch ist zu klären, wie schnell der Controller überhaupt seine I/O-Port 
beschreiben kann. Die hier erforderliche Datenrate von 5 MByte/sec wäre 
beispielsweise mit einem der alten LPC21xx-Modelle gar nicht möglich.

Ein 48-MHz-Controller hat gerade mal 9,6 Taktzyklen pro Byte zur 
Verfügung.

Bei 24 MHz SPI-Takt stehen immerhin 333.- nsec für die Übertragung eines 
Bytes zur Verfügung, der 48-MHz-Controller hat aber auch hier nur 16 
Taktzyklen pro Byte zur Verfügung.

Ein ARM7 benötigt aber mehr als einen Taktzyklus für eine einzelne 
Maschineninstruktion.

Daher erscheint mir die Anforderung ziemlich realitätsfern.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.