Forum: Mikrocontroller und Digitale Elektronik STM32H7 - externe SPI Daten (ADC Werte) mittels DMA einlesen


von Sheldon G. (Firma: MyOwnComP) (quereinsteiger4)


Lesenswert?

Hallo ins Forum,

ich habe einen ADS131M03 erfolgreich an meinem STM32H745 zum Laufen 
gebracht.

Der ADS131 gibt über einen Pin ein Signal aus wann eine Wandlung 
abgeschlossen ist und die Daten bereit sind zum Auslesen.

Die Samplingrate des ADS131 kann zwar bis max. 64kSPS eingestellt 
werden. Mir reichen für meine Anwendung eingentlich 1 bis 2kSPS.)

Mittels Interrupt angestoßen durch das externe Signal kann ich natürlich 
die Werte einlesen und verarbeiten. So weit so gut. Aber der Controller 
hat noch sehr viel anderes zu tun. (ILI9341 und FreeRTOS sind am Start)

Daher hätte ich das gerne etwas effizienter - etwa in der Art:

Wenn das Data-Ready-Signal (low-active) vom ADS131 an einem Pin des 
STM32H7 ankommt sollte ohne Zutun der CPU ein SPI_Receive_DMA erfolgen 
und die Werte (5x 32bit "brutto" (= "NOP_Befehl" + 3x 32-bit Werte Kanal 
1, 2 & 3 (=netto) +  CRC-Daten) mittels DMA in ein Array geschrieben 
werden.

Erst wenn das abgeschlossen ist sollte ein Interrupt kommen, damit ich 
die Werte verarbeiten kann.

Option: Es können auch eine definierte Anzahl von Werten am Stück (in 
einer definierten Zeit) gelesen werden und der Interrupt kommt erst dann 
wenn alle Werte eingelesen sind.

Bei meiner intensiven Recherche habe ich Ideen gefunden, "etwas 
Ähnliches"  mittels eines extern (vom ADS131) getriggerten Timers zu 
machen, der dann wiederum das CS-Signal ansteuert (das machen die SPIs 
aller ST-Controller ja leider (?) nicht automatisch) und zudem auch den 
DMA anstößt, der wiederum den SPI-Transfer aktiviert...   (oder so 
ähnlich...?)

Keines der gefundenen Themen passt aber wirklich auf mein Beispiel..

Daher Frage ich erst mal im Land der Dichter und Denker nach...
...bevor ich mich in die Abgründe der ST-Community begeben ;-)

Falls da jdm eine Idee hat wäre ich sehr dankbar.

Viele Grüße

Sheldon

P.S.: Soweit ich bei meiner Suche erfahren habe schütteln andere 
Controller  (TI ?) diese Funktionalität aus dem Handgelenk - die 
STM32H7-Serie (muss nicht unbedingt ein 745 sein) ist bei dieser 
Anwendung aber (leider) "gesetzt"... :-(

Falls deratiges bei einem ESP32 geht wäre das aber für ein anderes 
Projekt durchaus interessant

von Vanye R. (vanye_rijan)


Lesenswert?

> Daher Frage ich erst mal im Land der Dichter und Denker nach...

Ich einem Land der Denker wuerde man das Datenblatt zur Rate
ziehen und dann einfach nun ja denken.

Im Internet wuerde man eher suchen wenn man im Land der Bloeden und
Abschreiber lebt. Das mindeste was man von einem Dichter und
Denker erwarten kann das er ein bereits selbst erarbeites
Gedicht zur Diskussion stellt.
Ueber einzelne Verse koennen wir dann ja immer noch diskutieren. .-)

Willst Gutes du und Schönes schaffen,
Das lebensvoll das Leben mehre,
Mußt du dich ernst zusammenraffen
Und darfst nicht scheu'n der Arbeit Schwere.
Da hilft kein Schwärmen bloß und Hoffen,
Kein Traum von künftiger Entfaltung;
Nein, ringen mußt du mit den Stoffen,
Und stark sie zwingen zur Gestaltung.
(Friedrich Julius Hammer)

Vanye

von 900ss (900ss)


Lesenswert?

Sheldon G. schrieb:
> Bei meiner intensiven Recherche habe ich Ideen gefunden

Scheinbar hast du dann nicht im Datenblatt intensiv recherchiert?

Dort könntest du prüfen, was für Triggerquellen die DMA-Einheit (ein 
Channel) hat. Gibt es die Möglichkeit auf ein Signal an einem GPIO Pin 
zu reagieren (DMA starten).

Dann würde ich prüfen, was kann die DMA-Unit für Interrupts erzeugen. 
Z.B. wenn ein DMA-Transfer fertig ist.

Wenn du finden solltest, dass ein DMA Transfer mit einem GPIO-Signal 
starten kann und am Ende des Transfers ein IRQ erzeugen, dann hast du 
alles gefunden, was du brauchst. Ich vermute ganz stark, dass das beides 
möglich ist.

