4.9. Bus del sensore

Un sensore di camera e il microcontrollore con cui comunica si scambiano due tipi diversi di dati su due bus diversi.

4.9.1. Bus di controllo

Ogni impostazione del sensore risiede in un registro sul chip: formato dei pixel, dimensione del frame, tempo di esposizione, guadagno, guadagni del bilanciamento del bianco, target dei controlli automatici e così via. Il microcontrollore legge e scrive questi registri attraverso un bus I2C (alcuni sensori usano invece SPI). Due fili (SCL e SDA) collegano la periferica I2C del microcontrollore all’interfaccia I2C del sensore, e ogni configurazione scelta dall’utente viene tradotta dal driver in una o più scritture di registro su questo bus.

Il bus di controllo opera a una velocità contenuta, tipicamente 100 kHz o 400 kHz. Impostare un registro richiede decine di microsecondi; riconfigurare l’intero sensore (un reset, una nuova dimensione del frame, un nuovo formato dei pixel) richiede da decine a centinaia di millisecondi, soprattutto perché il chip ha bisogno di un momento per portare la nuova modalità a uno stato pulito dopo ogni scrittura di registro. Nulla di tutto ciò deve stare al passo con il flusso dei pixel.

4.9.2. Bus dei dati dei pixel

I dati dei pixel lasciano il sensore su un bus separato, più ampio e molto più veloce. Due famiglie dominano.

Il bus parallelo è il più vecchio dei due. Trasporta otto o dieci linee dati per i bit dei pixel, oltre a un clock dei pixel (PCLK), un segnale di validità della riga (HSYNC) e un segnale di validità del frame (VSYNC). A ogni fronte di clock un byte di pixel compare sulle linee dati; HSYNC e VSYNC indicano al ricevitore dove inizia e finisce ogni riga e ogni frame. I bus paralleli sono semplici, ma il throughput è limitato dalla velocità con cui la matrice dei pin del microcontrollore riesce a campionare i dati, tipicamente un clock dei pixel da 50 a 100 MHz al massimo.

Il bus MIPI CSI-2 – la Mobile Industry Processor Interface Camera Serial Interface, versione 2 – ha in gran parte sostituito il parallelo sui nuovi sensori di immagine. Trasporta i pixel su una o più coppie di lane differenziali a centinaia di megabit al secondo per coppia, con un minor numero di pin, una larghezza di banda molto più elevata e minori interferenze elettromagnetiche. Il parallelo persiste soprattutto nei progetti legacy e nelle parti più piccole e a velocità ridotta, dove la sua semplicità è ancora vantaggiosa.

Un diagramma che mostra un blocco sensore a sinistra e un blocco microcontrollore a destra. Una freccia bidirezionale tra di essi è etichettata "I2C (SCL, SDA)". Una freccia più spessa che punta dal sensore al microcontrollore è etichettata "parallelo o MIPI".

Il sensore e il microcontrollore si scambiano i controlli su un bus I2C bidirezionale lento e i dati dei pixel su un bus parallelo o MIPI più ampio, più veloce e unidirezionale.

Qualunque famiglia il sensore utilizzi, sul lato del microcontrollore c’è una periferica a funzione fissa che cattura i pixel in arrivo e li scrive in un framebuffer in memoria. Il codice Python non pilota mai direttamente questo bus; legge soltanto il framebuffer una volta che l’hardware ha terminato di riempirlo.