Hallo Community,
vielleicht kann mir jemand bei meinem Problem behilflich sein. Ich habe
schon einige Forenbeiträge hier durchgelesen, diese haben mir auch sehr
geholfen jedoch spuckt meine SPI-Schnittstelle immer noch nichts aus.
Ich möchte den AD9833 wie oben bereits beschrieben mit einem Cortex M0
über SPI ansteuern. Ich möchte nur an den AD9833 senden, also
Transmission only. Derzeit versuche ich nur das SPI zu initialisieren
und über MOSI in einer Schleife Daten zu senden.
Jedoch kann ich mittels Oszilloskop nichts an MOSI oder SCK messen,
außer "rauschen" ist da nichts.
Oben im Anhang habe ich die Codes eingefügt, werde aber auch hier
nochmal Teile einbinden.
initialisierung meines NSS, ich möchte NSS mittels normalem GPIO-Port
auf Low bzw. High setzen.
David K. schrieb:> SPI_InitStructure.SPI_
Mein lieber David, wenn ich so etwas lesen muß, wird mir schlecht.
Definiere die betreffenden Pins erstmal ganz einfach als GPIO und mache
das Ganze zunächst ganz simpel zu Fuß per Software, also dediziert
Pin_high..Pin_low und so. Lies dazu das Manual zum betreffenden IC.
Wenn dann dein DDS läuft und die richtige Wellenform ausspuckt, kannst
du immer noch die SPI-Schnittstelle anwerfen - aber geh dir nicht selber
auf die Nerven mit dieser unsäglichen bescheuerten ST-Lib und ihren
verquollenen hirnrissigen Pseudo-Schnittstellen a la XYZ_Initstructure
und so. Das Zeugs hat noch nie wa getaugt und wird bis in Ewigkeit
nichts taugen.
W.S.
W.S. schrieb:> Mein lieber David, wenn ich so etwas lesen muß, wird mir schlecht.
Guten Tag verehrter Herr / Frau W.S. :
Gleiches gilt, wenn ich Beitragseinleitungen wie siese lesen muß.
Wenn der STM32 Ihren anforderungen nicht genügt, gut.
Wenn Sie eine passende Alternative gefunden haben, besser.
Wenn jeder, die güt Ihn am geeigneteste Lösung finden darf, ideal.
Hallo David.K;
wenn ich nix überlesen habe hast du das "Clock" Signal vergessen:
Auszug aus meinem (mit STM32Cube) erzeugten Code:
Nur Auszüge ;-)
.....
/**SPI1 GPIO Configuration
PA5 ------> SPI1_SCK
PA6 ------> SPI1_MISO
PA7 ------> SPI1_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
.................
Warum fehlt NSS:
1. Funktioniert bei mir derzeit niur, wenn ich das NSS / CS = Chop
select Signal selber steuere, mag aber eher daran liegen das ich selber
ncoh Anfänger bin ;-).
.....
NSS / CS wie folgt deklariert:
/*Configure GPIO pin : PA4 */
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
.....
ImMeinen Fall folgt daraus die SPI Config wie folgt:
.....
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
HAL_SPI_Init(&hspi1);
......
Ein paar allgemeine Tips:
1. Logic / Busanalyser verwenden.
Ein solches Gerät erscheint mir hierfür hilfreich, im Zweifel ergänzend
zum Oszi.
Weil: Ich habe (Werbung) ein Zeroplus LogiCube, welches nicht nur
Anzeigt, ob auf dem SPI Bus "etwas" passiert, sondern was.
Warum ist das Wichtig:
a) zum Test ob/ wie Hardware oder Software NSS (besser) funktioniert.
b) Nicht jeder Chip mit SPI unterstützt jeden Mode =
Kombination aus "CLKPolarity" und "CLKPhase".
c) Mit welcher absoluten Geschwindigkeit arbeitet dein SPI
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
--> Bezogen auf die Taktrate des Pheripheriebusses !
Also:
Wenn du die grundlegende Funktion der GPIO Pins des STM32 verstanden
hast (W.S ;-))
1. Datenblatt des Controllers und AD9833 lesen
--> Es ist eben auch wichtig, was mann, wie , in welcher Reihenfolge
liesßt und sendet.
Wie beschrieben: Ein Busanalyser zeigt dier auch die gesendeten Daten
an, nicht nur ein "Muster".
2. Nochmal versuchen
3. Nicht den Mut verlieren.
Nochmehr Tips:
1. Ich finde den Konfigurator "STM32CubeMX" hilfreich.
Insbesondere zum Einstellen der Taktraten.
2. Achte darauf die richtige Version der Cube Library zu verwenden.
Ich hoffe ich konnte etwas weiterhelfen
Hallo David;
"Derzeit versuche ich nur das SPI zu initialisieren
und über MOSI in einer Schleife Daten zu senden."
"SPI_InitStructure.SPI_Mode = SPI_Mode_Master;"
Wenn ich nix überlesen habe:
MOSI: Master Out --> Slave In
MISO: Master In <-- Slave Out
Wie beschrieben, dir fehlt mindestens mal der Empfänger ?! ;-)
Oder anders:
Senden auf MOSI, mag ohne Teilnehmer funktionieren
Aber: Wenn kein Slave da ist, wer soll auf MISO zurücksenden ?
Lösungsansatze:
1.Prüfe die Konfiguration mit Angeschlossenenen AD9833 (auch mit
Software NSS /CS)
2. Verwende eine zweiten Microcontroller als Slave.
3. Vewrnde den zweiten SPI Port deines Controllers als "Slave"
hoffe nochmals das das für dich / Sie hilfreich war ;-)
Gruß
Hallo erstmal vielen vielen dank für die vielen Kommentare und das ihr
mir alle versucht zu Helfen sehr freundlich.
Ich werde natürlich gleich sofort versuchen ob einige Lösungsansätze
funktionieren.
Aber ich möchte nochmal darauf hinweisen das ich nur senden möchte an
den AD9833
1
SPI_InitStructure.SPI_Direction=SPI_Direction_1Line_Tx;//Transmission Only
Weil soweit ich das sehe, erhalte ich von dem AD9833 keine brauchbaren
informationen oder sehe ich das falsch?
Er hat auch quasi nur einen Data Anschluss. Somit möchte ich nur senden.
Aber derzeit ist es ja so, dass ich zumindest am Discovery Board die SCK
oder MOSI messen müsste, wenn ich in einer schleife dauernd Daten sende.