Die Lösung kann man aber genauso gut mit einer Timer gesteuerten Mimik 
lösen. So wie unten beschrieben. Setzt voraus, dass ein DMA Transfer in 
der halben AD-Zykluszeit fertig ist. Wird er wohl schaffen ;) Allerdings 
könnte es einen sehr kleinen Jitter für die Abtastwerte geben. Hängt von 
der IRQ-Latency des STM32H7 ab.
1
   Init DMA-transfer
2
   Init SPI
3
   Init ADS131 für manuellen Start der AD-Wandlung und starte 1. Wandlung
4
   Init Timer IRQ und starte Timer mit der halben AD-Zykluszeit (also halbe Samplezeit)
5
6
   while( 1 )
7
   {
8
     // mach was
9
   }
10
11
   void timerIrqFunction(void)
12
   {
13
      static uint32_t state = 0;
14
      
15
      if( state == 0 )
16
      {
17
          Starte eine manuelle AD-Wandlung
18
          Starte DMA transfer
19
          state = 1
20
       }
21
       else
22
       {
23
           // Dma transfer ist fertig
24
           VerarbeiteAdDaten()
25
           state = 0
26
       }
27
   }

Und noch eine Anmerkung. Du hast dir eine CPU gesucht die mit mehreren 
100MHz arbeitet und einen 24-Bit AD Wandler. Deine Fragen lassen 
vermuten, dass du nach dem Motto handelst, viel hilft viel. Kann man so 
machen.
Du fürchtest, dass deine CPU überlastet wird weil ein Display 
angesteuert werden soll und auch noch FreeRTOS läuft. Ich glaube, deine 
CPU wird einschlafen. Für nicht genutzte CPU-Zyklen gibt es auch kein 
Geld zurück ;)

Nur damit du eine Vortellung bekommst, was so machbar ist...
Vor knapp 20 Jahren arbeitete ich an einem Satellitenprojekt, dessen 
Hauptrechner mit einem ADSP21020 bestückt war. Das ist ein 
Signalprozessor, der lief mit 18MHz (ja 18, kein Tippfehler).
Da lief ein RTOS drauf und diese CPU hat folgende Aufgaben erledigt.
1
- Telekommando und Telemetrie verarbeitet
2
- Lageregelung des Satelliten
3
- Auswertung aller Sensoren
4
- Ansteuerung aller Aktoren
5
- Power Kontrolle aller Einheiten + Laderegelung der Akkus + Solarstring-Kontrolle
6
- Ansteuerung des Nutzinstrumentes (irgendwas soll der Sat. ja tun)
7
  Die Nutzlast bestand wiederum aus 4 HW Einheiten, die separat kommandiert wurden
8
- "Regelung" der Heizung des Treibstoffsystems

Na ja, so grob. Es wurden jetzt keine besonderen Optimierungsversuche 
unternommen, was Laufzeit betrifft. Der Satellit funktioniert heute noch 
und unter einer gestressten CPU hat er nie gelitten. :)

Und du hast Angst dass dein STM32H7 mit mehreren 100MHz wegen einem 
Display und einem RTOS + AD-Wandlung zu langsam wird? Dann ist 
vermutlich im Konzept was falsch. Nun ja er könnte auch noch wer weiß 
was für komplexe und rechenintensive Aufgaben haben, die die CPU an ihre 
Grenze bringen, ja.

: Bearbeitet durch User
von Andreas B. (abm)


Lesenswert?

Sheldon G. schrieb:
> Die Samplingrate des ADS131 kann zwar bis max. 64kSPS eingestellt
> werden. Mir reichen für meine Anwendung eingentlich 1 bis 2kSPS.)

> Daher hätte ich das gerne etwas effizienter - etwa in der Art:
Bei der Samplerate ist das eher akademisch, aber sei's drum.

> Bei meiner intensiven Recherche habe ich Ideen gefunden, "etwas
> Ähnliches"  mittels eines extern (vom ADS131) getriggerten Timers zu
> machen, der dann wiederum das CS-Signal ansteuert (das machen die SPIs
> aller ST-Controller ja leider (?) nicht automatisch) und zudem auch den
> DMA anstößt, der wiederum den SPI-Transfer aktiviert...   (oder so
> ähnlich...?)

Warum um so viele Ecken gedacht? Der "Synchronous Master Mode" des ADC 
sollte ganz hilfreich sein. H7 seitig SPI-Slave, mit DMA ins RAM, 
fertig. Es muss dann allerdings immer "NULL" and den ADC zurück gesandt 
werden. Dafür gibt's im SPI-Interface sogar extra Vorkehrungen, s. 
"53.5.2 Unterrun flag" im RM.

von Hans-Georg L. (h-g-l)


Lesenswert?

Der H7 kann CS Signale generieren (SS-Pin)
SPI1,SPI2,SPI3 haben je 16Byte Fifos.
Direkte DMA Triggerung über externen Eingang und den DMAMUX Generator 
geht scheinbar nur in der D3 Domain und nicht in der D2 wo die SPI 
angebunden sind.
Beispiel für BDMA in D3: 
an5224-stm32-dmamux-the-dma-request-router-stmicroelectronics.pdf
Für die D2 Domain (DMA1,DMA2) wird empfohlen mit dem externen Eingang 
einen nicht benötigten Timer zu Triggern der dann die DMA triggert.

