AD9833 Datenwort per Hardware SPI schicken

OP #1905190
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.
1
int spi_wort_high, spi_wort_low; //8Bit
2
long int spi_wort; //16 Bit
3

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

8
SCK=0; //Übertragung starten 
9
SPDAT=spi_wort_high;
10
SPDAT=spi_wort_low;
11
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
OP #1905226
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.
#1905270
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 ?
OP #1905292
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^^
Gast #1905396
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

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