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


von M. D. (derdiek)


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

von Purzel H. (hacky)


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 ?

von M. D. (derdiek)


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.

von Purzel H. (hacky)


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 ?

von malso (Gast)


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...

von Purzel H. (hacky)


Lesenswert?

Alternativ waere ein paar abgezaehlte Zyklen warten...

von M. D. (derdiek)


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^^

von Ralf (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.