von Sheldon G. (Firma: MyOwnComP) (quereinsteiger4)


Lesenswert?

Hallo nochmal,

ob Ihr's glaubt oder nicht - mit dem "Reference Manual" meines 
Controllers habe ich schon viele invensive Stunden verbracht.

Mit dem Datenblatt auch - aber in dem stehen derartige Dinge sicher 
nicht drin. (...hätte man mal mit nem ST-Controller gearbeitet wüsste 
man das wohl !?)

Leider variieren teils je nach Kapitel die Begrifflichkeiten gerne mal. 
Z.B. wird "Channel" unterschiedlich verwendet, "Event" ebenso... und da 
gibt es noch viele mehr.

Zudem variieren die Begrifflichkeiten auch zwischen den Registern im RM, 
bei dem was man im CubeMX dafür auswählen kann und dann noch bei den 
ST-Beispielcodes.

Das macht es nicht gerade einfacher wenn man zwei oder mehr integrierte 
Module (z.B: SPI, DMA, Timer, NVIC) zur Zusammenarbeit bringen will.

Bei einer ST-Online-Schulung hat selbst der ST-Dozent sich äußerst 
negativ über die eigenen Datenblätter geäußert. Soweit mal dazu...

Zur "überdimensionierten Hardware": Bei der Anwendung ist der Preis des 
Controllers (fast) vollkommen egal. Warum sollte ich also einen 
kleineren nehmen?

Dass der Controller den Job auch so wie ich es habe schaffen wird ist 
das eine. Wenn es so funktionieren würde wie ich es mir erhoffe muss ich 
mir bezüglich Timing etc bei anderen Dingen keine Gedanken machen.

...und falls es die Hardware hergeben würde - warum soll ich es dann 
nicht nutzen?

@Vanye R.
...und woher nimmst Du das "Datenblatt" wenn nicht aus dem Internet.

Konkete Frage an 900ss D.:
Ist Deine Antwort so zu verstehen, dass Du weißt, wie es funktioniert 
und willst es nur nicht schreiben (genau dafür sind Internetforen ja 
bekanntlich da) oder denkst Du nur das es so funktionierten könnte - 
weißt es aber sebst auch nicht. Was bei Deinen vielen "könnte" und 
"sollte" nämlich fehlt ist die Ansteuerung des CS. Das machen die STs 
eben leider nicht automatisch. Das steht auch schon in meiner Frage 
oben. Dummerweise macht es ja mehr Spaß sarkastische Antworten zu 
schreiben als Fragen erst mal richtig zu lesen... ;-)

@ Andreas B.:
Im Datenblatt vom ADS131"M"03 finde ich nichts zu einem "Synchronous 
Master Mode". Google findet da auch nichts. Fündig werde ich hier nur im 
RM des STM32H7 - da aber auch nur beim USART !?
...oder im Datenblatt vom ADS131"A"04
Evtl. kann ich den "A" aber anstatt des "M" verwenden => danke für den 
indirekte Tip.

von Andreas B. (abm)


Lesenswert?

Sheldon G. schrieb:
> @ Andreas B.:
> Im Datenblatt vom ADS131"M"03 finde ich nichts zu einem "Synchronous
Ups, ja, das "M" übersehen.

> Master Mode". Google findet da auch nichts. Fündig werde ich hier nur im
> RM des STM32H7 - da aber auch nur beim USART !?
Nein, gemeint ist, dass das SPI vom H7 im slave mode arbeitet, und dabei 
gleichzeitig mit dem Empfang der Werte vom ADC natürlich auch wieder an 
den ADC zurück sendet. Da es da aber eigenlich nichts zu senden gibt, 
füllt man den TxFIFO erst gar nicht, sondern schreibt einfach NULL ins 
UDRDR Register, wie im Abschn. 53.5.2 im RM des H7 beschrieben.

> ...oder im Datenblatt vom ADS131"A"04
> Evtl. kann ich den "A" aber anstatt des "M" verwenden => danke für den
> indirekte Tip.

von 900ss (900ss)


Lesenswert?

Sheldon G. schrieb:
> dass Du weißt, wie es funktioniert und willst es nur nicht schreiben

Nein, ich weiß es nicht. Mich würde allerdings wundern wenn es nicht 
ginge. Auch mit dem CS Signal. Ich habe DMA auf einem STM32F103 
verwendet. Und es funktionierte ;)
Kann sein dass es nicht so möglich ist wie du möchtest aber dafür habe 
ich eine Lösung mit dem Timer beschrieben. Der ADC muss sicher nicht 
zwingend frei laufen und die Ansteuerung des CS machst du dann manuell. 
Manchmal geht eben nicht alles mit HW-Unterstützung.

