Optimierte SPI-Treiber für die MCU

Höherer Durchsatz für High-Speed-ADCs

16. Oktober 2023, 8:10 Uhr | Von Denny Wang und Sally Tseng
© stock.adobe.com

Was, wenn der Mikrocontroller (MCU) mit der schnellen seriellen Schnittstelle eines Datenwandlers nicht mithalten kann? Mit der Optimierung des SPI-Treibers kann dieses Problem behoben werden.

Diesen Artikel anhören

In stromsparenden IoT-Anwendungen sowie im Bereich »Edge- und Cloud-Computing« ist es dank technischer Weiterentwicklung erforderlich, immer genauere Daten zu übertragen. Das in Bild 1 gezeigte drahtlose Datenerfassungssystem ist deshalb mit einem 24-bit-A/D-Wandler (ADC) bestückt. Die Genauigkeit des A/D-Wandlers ist aber nur ein Punkt, entscheidend ist hierbei auch, dass die verwendete (MCU) mit den Anforderungen zurechtkommt.

 Datenerfassungssystem für die zustandsbasierte Überwachung
Bild 1. Datenerfassungssystem für die zustandsbasierte Überwachung.
© Analog Devices

Nachfolgend wird das Design eines schnellen SPI-Treibers (Serial Peripheral Interface) für die Datenübertragung zwischen MCU und ADC beschrieben. In den folgenden Abschnitten geht es zunächst kurz um verschiedene Methoden, den SPI-Treiber zu optimieren und den ADC und die MCU entsprechend zu konfigurieren. Danach folgt eine genauere Beschreibung des exemplarischen Codes für den Datentransfer per SPI und DMA (Direct Memory Access), bevor abschließend demonstriert wird, auf welchen Datendurchsatz der ADC mit ein und demselben Treiber mit verschiedenen MCUs (ADuCM4050, MAX32660) kommt.

Generische SPI-Treiber

Konfiguration eines generischen API.
Bild 2. Konfiguration eines generischen API.
© Analog Devices

MCU-Anbieter stellen für ihre Bausteine generische SPI-Treiber und APIs als Beispielcode zur Verfügung, mit denen die meisten Anwendungen abgedeckt werden können (Bild 2). In besonderen Fällen allerdings, wie etwa beim Auslesen der Ausgangsdaten von ADCs, reicht der angebotene generische SPI-Treiber möglicherweise nicht aus, um den vollen Datendurchsatz des ADCs auszuschöpfen. Der Grund hierfür ist, dass in generischen Treibern zu viele Konfigurationen implementiert sind, die in der eigentlichen Anwendung gar nicht benötigt werden und nur zusätzlichen Aufwand mitsamt den daraus resultierenden Verzögerungen erzeugen.

Um Daten per SPI aus einem ADC auszulesen, soll eine ADI-MCU als Beispiel dienen, die sich durch geringe Leistungsaufnahme und hohe Verarbeitungsgeschwindigkeit auszeichnet. Basiert eine Datenübertragung jedoch auf dem generischen SPI-Treiber von ADI, kann die Geschwindigkeit durch Anweisungen beeinträchtigt werden, die für die ADC-MCU-Applikation gar nicht erforderlich sind.

Unterschiedliche Ausgangsdatenraten und der Zusammenhang zwischen DRDY und SCLK
Bild 3. Unterschiedliche Ausgangsdatenraten und der Zusammenhang zwischen DRDY und SCLK.
© Analog Devices

Um das Geschwindigkeitspotenzial des ADCs vollständig ausreizen zu können, wurden für diesen Beitrag durch Ex- perimentieren mit dem ADuCM4050 (MCU) und dem AD7768-1 (ADC) mögliche Lösungen sondiert. Ungeachtet der maximalen Ausgangsdatenrate von 256 kHz (mit dem standardmäßigen Filter) ist der ADuCM4050 zunächst auf 8 kHz begrenzt. Als mögliche Abhilfen zum Anheben der Datenrate bieten sich der Verzicht auf unnötige Befehle und das Aktivieren des DMA-Controllers an. Auf die Umsetzung dieser Ideen wird in den folgenden Abschnitten genauer eingegangen (Bild 3).

MCU als Master

