Anschließen einer STM32-MCU an einen externen ADC (und Lesen der Daten über SPI)

Ich möchte einen STM32-Mikrocontroller verwenden, um Daten von einem Mehrkanal-ADC zu lesen. Der Mikrocontroller, den ich verwenden möchte, wird höchstwahrscheinlich aus der F7-Serie stammen (z. B. STM32F746ZGT ), während der ADC, den ich derzeit im Auge habe, der LTC2358-18 von Analog Devices ist.

Das Projekt, an dem ich arbeite, erfordert, dass ich gleichzeitig 6 analoge Kanäle (mit einer angemessenen Datenrate) auslese. Soweit ich weiß, kann der jeweilige ADC-Chip seine Konvertierungsergebnisse auf verschiedenen seriellen Datenausgabekanälen (SDO) ausgeben, die parallel ausgelesen werden können (der serielle Takt ist für alle identisch):Geben Sie hier die Bildbeschreibung ein

Ich habe mich gefragt, ob es möglich ist, eine einzelne STM32-MCU zum Lesen der 6-Kanal-Ausgangsdaten über SPI zu verwenden (ich brauche die beiden verbleibenden Kanäle nicht wirklich). Im Allgemeinen würde ich davon ausgehen, dass ich 6 SPI-Schnittstellen konfigurieren muss, die auf STM32F746ZGT wie folgt verfügbar sind:

  1. Einer der SPIs fungiert als Master und stellt den seriellen Takt (SCK) für alle Slave-Geräte (5 verbleibende SPIs auf dem STM32-Chip und dem ADC) und den seriellen Datenausgang (SDO) für die ADC-Konfiguration bereit. Der Master würde (ich vermute) den CS für alle SPI-Slaves herunterziehen.
  2. Die verbleibenden 5 SPIs auf dem STM32F746ZGT teilen sich eine gemeinsame SCK-Leitung und sind jeweils mit einem SDO-Kanal auf dem ADC verbunden.

Oder mit anderen Worten, es würde in etwa so aussehen:

Geben Sie hier die Bildbeschreibung ein

Würde diese Art der Konfiguration tatsächlich funktionieren oder übersehe ich etwas?

Ist diese Zeit kritisch? Jedes SDO gibt Daten von allen Kanälen aus, sodass Sie nur einen SPI benötigen.
Was Uhors sagt. Ein SPI-Bus und sechs Chip-Selects sind erforderlich. Es sei denn, das ist zu langsam. Die SPI-Taktfrequenz dieser ADCs ist jedoch richtig schnell, sodass ich das nicht als Problem erkennen kann, es sei denn, mir fehlt etwas auf dem ADC. Eine "angemessene Datenrate" ist keine "angemessene" Spezifikation ;)
Nun, es ist nicht zu kritisch, aber ich möchte im Allgemeinen den Durchsatz dieses Datenerfassungssystems verbessern. Ich stellte mir irgendwie vor, dass ich in dieser Art von Konfiguration die 6-Kanal-Daten in (ungefähr) der 24-Takt-Periode lesen könnte. Das Lesen der Daten von einem einzelnen SDO würde 6-mal länger dauern. In Bezug auf die Datenrate - ich würde lieber die 200 kSps-Rate erreichen, die der ADC-Chip bieten kann.
Interessante Idee, und ich kann sehen, dass es funktioniert. Ich habe über die Verwendung der Quad-SPI-Schnittstelle nachgedacht (lesen Sie zwei Werte), bin mir aber nicht sicher, ob dies wie eine "normale" SPI funktionieren kann.
Ich denke, ich sollte aussprechen, dass mein Hauptanliegen darin besteht, dass ich nicht weiß, wie die 1 Master- und 5 Slave-SPI-Schnittstellen mit den zeitgleichen eingehenden Daten vom ADC umgehen. Kann ich erwarten, dass alle Daten korrekt auf der MCU empfangen werden?
Jeder SPI hat ein internes Schieberegister, das mit den Daten gefüllt wird, die von der MISO-Leitung kommen. Nachdem ein Byte empfangen wurde, müssen Sie sicherstellen, dass alle Schieberegister voll sind, bevor Ihr Master das nächste Byte austaktet. Andernfalls könnten Sie aufgrund von Überlauf ein Byte verlieren. Ansonsten sehe ich kein Problem.
Dein Ansatz klingt für mich machbar. Ich habe mir die Mischung alternativer Funktionen für diesen Prozessor nicht angesehen, aber wenn Sie Pins für andere Peripheriegeräte verwenden, haben Sie möglicherweise Probleme bei der Konfiguration, um alle 6 SPIs zu verwenden. Ich weiß nicht, ob Ihre Datenrate weniger SPIs zulassen würde, aber auf der rechten Seite des ADC-Zeitdiagramms scheint es, dass Sie wahrscheinlich 1, 2, 3 oder 6 SPIs verwenden könnten, wobei die Datenraten auf die Anzahl Ihrer SPIs skaliert sind verwenden. ... Übrigens, vielleicht möchten Sie auch das STM32-Forum ausprobieren .

Antworten (2)

Ich bin kein Experte für STMs, aber für ungefähr jeden Controller, mit dem ich gearbeitet habe, würde dies aus folgenden Gründen nicht funktionieren:

  • Wahrscheinlich (ich habe es nicht überprüft) können Sie aufgrund von Pin-Mapping-Einschränkungen nicht gleichzeitig auf alle 6 SPI-Schnittstellen zugreifen, selbst wenn Sie nur einen MISO-Pin von jedem verwenden; Ich vermute, es geht nicht.
  • Die sechs Schnittstellen sind alle unabhängig voneinander, keine Möglichkeit, die Uhr von Schnittstelle 0 zu Schnittstelle n zu synchronisieren. Dies ist normalerweise der Fall, da das SPI-Peripheriegerät normalerweise als IP gekauft und dann sechsmal instanziiert wird. aber es gibt keine Verbindung zwischen diesen; sie sind getrennte Instanzen mit eigenen Registern/Speicherbereichen.

Was Sie stattdessen tun sollten, ist, sie wie beabsichtigt seriell zu lesen (normalerweise geschieht dies durch einen DMA-Lesevorgang). Da sich nur ein ADC im Inneren befindet und die maximale Abtastrate laut Datenblatt 200k (8ch) beträgt, führt die Annahme einer 24-Bit-Übertragung (nicht sicher, ob der DMA des STM damit umgehen kann) zu einer Datenrate von etwa 40 MBit / Spi-Geschwindigkeit. Dies sollte möglich sein, ohne die Nachbearbeitung zu berücksichtigen.

1) Es ist physikalisch möglich, alle SPIs auf dem STM32F746ZGT zu verwenden (es ist ein relativ großer 144-Pin-Chip). 2) Die SCK-Synchronisation zwischen den SPIs wäre nicht intern. Alle SPIn_SCK-Pins würden extern miteinander verdrahtet (zusammen mit dem ADC) und der Master-SPI (SPI1) wäre derjenige, der den Takt für den gesamten Bus liefert. Ich könnte mir vorstellen, dass sich die SPI-Slaves an das jeweilige Taktsignal halten sollten.
Früher habe ich es gemacht. Ein Master und viele Slaves auf einem Mikro. Slaves wurden vom Master auf demselben Chip getaktet. Diese Übertragung ist nichts für stm32
@laptop2d: Danke für die Korrektur meiner 4,5 MBit. Ich hatte angenommen, dass die kombinierte Abtastrate 200 kSps beträgt, nicht für jeden Kanal.
@PeterJ: Können Sie angeben, welchen Controller Sie verwendet haben?
@KR: Der letzte Teil ist, wo ich denke, dass Sie falsch liegen, aber ich habe es nicht getestet.
@ Tom L. STM32F429Zi

Ihr STM-Prozessor ist nicht multithreaded, vergessen Sie das nicht. Sie können physikalisch nicht 6 Zeilen parallel lesen. Nur jeweils eine, verwenden Sie die Kanal-IDs und verbinden Sie alles mit einer Leitung. Die ADC-Wandlung dauert dabei am längsten. Befehlen Sie den ADCs, die Ausgänge zu konvertieren und dann einzeln zu lesen. Setzen Sie sie alle in dieselbe Zeile und sagen Sie dann „Zeile 1 gibt mir Daten“, jetzt „Zeile 2 gibt mir Daten“, eine nach der anderen. Aus diesem Grund gibt es Kanal-IDs, sonst würden sie wertvolle Bits verschwenden.

Mir ist bewusst, dass die STM-MCU nicht multithreaded ist. Es ist nicht allzu schwer, die acht Kanaldaten über eine einzige SDO-Leitung (wie in einem Kommentar oben erwähnt) oder einzeln auszulesen. Was mich am meisten interessiert, ist, wie würde eine solche SPI-Anordnung funktionieren? Würde die MCU nur Daten von einem SPI-Kanal empfangen und die anderen würden ignoriert?
@sidA30 DMA + gut verwaltete DMA-Interrupts
Sie können 6 sdo-Zeilen parallel lesen, ich mache das die ganze Zeit.
Ich bin sicher, Sie können, aber nicht in dieser Anwendung. - Der ADC hat einen Puffer, sodass er die Daten für Sie speichert. Sagen Sie dem ADC einfach, er soll laufen und DATEN aus allen gewünschten Zeilen abrufen. Wenn die Konvertierung abgeschlossen ist, lesen Sie alle Zeilen einzeln nacheinander aus . Ihre Datenleitungseingabe ist leicht schnell genug, um zwischen jedem Konvertierungszyklus 6-18-Bit-Eingaben aufzunehmen.