4.9. Sensorbusse

Ein Kamerasensor und der MCU, mit dem er kommuniziert, tauschen zwei verschiedene Arten von Daten über zwei verschiedene Busse aus.

4.9.1. Steuerbus

Jede Sensoreinstellung befindet sich in einem Register auf dem Chip – Pixelformat, Bildgröße, Belichtungszeit, Verstärkung, Weißabgleich-Verstärkungen, Zielwerte der Automatiksteuerung und so weiter. Der MCU liest und schreibt diese Register über einen I2C-Bus (manche Sensoren verwenden stattdessen SPI). Zwei Leitungen (SCL und SDA) verbinden das I2C-Peripheriegerät des MCU mit der I2C-Schnittstelle des Sensors, und jede vom Benutzer gewählte Konfiguration wird vom Treiber in einen oder mehrere Registerschreibvorgänge auf diesem Bus übersetzt.

Der Steuerbus läuft mit gemächlicher Geschwindigkeit – typischerweise 100 kHz oder 400 kHz. Das Setzen eines Registers dauert einige Dutzend Mikrosekunden; die Neukonfiguration des gesamten Sensors (ein Reset, eine neue Bildgröße, ein neues Pixelformat) dauert einige Dutzend bis Hunderte von Millisekunden, hauptsächlich weil der Chip nach jedem Registerschreibvorgang einen Moment braucht, um den neuen Modus in einen sauberen Zustand zu bringen. Nichts davon muss mit dem Pixelstrom Schritt halten.

4.9.2. Pixeldatenbus

Die Pixeldaten verlassen den Sensor über einen separaten, breiteren und deutlich schnelleren Bus. Zwei Familien dominieren.

Parallel ist die ältere der beiden. Sie führt acht oder zehn Datenleitungen für die Pixelbits, dazu einen Pixeltakt (PCLK), ein Zeilengültigkeitssignal (HSYNC) und ein Bildgültigkeitssignal (VSYNC). Bei jeder Taktflanke erscheint ein Pixelbyte auf den Datenleitungen; HSYNC und VSYNC teilen dem Empfänger mit, wo jede Zeile und jedes Einzelbild beginnen und enden. Parallele Busse sind einfach, aber der Durchsatz ist dadurch begrenzt, wie schnell die Pin-Matrix des MCU Daten einlesen kann – typischerweise ein Pixeltakt von 50 bis 100 MHz am oberen Ende.

MIPI CSI-2 – das Mobile Industry Processor Interface Camera Serial Interface, Version 2 – hat Parallel auf neuen Bildsensoren weitgehend ersetzt. Es führt die Pixel über ein oder mehrere differentielle Leitungspaare mit Hunderten von Megabit pro Sekunde und Paar, bei geringerer Pin-Anzahl, deutlich höherer Bandbreite und niedrigerer EMV-Störung. Parallel besteht hauptsächlich bei älteren Designs und bei kleineren, niedrigratigen Bauteilen fort, wo sich seine Einfachheit noch auszahlt.

Ein Diagramm, das links einen Sensorblock und rechts einen MCU-Block zeigt. Ein bidirektionaler Pfeil zwischen ihnen ist mit "I2C (SCL, SDA)" beschriftet. Ein dickerer Pfeil, der vom Sensor zum MCU zeigt, ist mit "parallel oder MIPI" beschriftet.

Der Sensor und der MCU tauschen Steuerdaten über einen langsamen bidirektionalen I2C-Bus und Pixeldaten über einen breiteren, schnelleren, unidirektionalen parallelen oder MIPI-Bus aus.

Welche Familie der Sensor auch verwendet, auf der MCU-Seite gibt es ein Peripheriegerät mit fester Funktion, das die eingehenden Pixel auffängt und sie in einen Framebuffer im Speicher schreibt. Der Python-Code steuert diesen Bus niemals direkt; er liest den Framebuffer nur, sobald diese Hardware ihn fertig gefüllt hat.