Die ADuCM4050-MCU zeichnet sich durch eine äußerst geringe Leistungsaufnahme aus, arbeitet mit einer Haupttaktfrequenz von 26 MHz und basiert auf einem Cortex-M4F-Kern. Der Controller enthält drei SPI-Einheiten, von denen jede zwei DMA-Kanäle (Senden bzw. Empfangen) umfasst, die an den DMA-Controller angeschlossen werden. Der DMA-Controller und die DMA-Kanäle dienen zum Datentransfer zwischen Speicher und Peripherie und stellen eine effiziente Möglichkeit dar, den Prozessorkern zu entlasten und ihn damit für andere Aufgaben freizustellen.

ADC als Slave

Auswirkungen des gewählten Power-Modus auf die Ausgangsdatenrate (ODR)
Tabelle 1. Auswirkungen des gewählten Power-Modus auf die Ausgangsdatenrate (ODR).
© Analog Devices

Beim AD7768-1 handelt es sich um einen energiesparenden und leistungsfähigen Sigma-Delta-ADC mit einer Auflösung von 24 bit. Wie sich aus Tabelle 1 entnehmen lässt, sind der Dezimationsfaktor und der Power-Modus entscheidend für die Ausgangsdatenrate (Output Data Rate, ODR). Ein wichtiges Feature des AD7768-1 ist der Continuous-Read-Modus.

Ausgangscodes und ideale Eingangsspannung
Tabelle 2. Ausgangscodes und ideale Eingangsspannung.
© Analog Devices

Die vom ADC ausgegebenen Daten werden im Register 0x6C abgelegt. Typischerweise benötigen die Daten im ADC-Register das Spezifizieren einer Adresse vor jeder Schreib- oder Lesetransaktion. Der Continuous-Read-Modus aber gestattet ein direktes Auslesen der Daten aus dem 0x6C-Register nach jedem Data-Ready-Signal. Die vom ADC ausgegebenen Daten liegen im 24-bit-Format vor und werden gemäß Tabelle 2 in Volt umgewandelt.

Leitungsverbindungen und Datentransfer

Verbindung der Pins von AD7768-1 und ADuCM4050
Bild 4. Verbindung der Pins von AD7768-1 und ADuCM4050.
© Analog Devices

Der Mikrocontroller ADuCM4050 und der ADC AD7768-1 werden als exemplarische Bauelemente verwendet. Die Verbindungen zwischen den jeweiligen Pins gehen aus Bild 4 hervor.

Das Resetsignal wird vom Pin »GPIO28« der MCU an den Pin »RST_1« des ADC gesendet, das Data-Ready-Signal wiederum vom »DRDY_1«-Pin des ADC an den Pin »GPIO27« der MCU. Die übrigen Pins werden wie in generischen SPI-Anwendungen verbunden, in denen die MCU als Master und der ADC als Slave fungiert. »SDI_1« empfängt die Lese- und Schreibbefehle für das ADC-Register von der MCU, und über »DOUT_1« werden die Ausgangsdaten an die MCU übertragen

Interrupt-basierter Datentransfer

Zum Umsetzen der kontinuierlichen Datenübertragung wird der Pin »GPIO27« (verbunden mit DRDY) als Interrupt-Trigger verwendet. Sobald der ADC ein Data-Ready-Signal an den »GPIO27«-Pin sendet, führt die MCU die Callback-Funktion mit den Datentransaktionsbefehlen aus. Wie Bild 5 verdeutlicht, muss die Datenerfassung zwischen Interrupt A und Interrupt B erfolgen.

Das Intervall zwischen zwei Interrupts wird für die Datentransfers genutzt
Bild 5. Das Intervall zwischen zwei Interrupts wird für die Datentransfers genutzt.
© Analog Devices

Mit dem generischen SPI-Treiber von ADI lässt sich die Datentransaktion zwischen ADC und MCU einfach umsetzen. Wegen der redundanten Befehle im Treiber wäre die ODR des ADCs jedoch auf 8 kHz begrenzt. Um den Ablauf zu beschleunigen, wird der Code deshalb auf das absolut notwendige Maß abgespeckt. Nachfolgend werden zwei DMA-Übertragungsmethoden vorgestellt: Basic-Modus und Pingpong-Modus.


  1. Höherer Durchsatz für High-Speed-ADCs
  2. DMA-Transaktionen im Basic-Modus

Lesen Sie mehr zum Thema


Das könnte Sie auch interessieren

Jetzt kostenfreie Newsletter bestellen!

Weitere Artikel zu Analog Devices GmbH

Weitere Artikel zu Datenwandler (A/D, D/A)

Weitere Artikel zu Mikrocontroller