www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AD9833 Datenwort per Hardware SPI schicken


Autor: M. D. (derdiek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo..
Habe vor mit einem 8051 mit Hardware-SPI-Schnittstelle ein 16Bit 
Datenwort in einen AD9833 zu senden. Da ich momentan leider noch keine 
fertige Hardware zur Verfügung habe wollte ich fragen ob das, was ich 
mir ausgedacht habe so funktionieren kann.
Habe mir das jetzt mit dem Datenblatt so zusammengereimt.
int spi_wort_high, spi_wort_low; //8Bit
long int spi_wort; //16 Bit

SPCON = 0x50; // SPEN=1, MSTR=1
spi_wort_high= (spi_wort & 0xFF00); //maskieren mit 1111 1111...
spi_wort_low=  (spi_wort & 0x00FF); //maskieren mit ...1111 1111

SCK=0; //Übertragung starten 
SPDAT=spi_wort_high;
SPDAT=spi_wort_low;
SCK=1; //Übertragung beenden

Das Problem was ich da jetzt noch sehe, ist das er mit den 
Clock-Impulsen durcheinander kommt und nicht beide Datenwörter 
hintereinander sendet..
Der 8051 kann leider nur 8 Bit Datenwörter senden, soweit ich weiß.
Hat da vielleicht noch jemand Verbesserungsvorschläge?

MfG Derdiek

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du nimmst an, dass die Uebertragung blockierend ist. Sonst wuerdest du 
nicht

SPDAT=spi_wort_high;
SPDAT=spi_wort_low;

schreiben. Ist das Schreiben blockierend ?

Autor: M. D. (derdiek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also im Datenblatt steht, das der 8051 nur 8Bit Daten sendet..
Der AD9833 braucht hingegen ein 2 16-Bit Wörter hintereinander.
In einer vorhergehenden Funktion habe ich schon dafür gesorgt das aus 
einem 32-Bit Wort 2 16-Bit Wörter gemacht werden.
Diese werden dann nochmal zerlegt in High und Low Byte.

Habe allerdings auch grad festgestellt, das SCK bzw SCLK garnicht 
erkannt werden vom Compiler, bzw das ich auch glaube garkeinen Einfluss 
darauf habe. Das startet alles von alleine sobald ich ein Datenwort is 
SPDAT schicke. Soweit ich das jetz verstanden hab.

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frage ist die Ausfuehrungszeit. Beim Befehl
SPDAT=spi_wort_high;
kann das eine Instruktion sein. Das Byte wird dem Register zugewiesen 
und fertig. Dann ist das byte aber noch nicht draussen. Beim schnellsten 
moeglichen Clock dauert der Vorgang 8 clocks. Wartet der Compiler bis 
das byte draussen ist bevor der nachste Befehl ausgefuehrt wird, oder 
nicht ?
Dann muesste der Compiler das Konzept des SPI verstanden haben ... was 
ich nicht glaube.
Ich denke, das zweite Byte wird grad danach demselben Register 
zugeschrieben, und ueberschreibt dadurch das erste Byte. Ich kann falsch 
liegen ... ueberpruef das mal.
Falls der compiler nicht von selbst wartet, wie koennte man per code 
warten ?

Autor: malso (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vermutlich muss ein Flag abgefragt werden um festzustellen ob der SPI 
fertig und bereit für neue Daten ist (wie beim UART) - möglicherweise 
auch über Interrupt...

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternativ waere ein paar abgezaehlte Zyklen warten...

Autor: M. D. (derdiek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ist allerdings was dran..
Der 8051 macht es so, das er die Daten aus dem SPDAT Register schiebt 
sobald das Shift-Register leer ist.. Sobald die Daten dann übertragen 
wurden setzt er das SPIF Flag. Das müsste ich also abfragen und dann mit 
der 2. Anweisung warten. Will nur mal hoffen das das für den AD9833 dann 
nicht zu sehr versetzt kommt..

Serial Peripheral Data Transfer Flag
Cleared by hardware to indicate data transfer is in progress or has been
approved by a clearing sequence.
Set by hardware to indicate that the data transfer has been completed.
This bit is cleared when reading or writing SPDATA after reading SPSCR.

Also mach ich ne Schleife die das SPSCR Register maskiert abfragt ob das 
Bit gesetzt wurde, und gehe dann einfach mal davon aus das das so klappt
:D

Danke für die Hilfe^^

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Controller genau verwendest du denn? Bei einigen kann man 
beispielsweise die CS-Leitung per Software bedienen, d.h. die Hardware 
gibt die Kontrolle für CS an die Software -> damit solltest du 16-Bit 
Daten problemlos senden können.

Ralf

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.