Du könntest mit dem Signal vom ADC auch einen GPIO-IRQ auslösen. Der 
steuert dann CS und startet den DMA Transfer. Am Ende vom DMA-Transfer 
löst der DMA-Controller einen IRQ aus, der dir sagt neue Daten sind da.

Mit den Argumenten die du anbringst, den STM32H7 zu verwenden müsstest 
du eigentlich einen Quadcore mit mind. 1GHz Takt verwenden. RPi4 z.B.

Wenn du einen "kleineren" Controller nimmst, der ausreichend 
Rechenleistung hat, ist es oft auch einfacher, die Peripherie zu 
benutzen. Und evtl. steuert der sogar CS automatisch. Aber ich bin da 
leidenschaftslos, ich quäle mich ja nicht, nur um einen STM32H7 zu 
verwenden ;) Und mein Beispiel mit dem Satelliten zeigt was mit 
wesentlich weniger Rechenleistung möglich ist (ohne besondere 
Programmiertricks o.ä.). Und DMA o.ä. Features hatte der ADSP auch 
nicht.

von Peter (pittyj)


Lesenswert?

An alle 'schau doch mal ins Datenblatt':
Ich habe auch einen H743. Das Reference-Manual hat ca 3300 Seiten 
(RM0433).
Eine normale Bibel hat nur ca 1472 Seiten.

Da kann es sein, dass man manchmal ein Feature überliest. Von daher 
finde ich die Frage durchaus angemessen.

von 900ss (900ss)


Lesenswert?

Ach ja, Sarkasmus liegt mir nicht fern war aber hier nicht sarkastisch 
gemeint.
Wenn gleich ich schmunzeln musste als du erwähntest, dass du mit dem 
STM32H7 auch ein Display ansteuern müsstest und noch FreeRTOS verwendest 
;) Ist aber nicht bös gemeint.

: Bearbeitet durch User
von Sheldon G. (Firma: MyOwnComP) (quereinsteiger4)


Lesenswert?

@Hans-Georg L.

Soweit ich mal irgendwo gelesen habe machen die "neueren" H7 (H7Ax, 
H7Bx, H72x, H73x) das NSS-Handling nun wirklich korrekt. (mit denen habe 
ich mich bisher nicht näher beschäftigt)

Aber bist Du Dir sicher, dass auch der H745 das NSS "richtig" ansteuert, 
d.h. Vor dem Transfer NSS=>0, dann mehrere Bytes übertragen und 
anschließend  wieder NSS=>1.

Der Modus, bei dem nach jedem Byte NSS wieder auf 1 und zurück auf 0 
gezogen wird können H74x & H75x auch, aber das nutzt für den ADS131M03 
nichts.

Bei einigen ST-Beispielen in CubeMX steuern die das NSS auch "manuell" = 
per Software an. Warum sollten sie das machen wenn es doch per Hardware 
funktionieren würde

Danke schon mal für den Tip ..werde ich heute Abend mal versuchen..

von 900ss (900ss)


Lesenswert?

Du könntest das NSS Signal auch manuell steuern. Lass es einfach immer 
aktiv. Wenn dein DMA dir per Interrupt sagt, dass es mit einem Transfer 
fertig ist, dann toggle NSS einmal "manuell", damit dein ADC das 
mitbekommt. Evtl. darf das Togglen nicht zu schnell erfolgen 
(ADC-Datenblatt). Ein sonst ständig aktives NSS Signal sollte den ADC 
sonst nicht stören. Auch hier Datenblatt fragen.

von Hans-Georg L. (h-g-l)


Angehängte Dateien:

Lesenswert?

Sheldon G. schrieb:
> @Hans-Georg L.
>
> Aber bist Du Dir sicher, dass auch der H745 das NSS "richtig" ansteuert,
> d.h. Vor dem Transfer NSS=>0, dann mehrere Bytes übertragen und
> anschließend  wieder NSS=>1.
>
Ich verwende Das h743Zi(T6U) Nucleo Board mit einem AS6501 und da 
funkioniert das NSS siehe Anhang. Kanal 2 ist der Interrupt Kanal 3 das 
NSS Signal und Kanal 4 die eingehenden Daten. Die verwaschene Flanke am 
Ende der Übertragung bekommt man weg wenn man den Pin vorher zusätzlich 
auf Ausgang und auf 0 setzt. Er schaltet am Ende scheinbar das NSS 
einfach ab und nicht aktiv nach 0 und wenn dann der Pin auf Eingang 
steht machen sich die internen Kapazitäten bemerkbar. Wenn du alles auf 
einmal lesen willst musst du aber 32 Bit lesen . 24 Bit liest er 16 + 8 
Bit in 2 Sequenzen.

von Sheldon G. (Firma: MyOwnComP) (quereinsteiger4)


Lesenswert?

Ob ein "kleinerer" Controller wirklich einfacher ist wage ich zu 
bezweifeln.

Dass andere manches besser machen können stimmt sicher, dafür werden die 
auch ihre Macken woanders haben !?


