Hallo,
ich habe mit CubeMX einen STM32H7 als SPI Slave mit Hardware NSS konfiguriert. Der Mikrocontroller misst mit 100Hz Sensoren über den ADC ein. Ein Raspberry kann dann "irgendwann" die Sensoren über SPI abfragen. Die Sensorwerte werden in ein globales Struct gespeichert. Um die Slave Funktion zu aktivieren übergebe ich vor der Main Schleife die Adresse des Structs an die HAL_SPI_transceive_DMA(). Nach der Übertragung starte ich um Interrupt wieder die gleiche Funktion mit dem gleichen Pointer.
Bisher dachte ich, dass einfach nur die Adresse genommen wird und die Daten von dort zum Zeitpunkt der SPI Übertragung genommen werden. Nun ist es aber so, dass bei der ersten Übertragung tatsächlich die Nullen, mit denen das Array initialisiert wird, übertragen werden, obwohl ich in der Zwischenzeit (aber erst nach der Initialisierung) mehrfach neue Werte in das Struct hineingeschrieben habe. Ist das das normale Verhalten? Gibt es eine Variante mit der ich wirklich die aktuellen Daten übertrage? Oder muss ich nach jeder Datanaktualisierung wieder die HAL_SPI_transceive_DMA Funktion ausführen? Gibt es auch eine Variante, bei der ich die Funktion nur zur Initialisierung aufgerufen werden muss, und ab da werden immer die Daten bei jeder SPI Abfrage übertragen? Ich meine ich hatte das schon einmal im DMA_Circular Mode getestet, da hat die Funktion aber auch immer nur einmal die Daten übertragen.
In kurz: Gewünschtes Verhalten: Funktionsaufruf bei dem ich die Adresse und die Länge des Speicherbereiches definiere. Ab dann wird bei jeder SPI-Clock das aktuelle Bit des Speichers übertragen, wenn die Länge des Structs erreicht wird geht der Pointer wieder auf die ursprüngliche Adresse zurück. CS brauche ich eigentlich nicht, da nur die beiden Teilnehmer existieren. Ich nutze ihn um zu erkennen ob gerade ein Transfer stattfindet, dann ändere ich die Daten natürlich nicht. Idealerweise würde der Pointer wieder auf die Anfangsadresse gesetzt werden wenn eine falling Edge am CS-Pin passiert, falls doch etwas bei der Kommunikation schief geht, sonst komme ich da ja nie mehr raus.