Guten Abend,
ich habe die letzten Tage fast alle zum Thema passende Foreneinträge
durchgelesen, leider ohne Erfolg. Deshalb wollte ich mein Problem
nochmals direkt schildern. Ich bin auch noch relativ unerfahren auf dem
Gebiet der yC-Programmierung, also seid bitte nachsichtig, wenn ich
offensichtliche Sachen falsch gemacht habe.
Ich versuche seit einigen Tagen mittels STM32 (L476RG) den DDS AD9833
über SPI anzusprechen, um ein Sinussignal zu generieren. Dies sollte
theoretisch (Datenblatt AD9833) nach folgendem Muster ablaufen:
STM sendet via SPI 5 16-Bit lange Befehle in Folge. Ein Word für einen
allgemeinen Reset zu Beginn, dann 3 Words mit Informationen zur
gewünschten Frequenz und Phasenlage und zum Schluss einen Ausgabebefehl
mit der gewünschten Signalform,...
Das ganze über 3 GPIO-Pins mittels Bit Banging realisiert funktioniert
auch problemlos. Ich kann die 5 Befehle aus dem Programming Manual
(https://www.analog.com/media/en/technical-documentation/application-notes/AN-1070.pdf)
auf Seite 3 problemlos senden und erhalte auch den geforderten 400 Hz
Sinus.
Jetzt möchte ich jedoch das Teil statt über meiner simplen
GPIO-Ansteuerung mittels der HAL-SPI-Treiber ansteuern, um das ganze
etwas professioneller zu machen (Habe auch ein paar Delays zum Timing
bei der Bit Banging Methodik verwendet, welche ich so eigentlich simpel
los werden wollte).
Mein Problem wie bei einigen anderen im Forum ist jedoch, dass der
AD9833 gar nicht bis rein zufällig auf die ihm übertragenen Daten
reagiert, was ich mir persönlich nicht erklären kann. Meist erzeugt er
trotz Übertragung der Befehlsfolge gar keinen Output, manchmal völlig
andere Frequenzen oder sogar andere Signalformen (wie als ob ein Bit
verrutscht wäre).
Im Anhang habe ich 2 Oszi-Screenshots. 1x die Chip-Select Leitung,
welche die 16 Bits umrahmt, 1x die gesendeten Datenbits des
1.Reset-Befehls (0010 0001 0000 0000) (0x2100). Die Serial Clock ist in
beiden Bildern in rot dargestellt.
Die Amplituden sind gleich groß, habe zur Übersichtlichkeit CH1 nur
vergrößert dargestellt.
Aus dem Datenblatt
(https://www.analog.com/media/en/technical-documentation/data-sheets/AD9833.pdf)
konnte ich folgende Anforderungen an die Kommunikation übernehmen (S4, S
20,S 13FF):
- Zwischen Befehlen soll die SCLK auf High, auch bevor die CS-Leitung
auf High geschaltet wird
- Datenaufnahme bei fallenden Flanken der SCLK
- nicht mehr als 16 fallende Flanken zwischen dem CS-Rahmen
- Allgemeine Timing-Informationen wie minimale High und Low-Zeiten (ca
10ns)
Meiner Meinung nach erfüllen meine ausgegebenen Bitwörter (Screenshot)
jedoch alle Bedingungen korrekt. Trotzdem streikt die Kommunikation.
Kann jemand einen Fehler erkennen? Hat vielleicht schon mal jemand in
dieser Konstellation mit dem AD9833 gearbeitet? Vielen Dank für eure
Hilfe.
Weiter noch mein Code, welcher die Übertragung generieren soll:
Ich weiß die Übertragung ist nicht schön gelöst, aber wollte erst mal
generell so meinen IC zum laufen bekommen.
Vielen Dank für alle Hilfen und Sorry für die längere Erklärung!
Hallo,
wenn Du per Bitbanging eine Kommunikation hin bekommst, die auch
funktioniert, dann mach mal davon Oszi Aufnahmen und vergleiche die dann
mal mit denen, die per HAL Ansteuerung rauskommen - ich nehme mal an,
dass dort ein Unterschied zu sehen sein wird.
(Kann man die Zeitachse auf den Ausdrucken nicht irgendwie normieren -
also 10us(25us)(50us)/DIV oder so?)
Und auch einmal groß reinzoomen in nur eine Taktperiode um die Zeiten
zwischen CLK und DAT Versatz zu sehen.
Gruß
TK