Aber dann mal "in die Vollen:

Die Entscheidung für die H74x-Serie viel wegen den zwei integrierten 
OpAmps die als PGA (als Subtrahierer) vom Eingangswert ein Bias-Wert 
(kommt aus den DACs) abziehen. Damit kann nun mit den integrierten ADCs 
ein kleiner Wertebereich des gesamten Messbereiches weit oberhalb vom 
Nullpunkt höher aufgelöst werden (quasi eine Zoom-Funktion ;-) => läuft.

(das geht z.B. schon nicht mit allen H7-Derivaten, da einige die 
Funktion „Externer Bias“ nicht besitzen.

Was der H7 dann noch alles macht:

Aufnehmen der ADC-Werte Version 1: Kurze Messung => 2-4kSPS, alles 
mittels DMA in ein großes Array.

Aufnehmen der ADC-Werte Version 2: Lange Messung => 0,5kSPS, mittels DMA 
in ein Puffer-Array.

Während der laufenden Messung (Version 2): Auswerte-Berechnung und …
…entweder vom Puffer-Array in ein anderes Array übertragen mittels 
Memory-to-Memory-DMA => läuft

oder

…speichern der ADC-Daten in QSPI-Flash – lesen daraus mittels 
MemoryMapping => läuft

Während der laufenden Messung (Version 1 und 2) grafische Anzeigen 
(ähnlich einem Oszilloskop) der Messwerte auf dem ILI9341 mit hoher 
Frame-Rate. => läuft

Das ILI9341 kann nicht über LTDC angebunden werden, denn auf einigen der 
dafür nötigen Pins sind die OpAmp-IOs

Daher: Das ILI9341 bekommt per SPI-DMA mit 60 MHz laufend den kompletten 
Framebuffer aus dem RAM des H7. Da per DMA nur 16384 Werte übertragen 
werden können geht das nicht mit den vom ILI gewünschten 16bit pro Pixel 
sondern man muss quasi zwei Pixel als ein 32-bit-Wert übertragen. => 
läuft
Da man MSB und LSB nicht tauschen kann (zumindest habe ich im RM nichts 
gefunden wie das gehen könnte) bedeutet das aber, dass die übliche 
Farb-Tabelle nicht funktioniert, daher eigene erstellt => läuft

Zudem habe ich dann gleich eine „effizientere Text-Ausgabe“ (mit eigenen 
Fonts) erstellt, weche die Möglichkeiten vom DMA2D vernünftig ausnutzt 
=> läuft

Die RTC des H7 holt sich die Uhrzeit aus einem DS3231 => läuft, wird 
aber später durch Batteriepufferung der RTC des H7 ersetzt

I2C-EEprom für sich öfter ändernde Status-Daten => läuft (kommt aber 
später evtl ins QSPI-Flash wenn mir was zum Wear-Leveling einfällt.

Einige digitaler Is (24V) und Os (24V 1 –bis5 A) => läuft

PWM Is und Os (24V 3A) => läuft

Ansteuern von 1-4 Schrittmotoren mit PowerStep01 => läuft

2 – 5 Encoder-Eingänge (3,3V-24V)=> läuft

Benutzeroberfläche mit Menüsystem => läuft

USB-Host-MSC um Daten auf USB-Stick speichern / lesen zu können => läuft

Alternativ: USB-Device-MSC, damit der H7 am PC als USB-Stick erscheint 
und man damit Daten speichern / lesen kann => läuft

Zusätzlich mit dem zweiten USB-Port des H7 CDC-Device, damit der H7 
mittels Terminal (und später eigenem Programm auf dem PC) vom PC aus 
steuerbar/diagnostizierbar ist => läuft

Und dann noch das besondere Goodie: am ProfiNet hängt er auch. Das 
erfolgt aber mittels NetX-Modul von Hilscher => läuft

Was noch kommt:

Externer 24Bit-ADC => bin ich gerade dabei…

Ein paar digitale Temperatursensoren (0-100°C)

Luftfeucht-Sensor

Der M4-Kern macht noch garnix – aber warum soll ich den H743 nehmen, 
wenn der H745 auch nicht mehr kostet. Vielleicht gibt es für den ja 
später auch mal Arbeit ;-)

Zum Vergleich: einer der Sensoren, die am OpAmp/ADC hängen kostet ca 
1700,-

Jetzt bin ich mal auf Vorschläge gespannt welcher 8-bitter das angeblich 
auch alles kann wenn man ihn nur richtig mit Assembler programmieren 
kann. ;-)

von 900ss (900ss)


Lesenswert?

Sheldon G. schrieb:
> Jetzt bin ich mal auf Vorschläge gespannt welcher 8-bitter das angeblich
> auch alles kann wenn man ihn nur richtig mit Assembler programmieren
> kann. ;-)

Das hat bisher niemand behauptet und ich habe auch nicht daran gedacht. 
An Assembler schon garnicht.
Nur das ein STM32H7 evtl. deutlich komplexer ist als ein Controller mit 
weniger Leistung die natürlich ausreichen muss. Aber USB-Host kann schon 
kaum einer. Mit 480MBit noch weniger.
Du kriegst das schon hin. ;)

PS. Ich glaube trotzdem dass dein H7 sich total langweilt zumal du viel 
DMA nutzt was ja richtig ist wenn man die Möglichkeit hat.

: Bearbeitet durch User
von Sheldon G. (Firma: MyOwnComP) (quereinsteiger4)


Lesenswert?

Wo habe ich was von 480Mbit geschrieben ?

Ich nutze bei beiden USBs nur die internen Phys. Für einen Externen habe 
ich die Pins nicht.

Die Geschwindigkeit brauche ich auch nicht...

von 900ss (900ss)


Lesenswert?

Sheldon G. schrieb:
> Wo habe ich was von 480Mbit geschrieben ?

Nirgends, hab ich einfach angenommen, der H7 kann das.
Wenn USB1.1 reicht, wird die Auswahl an geeigneten Controllern auch 
schon wieder deutlich größer.

von Sheldon G. (Firma: MyOwnComP) (quereinsteiger4)


Angehängte Dateien:

Lesenswert?

Teil-Erfolgsmeldung:

Das NSS-Signal funktioniert beim H745 wohl wirklich per Hardware.

Ich kenne es eben vom F4, dass es da nicht so funktioniert wie 
eigentlich üblich.

Ich habe es dann mal mit einem ganz frühen H743 (die Revision welche nur 
400Mhz schafft) auch mal versucht - da ging es zumindest nicht so wie 
ich es benötigt habe (...genaueres weiß ich nicht mehr - ist schon sehr 
lange her)

...damit bin ich damals ausgestiegen... (und habe es ab da eben wie bei 
F4 "manuell" gemacht.

Viele ST-Beispiele machen es (auch beim H7) ebenso...

Nachdem mir bei einer ST-Schulung mal einer bestätigt hat, dass die 
SPI-Peripherie wirklich buggy ist - und ein H743 und H745 "eigentlich 
genau gleich sind was den M7-Core angeht) habe ich mich nie mehr damit 
beschäftigt und einfach angenommen, dass der H745 es in "alter 
Tradition" auch so hält.

Aber: Hurra: Es geht wohl doch...

(...das mit H745 "nur M7-Core" = H743 stimmt aber auch nicht wie ich 
mittlerweile weiß...)

@ 900ss D.:

...wenn ich nun meinen Code für die restlichen SPI's anpasse kann sich 
mein H7 ja noch viel mehr langweilen ;-)

Aber nochmal die Frage (an alle): Gibt es andere µCs mit zwei 
integrierten OpAmps/PGAs die man als Subtrahierer verwenden kann und 
damit zwei min. 14bit (effektive) ADCs befeuern kann?

Ansonsten danke an die Tip-Geber...

...mal sehen ob der andere Teil nun auch realisierbar wird...

von Vanye R. (vanye_rijan)


Lesenswert?

> Ob ein "kleinerer" Controller wirklich einfacher ist wage ich zu
> bezweifeln.

Ist auch hier gern geschriebener Unsinn. Niemand liesst sich ein 
Datenblatt
mal eben am Stueck durch und kann es danach auswendig. Egal ob das nun
2000Seiten oder nur 500 hat.

Was aber ein Einfluss hat ist die Qualitaet der Dokumentation. Es ist 
z.B ein grosser Unterschied ob es ein Datenblatt zu einem Controller 
gibt oder ob der Hersteller ein Datenblatt zu einer ganzen Familie von 
Controller schreibt und du immer erst im zweiten Datenblatt nachschauen 
musst welches Feature gerade bei deinem speziellem Controller vorhanden 
ist oder nicht.
Und bei komplexeren Dingen ist auch das vorhandensein und die Qualitaet 
von speziellen Datenblaettern sinnvoll.

Und man muss sich auch darueber im klaren sein das manche Dinge eben 
nicht in 60min geloesst sind wenn man sie zu ersten mal macht. Das ist 
eben so und darin liegt ja gerade der Spass sich mit sowas zu 
beschaeftigen. Sonst koennte das jeder und wir wuerden nicht so gut 
bezahlt. .-)

Vanye

von 900ss (900ss)


Lesenswert?

Vanye R. schrieb:
> Ist auch hier gern geschriebener Unsinn.

Nein, ist kein Unsinn :)

Vanye R. schrieb:
> Niemand liesst sich ein Datenblatt
> mal eben am Stueck durch und kann es danach auswendig. Egal ob das nun
> 2000Seiten oder nur 500 hat.

Ja.

Weshalb hat denn ein "kleinerer" Controller nur 500 Seiten Dokumentation 
als ein "grösserer"?

