SPI Frequenz ARM

OP #427673
Lesenswert?

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?
#432907
Lesenswert?

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.
#433006
Lesenswert?

@ 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
#433212
Lesenswert?

@  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 #433238
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren