Ich habe 12 SPI-Slaves, die SPI mit einer maximalen Taktrate von 2 MHz unterstützen. Der SPI-Master (ein ESP32 ) kann mit bis zu 80 MHz (und ganzzahligen Divisionen davon) laufen. Meine Slaves sind alle 8-Kanal-ADCs ( MCP3208 ), die ich ständig abfragen muss. Daher möchte ich irgendwie den Durchsatz maximieren.
Ich dachte, dass es möglich sein könnte, Zeitmultiplex auf den Slaves durchzuführen, indem der Master mit 40 MHz betrieben und 20 Zeitabschnitte erstellt werden, von denen jeder eine 2-MHz-Leitung für einen potenziellen Slave ist. Dies würde meine Slaves effektiv zu einem einzigen SPI-Gerät mit höherer Geschwindigkeit kombinieren (während alle Bits für den Master verschachtelt werden). Leider finde ich keine Quellen zu diesem Thema.
Unten ist ein Diagramm, das das Konzept zeigt, indem ein externer Taktteiler verwendet wird, um einen 2-MHz-Takt aus dem 40-MHz-Basistakt zu erzeugen (der idealerweise für jeden Slave versetzt werden sollte), ein Multiplexer für MOSI und ein Demultiplexer für MISO-Leitungen.
Leider fehlt mir das nötige Hintergrundwissen, um beurteilen zu können, ob das überhaupt möglich ist und ob die benötigten ICs überhaupt existieren.
Das halte ich für überhaupt nicht praktikabel.
Erstens, wie werden Sie die SPI-Schnittstelle dazu bringen, Daten zu verschachteln? Ich bezweifle sehr, dass Sie dies mit einem dedizierten synchronen seriellen Peripheriegerät erreichen können, und wie @ThePhoton betont, wird die effektive Taktrate dramatisch sinken, wenn Sie die Schnittstelle bit-bangen müssen.
Sie benötigen für jeden ADC einen separaten 2-MHz-Takt, damit jedes Gerät die entsprechende Taktflanke nur dann sieht, wenn sein korrekter Datenwert vorhanden ist. Sie können die Datenleitungen nicht einfach demuxen, es sei denn, Sie fügen Speicher für jede Datenleitung hinzu, damit sie den richtigen Wert enthält, bis die Taktflanke auftritt.
Für eingehende Daten müssen Sie das Gegenteil tun ... erfassen Sie jede ADC-MISO-Leitung an der entsprechenden Taktflanke.
Zusätzlich zu dem, was in Ihrem Diagramm gezeigt wird, benötigen Sie auch einen Zähler, um die SEL-Signale für die [De] Multiplexer zu erzeugen. Und dieser Zähler muss durch 12 Zustände statt durch 8 oder 16 zählen.
Bevor Sie fertig sind, implementieren Sie all dies in einem CPLD.
Ich würde stattdessen empfehlen, einen anderen ADC zu finden. Entweder ein Mehrkanalgerät mit einer schnelleren SPI-Schnittstelle. Oder ein paralleler Ausgang, mit dem Sie die Rücklesungen über so etwas wie einen seriell-parallelen Puffer 74LVC595A durchführen können (der dann bis weit in die 10 MHz von Ihrem SPI-Port lesen kann).
Die ADC-Chips funktionieren nicht mit einer höheren Taktfrequenz als den im Datenblatt angegebenen 2 MHz.
Am besten teilen Sie das vom MSP erzeugte MCLK-Signal herunter und stellen es allen ADCs parallel zur Verfügung. Aus dem Datenblatt geht hervor, dass die ADC-Chips eine maximale Umwandlungsrate von 100.000 Samples/Sekunde haben, und dies hängt von der Uhr ab, die den Chip antreibt.
Eine Möglichkeit, wie Sie dies angehen könnten, wäre, das Ganze zu bit-bangen. Wenn Sie gemeinsame MCLK-, MOSI- und /CS-Leitungen verwenden, wobei jeder MISO-Pin mit einem separaten GPIO-Pin verbunden ist, können Sie einen gemeinsamen Befehl an alle Chips gleichzeitig senden. Das Lesen der Werte von allen 12 ADCs würde dann durch Lesen der GPIO-Register bei jedem Zyklus des Bit-Bang-Takts erfolgen.
Bei den meisten Mikros wäre es bei sorgfältiger Auswahl der GPIO-Pins möglich, den Zustand von 12 Pins mit nur wenigen Anweisungen zu lesen: ein byte- oder wortweites Lesen in ein Register und eine Bitverschiebung im Register, die 12 Mal wiederholt wird für die 12-Bit-ADC-Werte. Das Register würde dann den zu sortierenden Bitstrom in Software enthalten, möglicherweise in einem anderen (nicht zeitkritischen) Codeabschnitt.
Ich habe noch nie ein ESP32 verwendet; Ich weiß nicht, wie praktisch / möglich es wäre, die GPIO-Pins auf diese Weise zu lesen.
Wenn Sie das GPIO-Timing des ESP32 aufgrund von Interrupts nicht steuern können (während es beispielsweise das WLAN und den Stack verwaltet), kann es sich lohnen, einen billigen Mikrocontroller hinzuzufügen, der zwischen dem ESP32 und den 12 ADC-Chips sitzt und alles verarbeitet davon für dich; Stattdessen wird ein einzelner SPI- oder UART-verbundener Slave präsentiert, den Sie mit den im ESP32 vorhandenen hardwareunterstützten Blöcken verwenden könnten.
Das Photon
Das Photon
Ron Beyer
Nylon
Nylon
Ron Beyer
Nylon