Die jeweilig integrierten HW Einheiten sind bei größeren Controllern 
auch oft komplexer. Sie bieten ja auch mehr Möglichkeiten. Wenn man die 
braucht, dann nehme ich die natürlich. Aber ansonsten macht man sich 
gegebenenfalls das Leben unnötig schwer. Ok, wenn man Lust dazu hat, ist 
es auch ok. Das ist dann aber nicht pragmatisch und das bezahlt auch 
keiner gerne. Auf dem Hobbytisch wieder egal.
Und es gibt auch Leute, die werden 5cm größer wenn sie behaupten können, 
sie hätten einen "großen" Controller schon erfolgreich genutzt. Bei 
anderen ist es dann der Porsche. ;)

Und wenn es denn ein Fall wie hier unter anderem mit dem SPI NSS Signal 
ist, da versuche ich erst garnicht, dass mit der HW zu lösen. Dann läuft 
es auf dem einen speziellen Controller. Bei dem nächsten nicht weil die 
HW es nicht hergibt oder man stolpert dann über ein Errata.
Wenn man dieses Problem generisch löst und dann wird der Controller 
getauscht und man muss bestenfalls nichts ändern, dann ist das in meinen 
Augen eine gute Arbeit aber nicht weil  man nun unbedingt das Problem 
speziell mit einem Controller gelöst hat. Alles lässt sich auch nicht so 
generisch lösen. Ist immer auch Abwägung. Es hängt immer  noch von der 
konkreten Situation ab. Pauschalisieren ist selten gut ;)

Und Meinungen sind auch verschieden ;)

: Bearbeitet durch User
von Hans-Georg L. (h-g-l)


Lesenswert?

900ss D. schrieb:
>
> Und wenn es denn ein Fall wie hier unter anderem mit dem SPI NSS Signal
> ist, da versuche ich erst garnicht, dass mit der HW zu lösen. Dann läuft
> es auf dem einen speziellen Controller. Bei dem nächsten nicht weil die
> HW es nicht hergibt oder man stolpert dann über ein Errata.
> Wenn man dieses Problem generisch löst und dann wird der Controller
> getauscht und man muss bestenfalls nichts ändern, dann ist das in meinen
> Augen eine gute Arbeit aber nicht weil  man nun unbedingt das Problem
> speziell mit einem Controller gelöst hat. Alles lässt sich auch nicht so
> generisch lösen. Ist immer auch Abwägung. Es hängt immer  noch von der
> konkreten Situation ab. Pauschalisieren ist selten gut ;)

Kommt immer darauf an was man will/braucht ...
In meinem Fall bekomme ich alle 10µs einen externen Interrupt und lese 
dann einen 32bit wert über SPI ein. Das Wackeln des CSS mit IO Befehlen 
kostet viel mehr Zeit als die Benutzung des NSS Signales die dann bei 
der Bearbeitung fehlt.

von 900ss (900ss)


Lesenswert?

Hans-Georg L. schrieb:
> Kommt immer darauf an was man will/braucht ...

900ss D. schrieb:
> Alles lässt sich auch nicht so generisch lösen. Ist immer auch Abwägung.
> Es hängt immer  noch von der konkreten Situation ab.

;)

: Bearbeitet durch User
von Vanye R. (vanye_rijan)


Lesenswert?

> Ok, wenn man Lust dazu hat, ist es auch ok. Das ist dann aber nicht
> pragmatisch und das bezahlt auch keiner gerne. Auf dem
> Hobbytisch wieder egal.

Geld ist auch so eine Sache. Wenn es darum geht solltest du fuers
Hobby eher einen groesseren Controller nehmen weil du dann nur
einen lernen musst und den fuer alle deine Projekte verwenden kannst
ohne jedes mal neue lernen zu muessen. Schliesslich wird hier
kaum einer fuers Hobby mehr wie 10Controller pro Jahr brauchen
und da wuerde ich mir lieber einen aus der Upperclass goennen
als mit jeder Resource knausern zu muessen.

In der Firma ist das so eine Sache. Bei Dingen die jedes Jahr >100t
gefertigt werden nimmt man natuerlich gerne den billigsten.

Bei irgendwelchen Sonderprojekten wo vielleicht ein paar tausend
gemacht werden ist das aber teilweise absurder. Da kann es dann
sein das es billiger ist du nimmst einen dicken Controller weil
die Firma den in einem anderen Projekt 1Mio pro Jahr kauft, als
eine kleine Sonderlocke von der du nur 1000 brauchst.
Oder die Firma hat von irgendeinem noch 20000Tausend auf Lager
der nicht mehr gebraucht wird weil das andere Projekt bereits
ausgelaufen ist und der da sonst verschimmeln wuerde.
Dazu kommen dann noch man andere absurde Nebenbedingungen, manchmal
denke ich sogar Kaffesatzlesen gehoert auch irgendwie dazu. :-D

Vanye

von Sheldon G. (Firma: MyOwnComP) (quereinsteiger4)


Lesenswert?

Nachdem hier eh "off-Topic" weiterdiskutiert wird...
...auch mal was für die "Datenblatt-Fetischisten"...

Im ADS131M03-Datenblatt steht z.B.:

