Hallo, hat jemand eine Funktionierendes Beispiel wo auf dem STM32H743 V die SPI läuft? Ich habe inzwischen X Versionen aus dem Internet und aus CubeMX getestet und keine sendet auch nur ein Bit. Einige der Beispiele nehmen auch rücksicht auf den BUG in der SPI, aber es geht trozdem nicht. Ich hatte auch die Clock im verdacht, aber alle Bits sind richtig gesetzt, Der Code komme auch aus CubeMX (8MHz extern 480MHz intern). Ich will immer ein Byte senden & empfangen, Fullduplex, Master an B12/13/14 CS auf B10. Eigentlich auf einem STM32F0/1/3/4 kein Problem, nur auf dem H7 will das ganze überhaupt nicht laufen. Wenn Jemand eine kleines Beispiel Program hat, wo nur die Clock und die SPI eingestellt wird, sowie eine While Schleife mit einem Transfer wäre ich recht dankbar. Wenn das ganze dann noch unter LIBOPENCM3 oder auf Registerebene gemacht ist wäre noch besser. Ich hoffe das jemand so was hat. Viele Grüsse, Dirk
Der STM32H743 ist schon ganz schön "anders"... Hatte auch Probleme bei der SDIO-Schnittstelle. STM32F4 ging auto-of-the-box. H7 -> problem problem Was benutzt du für ein Board? Ein Nucleo-144 (H743) ging nicht, ein Disco-Board schon. Die H7 haben wohl mehrere Power-Domains die richtig versorgt werden wollen. Hast du Oszi-Bilder von deinen SPI/CS-Signalen? Grüße runout
ja, das SPI ist beim H7 (und U5 afaik) komplett anders. Der HAL Code funktioniert aber, habe den aber nur indirekt in Mbed benutzt. Wenn das mit den LL Makros benutzt wird es komplizierter, da spielt die Reihenfolge eine Rolle. Beim H7 kann man einige Register oder Bits nicht ändern wenn das device enabled ist, wird von STM als Feature verkauft.
Du hast eventuell einen Fake bekommen
Ja diese Feature kenne ich inzwischen. Aber das ist halt etwas mit dem ich leben könnte, wenn ich dann mal was habe was arbeitet. Ich habe eine eigene Platine, da war vor 2 Wochen noch ein STM32F407 drauf! Prozesor arbeit, alle RAM Bereiche arbeiten, GPIO gehen, Sysclock und FREERTOS arbeiten. Also im Grunde geht "alles" bis auf einige Hardware Funktionen. Bilder gibt es keine, weil sich nichts tut. Ein saubers 3,3V oder GND Signal hilft irgendwie nicht. Ich habe mir immer den LL Code erzeugen lassen, den HAL Code kann ich mir gleich mal ansehen. Ich habe um weiter zu kommen ersteinmal eine Software SPI eingebaut, das ist ja zum Gück noch machbar als Master. Ich hoffe das ich mit den Seriellen, DMA, I²S und DCMI nicht auch noch Probleme bekomme.
Einen Fake direkt von ST, das bezweifel ich mal stark.
Für SPI1 (PB3 - PB5, PB7 = SS) beim H73x/H75x und byteweise Übertragung. SPI-Knecht ist ein TDC7200.
Dirk schrieb: > Einen Fake direkt von ST, das bezweifel ich mal stark. Wie stark? Bitte Angabe in MPa oder MN
Der H7 ist einfach eine zickige Diva, die devices sind mit den vielen Modi sehr komplex geworden. Zum SPI gibt es noch AN5543 und www.st.com/content/ccc/resource/training/technical/product_training/grou p0/52/17/7a/28/2b/90/41/7d/STM32H7-Peripheral-Serial_Peripheral_interfac e_SPI/files/STM32H7-Peripheral-Serial_Peripheral_interface_SPI.pdf/_jcr_ content/translations/en.STM32H7-Peripheral-Serial_Peripheral_interface_S PI.pdf
Die 2 Dokumente kenne ich schon, die sind fürs Marketing nett nur um Fehler zu finden helfen sie mir nicht. Das mit der diva kann ich inzwischen bestätigen. Da hätte ich mich vorher mal besser informiert. Aber jetzt muss es damit laufen egal wie. Der Code für den 750 passt nicht, der hat anscheinend nicht den Fehler mit dem takt. Jedenfalls sehe ich dazu nix. Wenn jemand also einen passenden Code für die spi hat wäre es sehr hilfreich für mich.
Dirk schrieb: > Der Code für den 750 passt nicht, der hat anscheinend nicht den Fehler > mit dem takt. Jedenfalls sehe ich dazu nix. Daran erkennt man den Profi!
CubeMX hat mir für den H7 direkt einen funktionierenden SPI Code geliefert. Egal ob via DMA, Interrupt oder pollen. Man muss nur die entsprechende HAL-Funktion aufrufen und gegebenenfalls eine Callbackfunktion definieren. Edit: War aber für den H753.
Dirk schrieb: > Einige der Beispiele nehmen auch > rücksicht auf den BUG in der SPI, aber es geht trozdem nicht. Welcher Bug isn das?
Die spi hat Probleme wenn der Systemtakt sehr viel größer ist wie der spi takt. Da gibt es dann einige Möglichkeiten das zu umgehen. Und das ist dann halt leich zu erkennen wenn es im Code steht. Außerdem ist es nicht gerade einfach alles einzustellen, eine falsche Reihenfolge und das wars. Denn hal Code konnte ich mir noch nicht richtig ansehen, nur ein wenig und habe da auf den ersten Blick nicht sehen können was die anders machen wie ich. Habe gerade den crc getestet und musste feststellen das die svd? Datei defekt war (falsche Adresse),wenn ich jetzt wüsste wo ich die schon wieder her habe.
Dirk schrieb: > Die spi hat Probleme wenn der Systemtakt sehr viel größer ist wie der > spi takt. Da gibt es dann einige Möglichkeiten das zu umgehen. Und das > ist dann halt leich zu erkennen wenn es im Code steht. Dank dir für die Auskunft. Solche Probleme sind mir beim STM32H745 noch nicht untergekommen. Ich habe ebenfalls SPI laufen, benutze aber nicht die HAL, sondern nur LL und Register. Der größte Unterschied der mir aufgefallen ist, dass man fürs SPI explizit angeben muss, welche Taktquelle benutzt wird. Im Cube sollte das der Konfigurator eigentlich automatisch machen. Bei mir macht dies folgende Zeile.
1 | |
Bei der Übertragung im Polling Mode muss man einiges mehr machen, z. B. angeben wie viele Bytes man übertragen möchte bzw. noch einige Flags clearen. Folgenden Schnipsel verwende ich.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
Bei der Initialisierung des SPI gibts es lediglich die Besonderheit (gabs glaube ich auch beim F7), dass man den Schwellwert fürs FIFO korrekt einstellen muss. Für 1 Byte verwende ich folgende Funktion, das geht auch im Konfigurator.
1 | |
Vielleicht hilft dir das als Orientierung.
Dirk schrieb: > Die spi hat Probleme wenn der Systemtakt sehr viel größer ist wie der > spi takt. Das steht ja in den Errata der H7xx. Was "sehr viele größer als" sein soll allerdings nicht. Dann stell den SPI-Takt einfach höher ein oder lass die Beine per Software wackeln. Aber mecker hier nicht rum, wenn andere Leute Deine Probleme nicht haben. Gerald M. schrieb: > CubeMX hat mir für den H7 direkt einen funktionierenden SPI Code > geliefert. Egal ob via DMA, Interrupt oder pollen. > ... > Edit: War aber für den H753. Das ist unerheblich.
ich wärme den Thread mal auf, weil mir die Antwort von Mr. Mo geholfen hat mein Problem mit SPI Master TxRx auf einem H7A3 zu lösen. Der H7 ist in der Tat recht zickig, ich habe 2 Tage rumgewürgt bevor ich Code, der auf dem G4 einwandfrei lief auf dem H7 zum Laufen gebracht habe.
Voraussetzungen: ich verwende die LL API und lasse den Code mit CubeMX erzeugen. Nucleo STM32H7A3Zi @280 MHz, SPI2 an PLL3P @160 MHz, SPI Prescaler = 8 (=20 MBit/s). 8 Bit, Motorola, MSB First, KEIN CRC, Hardware NSS. DMA1 Stream 2 für RX, DMA1 Stream 3 für TX - beide "Normal" mit Memory Increment.
Meine Implementierung: Der DMA wird einmalig initialisiert - ich nutze den SPI2 und die DMA-Channels ausschließlich für diesen einen Zweck, darum brauche ich diese grundlegende Initialisierung nur einmal:
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
Zum Senden / Empfangen der Daten verwende ich folgende Funktion:
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
Und der DMA Transfer Complete / Transfer Error Interrupt Handler sieht so aus:
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
Was ich NICHT bestätigen kann ist, dass man explizit angeben muss, welche Clock SPI1-3 verwenden. Das habe ich im CubeMX "Clock Setup" erledigt. Ich verwende PLL3P, die ich auf 160 MHz eingestellt habe, während der Core auf 280 MH7 läuft.
1 |
|
habe ich also NICHT gebraucht
Was ich noch nicht wirklich sagen kann ist: wie sich die FIFO-Einstellungen auswirken. Ich bin jetzt erst mal froh, dass die Daten von Nucleo 1 auf Nucleo 2 geschickt werden, wirklich Plan von dem ganzen Thema habe ich selber noch nicht, ist mein erstes Projekt mit einem H7.
Mein Fehler war - und das war der Punkt an dem der Post von mr.mo geholfen hat, dass ich die beiden Zeilen
1 |
|
2 |
|
vergessen hatte. Ohne die beiden Zeilen nach
1 |
|
kommt sofort der Transfer Error Interrupt.
Anmerkung: "HalfBufSize" ist "sizeof(MEAS_values_TDS)" = 40 Byte; Der Rx und Tx Buffer sind doppelt so groß wie die Transfer-Size, ich nutze abwechselnd den High- und den Low-Buffer. Noch nicht implementiert ist, die Behandlung der empfangenen Daten. ATM schau ich nur mit dem Scope, ob was gesendet wird.
ich wärme den Thread mal auf
tldr
Aufgrund deiner langen Zugehörigkeit zum Forum solltest du elementare Dinge beim Posten bereits wissen und dementsprechend umsetzen.
Ja, dein Sourcecode ist länger.
falls du Admin / Mod bist: dann lösche meinen Beitrag und diese Antwort bitte.
Und ich hatte noch überlegt, ob ich das auf Stack Overflow poste, aber ne, hab ich mir gedacht, bringst du auch hier mal etwas Content rein, nach dem die Leute lange suchen müssen. Und was kommt: ein Reichsbedenkenträger der einen anscheißt weil der Post zu lang ist. So sind wir halt in Deutschland ...
nächstes mal poste ich wieder da, wo es willkommen ist, wenn man den Code direkt sieht und direkt über die Suchmaschine finden kann.
Ja, dein Sourcecode ist länger.
Das sehe ich etwas anders. Der gepostete Sourcecode besteht aus 3 Teilen, wobei jeder dieser Teile gerade noch eine Bildschirmseite unterschreiten. Von daher finde ich das noch okay. Das als 3 Anhänge zu posten (darauf liefe es hinaus), halte ich für übertrieben.
falls du Admin / Mod bist: dann lösche meinen Beitrag und diese Antwort bitte.
Dazu sehe ich keinen Anlass. Der Begriff "längerer Sourcecode" trifft nach meiner Meinung auf Deinen Beitrag nicht zu. Da gibt es ganz andere Kaliber.
nächstes mal poste ich wieder da, wo es willkommen ist,
Schließe bitte nicht von einem auf viele. Das wäre ein Fehler.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.