"Words can be 16, 24, or 32 bits. The word size is configured by the 
WLENGTH[1:0] bits in the MODE register.
The device defaults to a 24-bit word size. Commands, responses, CRC, and 
registers always contain 16 bits of
actual data."

...dass auch bei "Commands, responses, CRC, and registers" nach den 16 
genutzten Bits noch weitere 8 oder 16 "Leerbits" gesendet werden kommt - 
zumindest für mich - aus dem Text nicht wirklich klar zum Vorschein.

Ja, ich gebe zu: Wegen dem "contain" ist der Text ja nicht direkt falsch 
- aber minimal detaillierter (z.B. "the rest is filled with zeros" o.ä.) 
- oder evtl. eine bessere grafische Darstellung der Diagramme könnte das 
"auf den ersten Blick" erkennbar machen... (.. nur "Wozu"?.. warum soll 
man denn seinen Kunden das Leben etwas erleichtern !?? ;-)

=> ohne Logic-Analyzer ist man da schon 'ne echt arme Sau!

Ich habe in Datenblättern schon exterm viel gelesen - auch sehr viel 
haushohen Mist - und 100erte Stunden damit verbracht herauszufinden wie 
es wirklich geht.

Aber wie sagte einst ein weiser Herr über die Datenblätter der Firma für 
die er selbst arbeitet: "...don't believe everything what's written in 
our datasheets..."


Zudem noch @Vanye

Der Philiosoph überrascht mit bemerkenstwert wirtschaftlicher Denkweise 
- Hut ab mal zwar dafür, aber...

...was mich jetzt schon genauer interessieren würde: Hast Du schon 
jemals mit dem H7 "gearbeitet", oder zumindest einem anderen 
STM32-Derivat? ...
... oder hast Du wenigstens mal in irgendein ST-Reference-Manual länger 
als 5 min reingeschaut? (Dein Vorschlag bezog sich ja auf das 
Datenblatt, und da steht bei ST derartiges niemals drin !?)

Ist Dir vollkommen bewusst, dass z.B: das Wort "Event" in einem Kapitel 
des RM etwas vollkommen anderes bedeuten kann als in einem anderen 
Kapitel (2000 Seiten davor oder dahinter)?

Kleiner Tip: "Event" kommt lt. PDF-Suche auf den 3556 Seiten 3338-mal 
vor! 
(rm0399-stm32h745755-and-stm32h747757-advanced-armbased-32bit-mcus-stmic 
roelectronics)

Rein vom Inhalt kann meine ursprüngliche Frage eigentlich keine 
Noob-Frage (á là "...wie schließe ich eine LED an meinen Arduino an...") 
sein.

Was bringt Dich also dann (falls Du die ST-RMs bestens kennen solltest) 
dazu eine derartige Antwort zu schreiben?

Entweder weißt Du (fast) alles - auch die Antwort auf meine Frage => 
Warum schreibst Du dann nicht wie es geht => damit hättes Du einen 
wirklich coolen Auftritt gehabt!!

...oder...naja...

...Mikrocontroller.net-Forum eben.... ;-(

von Sheldon G. (Firma: MyOwnComP) (quereinsteiger4)


Lesenswert?

(...aus dem Urlaub zurück...) eine Erfolgsmeldung an alle:

Generell ist das was ich vorhatte (siehe oben) möglich und funktioniert 
auch in der Tat ... !! (...leider nur "im Prinzip"... => !! ?? (s.u.)..)

Was man braucht um es umzusetzen steht aber bei weitem nicht im 
Reference Manual ... - ...und im "Datenblatt" absolut überhaupt 
nie-und-niemals-nicht.

Dummerweise kann ich es bei meinem Projekt aber leider doch (erst mal) 
nicht anwenden, da hierfür zwei "geeignete" Timer notwendig wären.

Es sind leider nur weniger als die Hälfte der insgesamt 20 Timer des H7 
dazu in der Lage...

...und diese wenigen möglichen Timer machen die mir schon wesentlich 
Wichtigeres!

Daher bleibt erst mal leider nur die Interrupt-Lösung (=> deshalb das 
"...im Prinzip..." s.o.)

Mit ein paar extra Bauteilen welche zusätzlich auf meine selbst 
erstellte Platine müssen wird es auch irgendwann in Zukunft ohne diese 
Timer funktionieren...

...aber für das PCB-ReDesign müssen erst noch ein paar andere 
(wichtigere) Sachen auf der ToDo-Liste auftauchen - bis ich mich daran 
mache... => solange muss die Interrupt-Lösung erst mal reichen.


Ansonsten vielen Dank an Alle


P.S.: Falls jdm. interessiert wie es geht: Hey: "Schaut einfach in's 
Datenblatt" (da steht es nicht drin) und fragt dann einfach hier im 
Forum - da wird es Euch auch bestimmt nicht gesagt - aber ihr erntet 
wenigstens Hohn, Spott und Verachtung - dafür sind Internet-Foren 
(zumindest deutsche) ja da !!

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.