I2C: un viaggio alla (ri)scoperta del protocollo, tra basi e funzioni avanzate

protocollo i2c

Alcuni di noi, con ottima probabilità, ne siamo sicuri, già conoscono oppure hanno utilizzato il protocollo di comunicazione I2C. Tanti, però, probabilmente, ne ignorano il funzionamento e le potenzialità, soprattutto se utilizzato in maniera avanzata. Ecco allora un articolo in cui ci occupiamo di questo versatile e validissimo protocollo dandone uno sguardo approfondito ad aspetti, funzioni ma soprattutto applicazioni. Parleremo diffusamente di start bit, I2C boost ed I/O expander: siete pronti?

Diciamoci la verità: iniziare non è mai facile, soprattutto quando si lavora in un settore come quello della progettazione. Ci sono talmente tante cose da imparare per talmente tante interfacce che è importante saper maneggiare con destrezza fin da subito che imparare sembra davvero una sfida all'altezza solo dei migliori.
La verità, però, è che imparare serve per tutti, anche soltanto per migliorare, e per questo motivo c'è davvero bisogno di approfondire tutto: dalle tematiche base fino alle più complesse. Oggi vediamo il bus I2C, ed il suo protocollo. Cerchiamo di capire come funziona e come fare per utilizzarlo al meglio anche volendo lavorare in applicazioni di tipo avanzato.
Per farlo, cominciamo con gli aspetti base.

Il bus I2C, fisicamente

Il nome I²C (da ora I2C), che sta per Inter-Integrated Circuit, è stato creato dalla Philips Semiconductors ed è costituito da due fili che rappresentano i collegamenti denominati SCL ed SDA. Tutto qui, non c'è nient'altro da dire, fisicamente. È davvero così semplice.
Ciò che non è altrettanto semplice è il loro scopo, a che cosa servono. SCL rappresenta la linea sulla quale viaggia il segnale di clock, il cui scopo è quello di sincronizzare tutti i trasferimenti di dati sul bus. Naturalmente questa esigenza dipende dal fatto che il trasferimento dei dati è un'operazione che ha bisogno di essere scandita da istanti temporali definiti e soprattutto c'è necessità che sia svolta secondo un preciso ordine che mantiene la cronologia dell'invio dei bit perché grazie alla consequenzialità è possibile garantire l'integrità dell'informazione.
SDA, invece, rappresenta la linea sulla quale viaggiano i dati.
Entrambe sono connesse a tutti i dispositivi sul bus I2C. Ora ci arriveremo e spiegheremo come sia possibile, in effetti, connettere fisicamente un numero elevato di strumenti alla stessa coppia di fili.
In verità non si tratta solo di due connessioni ma di tre fili diversi dei quali, quest'ultimo, rappresenta la connessione a massa, cioè a 0 V (in logica positiva).
Esiste, comunque, è possibile in alcuni casi, una connessione ad una linea a 5 V, ovvero all'alimentazione, distribuita ad alcuni dispositivi che ne abbiano necessità.
Sia la linea SCL sia SDA sono “open drain”; che cosa vuol dire? Semplicemente che questo permette di pilotare le uscite in maniera che siano basse ma non alte ovvero c'è bisogno di una rete di pull-up (costituita molto spesso anche da un semplice resistore di valore opportuno) per fare in modo che l'uscita possa anche essere alta.
Altri resistori possono essere utilizzati per fare in modo che le due linee di cui abbiamo parlato fino a questo momento possano anche essere portate al pull-up. Non è indispensabile, però, almeno non per tutti i dispositivi.
Se questo accade, avremo una situazione come descritta nell'immagine che segue:
un aspetto importante di questa valutazione riguarda proprio il valore dei resistori: non è particolarmente importante. Più o meno potete usare di tutto, da 1 kΩ fino a 47 kΩ. Molto comuni sono i resistori da 10 kΩ. Molto dipende dal valore di corrente in ingresso al microcontrollore ma naturalmente, proprio per questo motivo, non è possibile definire una regola generale. Peraltro, vi consigliamo caldamente di valutare come variano le prestazioni in funzione del valore di resistenza che state scegliendo di utilizzare: provate a farli variare e a vedere come risponde il bus e quanto e come questa risposta cambia.
In ogni caso, senza questi resistori, indipendentemente dai loro valori, le linee SCL ed SDA saranno sempre di valore prossimo allo zero e quindi il protocollo di comunicazione non funzionerà.

Master o Slave

I dispositivi su I2C possono essere sia master sia slave. I primi sono quelli che pilotano la linea di clock mentre i secondi rispondono ai master. Uno slave non può in alcun modo iniziare il trasferimento sul bus e questa è probabilmente la più importante delle differenze: soltanto il master può farlo.
Un caso molto frequente, e più o meno lo avevamo accennato, è il fatto che ci siano più slave contemporaneamente sullo stesso bus. Tuttavia è possibile che tutto funzioni se esiste uno ed un solo master. Come tutte le regole, però, anche questa ha delle (seppur rare) eccezioni; esse però esulano dallo scopo di questo articolo e non vengono trattate qui. Possono comunque essere argomento di approfondimento in un articolo dedicato se l'argomento interessa voi utenti. Vi ricordiamo che, per queste ma anche altre questioni, i commenti sono il luogo giusto per proporlo.
Altro aspetto fondamentale è che gli slave non possono in alcun modo iniziare il trasferimento dei dati benché entrambi, master e slave, possano trasferire dati sul bus. Questo vuol dire che soltanto il master può controllare il trasferimento e di conseguenza comandarlo.
Dal momento che parliamo di trasferimento di dati e di priorità, introduciamo un acronimo interessante: CSMA/CA, che sta per Carrier-Sense Multiple-Access with Collision Avoidance. Si tratta di un sistema di comunicazione, come il nome suggerisce, ad accesso multiplo, cioè un bus in cui ogni elemento presente attende che il canale sia disattivato per poter iniziare la sua trasmissione (Carrier-Sense). Sì come può sempre capitare che due elementi presenti all'interno dello stesso circuito si accorgano che il canale è disattivo contemporaneamente, è possibile, in linea teorica, sebbene non sia tanto frequente, che due trasmissioni comincino contemporaneamente. In questo caso deve esistere un sistema che evita che i messaggi trasmessi vengano in collisione tra di loro ovvero si confondano ovvero si perdano e non siano più intellegibili. Ecco che cosa vuol dire “Collision Avoidance”. Per fare ciò viene messo in piedi un sistema di priorità basato sull'indirizzo per cui diventa prioritaria la trasmissione che si dirige verso lo slave con indirizzo minore.
Non è nuova questa tecnica, viene anche usata su bus CAN (Computer-Area Network). Altri protocolli, come Ethernet, utilizzano un algoritmo in cui la trasmissione contemporanea porta alla perdita di entrambi i pacchetti anche se l'errore viene rivelato da tutti sul bus. Questa tecnica si chiama CSMA/CD, e differisce dalla prima proprio perché l'acronimo termina con “Collision Detection”.

Il protocollo I2C, fisicamente

Quando il master (il controller) deve comunicare con uno slave, inizia istruendo la sequenza sul bus. La sequenza non è altro che un bitstream ordinato all'interno del quale vengono utilizzati segnali convenzionali che servono ad indicare che un messaggio sta per essere trasferito, una serie di dati che costituiscono il messaggio stesso e poi altri segnali convenzionali il cui scopo è quello di notificare che la comunicazione è terminata. Le sequenza di Start e di Stop sono, come dicevamo, segnali convenzionali all'interno dei quali SDA può cambiare SOLO SE SCL è a valore logico alto.
I dati che vengono trasferiti sono formattato in una sequenza da 8 bit e sono posizionati sulla linea SDA a partire dall'MSB (Most Significant Bit). La linea di clock viene portata alta e poi abbassata di valore. Per ciascun gruppo di 8 bit che venga trasferito il dispositivo che riceve invia un segnale detto di “acknowledge”. Dal momento che il ricevitore ha ricevuto il byte, esso resta in attesa per l'eventuale secondo.

Veloce? E quanto?

La frequenza di clock standard è pari a 100 kHz. Tuttavia sono possibili altre modalità come “Fast mode”, che arriva fino a 400 kHz su, ed anche “High Speed mode” che si spinge fino ad un massimo di 3.4 Mhz. Tuttavia la maggior parte dei moduli funzionano alla prima delle frequenze che vi abbiamo riportato.
Naturalmente a seconda della velocità che vogliamo garantire nella specifica applicazione possiamo scegliere di utilizzare questo protocollo oppure no. Di solito si verifica che gli integrati che sono fisicamente alloggiati su una scheda devono scambiarsi informazioni di controllo senza particolari requisiti di velocità. Pensiamo, per esempio ad un convertitore video che avrà parametri di luminosità e contrasto che devono poter essere modificati senza che si interrompa mai il flusso di dati, pena delle interruzioni nella riproduzione.
Se pensiamo, invece, a sensori più lenti, come per esempio un termometro, esso non verrà mai interrogato ogni secondo: non avrebbe senso. La temperatura è una variabile continua che però varia molto lentamente nel tempo dal momento che non ci aspettiamo mai una escursione maggiore di 15° nell'arco di 24 ore.
Ecco, in casi come questi, ma ce ne sono molti altri che si potrebbero prendere in esame, l'utilizzo di un canale condiviso come l'I2C permette di limitare molto il numero di segnali elettrici che bisogna condurre tramite piste sul nostro circuito stampato.

A ciascuno il suo indirizzo

Tutti i dispositivi, i sensori e/o gli attuatori connessi a questo bus hanno necessità di essere identificati univocamente tramite un indirizzo che può essere di lunghezza pari a 7 oppure a 10 bit. L'utilizzo di indirizzi di profondità pari a 10 bit è abbastanza raro e pertanto non tratteremo questo caso.
La maggior parte dei moduli, quindi, possono essere gestiti con indirizzi lunghi 7 bit il che vuol dire che potete avere fino a 128 dispositivi su un singolo bus, con indirizzi che vanno da 0 a 127. Sebbene ci siano solo 7 bit all'interno dell'indirizzo, dobbiamo comunque sempre inviare 8 bit, ovvero 1 byte, di informazione. Il bit extra viene utilizzato per informare lo slave del fatto che il master voglia effettuare un'operazione di lettura oppure di scrittura. In particolare i primi bit sono quelli dell'indirizzo mentre l'ultimo, l'LSB (Least Significant Bit), indica il tipo dell'operazione.

Molto spesso il fatto che i bit siano ordinati in questo modo può indurre in confusione quelli che si approcciano per la prima volta a questo argomento. Però la cosa è molto semplice: vuol dire che per scrivere indirizzo, per esempio il 21, bisogna scrivere il 42, cioè il 21 spostato di una posizione. È probabilmente molto semplice pensare all'indirizzo come un indirizzo ad 8 bit che sia un numero pari nel caso in cui l'operazione da fare sia di scrittura e dispari nel caso in cui l'operazione sia di lettura.

Una cosa importante che bisogna notare è che il numero massimo di dispositivi collegabili tramite questo protocollo sia limitato non dipende soltanto dal numero di indirizzi disponibili ma anche dalla capacità totale del bus che vale, al massimo, 400 pF. Come potete ben intuire, una componente capacitiva ha, o può avere, effetti di diverso tipo sulla risposta al transitorio dell'intero sistema; un aumento della componente capacitiva, infatti, implica una diminuzione della larghezza di banda perchè la costante di tempo caratteristica del circuito aumenta. Questo, evidentemente, può avere delle conseguenze sulla velocità di funzionamento di tutto il bus. Ecco per quale motivo tale valore va considerato come critico.
Il protocollo software
La prima cosa che di solito succede quando si utilizza protocollo è che il dispositivo master invia la sequenza di Start. Questo diventa un messaggio per tutti i dispositivi slave sul bus, che restano allertati rispetto al fatto che la trasmissione sta per iniziare e che devono rimanere in ascolto nel caso in cui il messaggio sia al loro indirizzato. Naturalmente soltanto a ricezione completa dell'indirizzo sarà possibile, per il dispositivo direttamente interessato, restare in ascolto è a quel punto valutare se l'operazione sia di lettura o di scrittura.
Quale sia il contenuto poi del messaggio dipende dal destinatario: un dispositivo slave può avere diversi registri di profondità qualsiasi. Sta a chi ha creato il messaggio sapere dove e come andare a leggere l'informazione contenuta all'interno del dispositivo slave.
Supponiamo di avere a disposizione un dispositivo con 16 locazioni di memoria numerate da 0 a 15 o magari uno che ne ha 36. Avendo inviato l'indirizzo I2C ed anche l'indirizzo del registro interno, il master può ora finalmente inviare il data byte (ammesso che solo di 1 byte si tratti). La trasmissione, ad opera del master, può continuare e possono continuare ad essere inviati byte allo slave che verranno posizionati all'interno dei registri seguenti perché il dispositivo continuerà ad incrementare automaticamente l'indirizzo dei registri interni alla fine di ciascun byte trasmesso e ricevuto.
Quando la trasmissione è terminata, perché tutti i data bytes sono stati inviati, viene trasmessa la sequenza di stop che completa la comunicazione. Sebbene questo argomento sia già stato ampiamente trattato in questa puntata del nostro corso di programmazione su ARM, nell'ottica di restituire un quadro completo cerchiamo di raccontarvela al meglio.
Visto tutto quanto è stato detto, per poter scrivere su un dispositivo slave occorrono:
  • segnale di start;
  • indirizzo del dispositivo, seguito dal "write" bit;
  • trasmissione dell'indirizzo del registro all'interno del quale il dato verrà scritto;
  • trasmissione dei dati;
  • segnale di stop.
Negli esempi che abbiamo fatto in precedenza, soprattutto se i dispositivi hanno degli indirizzi pre-impostati come valori di fabbrica, supponiamo 0xE0, volendo comunicare dovremmo inviare:
  • la sequenza di start;
  • 0xE0 (indirizzo I2C con bit R/W);
  • 0x00 (indirizzo interno al command register)
  • 0x51 (comando per iniziare il ranging)
  • sequenza di stop.

Leggiamo dagli slave

Nel caso in cui quello che dovete fare sia leggere il dato proveniente da uno slave la cosa è leggermente più complicata, in realtà non molto di più. Prima di leggere dal dispositivo bisogna dirgli a quale dei suoi indirizzi interni di memoria si vuole avere accesso (e questo dipende da quale sia la locazione di memoria all'interno della quale viene scritto il dato). Per paradosso questo vuol dire che la lettura di un dato da un dispositivo comincia scrivendoci sopra, ovvero bisogna inviare la sequenza di start, l'indirizzo seguito dal bit R/W che questa volta sarà pari e il resto della sequenza esattamente come descritto qui. Pertanto, sempre lavorando con quei dispositivi dell'esempio che abbiamo fatto in precedenza, invieremo sul bus qualcosa di questo tipo:
  • sequenza di start;
  • 0xC0 (indirizzo I2C seguito dal bit R/W pari);
  • 0x01 (indirizzo del registro interno);
  • ripetizione della sequenza di start;
  • 0xC1 (indirizzo I2C seguito dal bit R/W dispari);
  • lettura dei dati;
  • sequenza di stop.
Ora, detto tutto questo, c'è da valutare anche una piccola complicazione: quando il dispositivo master sta leggendo dal suo slave di riferimento, è quest'ultimo che utilizza la line SDA per comunicare i byte, però è sempre il master a controllare la linea di clock.
Che succede, quindi, se lo slave non è ancora pronto per inviare i dati? Se supponiamo di avere a che fare con dispositivi come le EEPROM, questa situazione non sarebbe un problema ma quando il dispositivo slave è un microcontrollore, per esempio, la situazione si complica appena. I microcontrollori svolgono una serie di funzioni, hanno tanti compiti ed è possibile che siano impegnati nel momento in cui gli viene richiesto di svolgere un compito qualsiasi. In questa situazione, il dispositivo avrà necessità di iniziare una routine di interrupt, salvare i registri sui quali sta lavorando, identificare l'indirizzo che il master vuole leggere, recuperare i dati e fare in modo da trasmetterli.
Questa operazione è certamente più lunga a scriversi che a farsi e dura, infatti, qualche micro secondo. Nel frattempo il master invia impulsi di clock sulla linea dedicata a cui lo slave non risponde.
A questo genere di situazione il protocollo fornisce una soluzione: allo slave è concesso di mantenere basso il valore della linea SCL. Si chiama “clock stretching”.
Quando lo slave riceve il comando di lettura allora ritiene la linea di clock. Il microprocessore, poi, acquisisce i dati, come dicevamo, li copia all'interno del registro di trasmissione e rilascia la linea di clock permettendo al resistore di pull-up di far diventare alto il valore sulla linea.
Dal punto di vista del dispositivo master, questo procedimento inficia il primo impulso di sincronizzazione di lettura rendendo alta la linea SCL per poi controllare se sia davvero alto il valore sulla stessa. Se è ancora basso allora vuol dire che lo slave lo sta mantenendo tale e pertanto il master sa che deve attendere la fine delle operazioni.
Sebbene questo genere di procedure siano automatizzate accade, talvolta, che ci siano delle subroutines che ignorano completamente questo procedimento. Fate attenzione perché questo causerà certamente delle trasmissioni errate in lettura.

Acknowledge

Lo abbiamo nominato ma è il caso di approfondire brevemente a che cosa serva e di che cosa si tratti. Questo bit, generato dal dispositivo che riceve la trasmissione, indica al trasmettitore che il trasferimento dei dati è effettivamente andato a buon fine. L'impulso di clock viene “emesso” per l'acknowledge e viene sempre creato dal master.
In realtà la generazione di questo bit può essere ad opera sia del master sia dello slave, a seconda della direzione della trasmissione. Quando il master scrive sullo slave, è quest'ultimo a generare l'acknowledge. In caso contrario, il viceversa. Sostanzialmente resta fisso il concetto che è sempre il ricevitore a generarlo.
Il segnale è basso, ovvero corrispondente a 0 V. Il suo duale, ovvero il NACK (Not acknowledge), invece, è un valore alto.

Deja-vù

Sulle nostre pagine, come dicevamo in apertura, abbiamo già avuto modo di parlare di protocollo I2C e non soltanto in linea teorica. Qualcuno di noi, infatti, si è occupato di metterlo alla prova e descriverne il funzionamento nell'ambito di un esperimento che coinvolge Raspberry Pi. In realtà, però, il problema è capire, sempre, a seconda delle nostre esigenze e della nostra specifica applicazione, se sia il caso di utilizzare un certo protocollo di comunicazione oppure se non sia forse più opportuno valutare l'impiego di un'alternativa: in quest'ottica abbiamo pubblicato un articolo in cui si valutava anche la possibilità di lavorare su SPI.
Non ci siamo fatti mancare niente, in realtà, perché abbiamo visto il protocollo al lavoro impiegato insieme con Arduino sia quando abbiamo parlato di MEMS ed accelerometri sia quando abbiamo lavorato con sensori più semplici.

Sappiamo cos'è: lavoriamoci al meglio

Ora che sappiamo come funziona, vediamo se riusciamo a lavorarci meglio. Esistono una serie di soluzioni, già disponibili sul mercato, per poter espandere il bus I2C ed ottenere migliori prestazioni.
Vi facciamo vedere alcune soluzioni davvero interessanti.
La prima è della NXP. Si tratta dell'NXP I2C-bus extender P82B715, impiegato in una applicazione specifica.
Questo non è altro che un circuito integrato analogico bipolare che vi permetterà di lavorare con il bus I2C così come lo conoscete senza avere alcun problema di prestazioni ma garantendo di una distanza di collegamento complessivo del sistema che potrà raggiungere addirittura i 30 m oppure una capacità specifica che arrivi fino a 3 nF!
Vi ricordate le limitazioni di cui avevamo parlato? Il valore di capacità sul bus è sempre il caso che non superi i 400 pF. Bene, in questo caso potrete lavorare molto meglio di così.
Sembrano davvero dei gran bei vantaggi ma come fa? Che cos'è questo integrato?
Vediamo innanzitutto per quale motivo questo è possibile e quali sono le caratteristiche specifiche del integrato di qui stiamo parlando:
  • gain buffer a guadagno unitario duale e bidirezionale;
  • nessun controllo direzionale esterno richiesto;
  • perfetta compatibilità con lo standard I2C;
  • la logica dei segnali arriva a comprendere l'intero range operativo;
  • trasformazione di impedenza 10x;
  • ampio intervallo di alimentazione (da 3 a 12 V);
  • frequenza di clock compresa tra 100 kHz e 400 kHz (o superiore se richiesto dall'applicazione);
  • protezione ESD (2500 V HBM per Mil Std);
  • tutti gli I/O sono dotati di diodi tra VCC e GND;
  • packages 8-pin SO e DIL.
A cosa può servire è presto detto: lo scopo è quello di migliorare le prestazioni del bus rendendo:
  • maggiore la capacità totale del sistema (fino a 3nF);
  • più semplice pilotare segnali a distanze fino a 30 m;
  • pilotare carichi più grandi;
  • migliorare l'immunità ai rumori e ai disturbi;
  • implementare la distribuzione di segnali multi-drop utilizzando cavi twisted-pair.

Le soluzioni proposte

Non abbiamo particolari interessi a mostrare i prodotti di questo o di quell'altro brand. Ciò che vogliamo fare, però, in questo paragrafo è farvi vedere come si organizzano e cosa hanno da offrire. Per questo abbiamo selezionato due brand a caso (davvero a caso!) che si occupano, tra le altre cose, di I/O expander.
La prima soluzione è firmata Maxim ed è una serie in continua espansione di circuiti integrati che possono gestire interfacce a 2 e a 4 fili per effettuare I/O expanding. Questi I/O expanders gestiscono dalle 8 alle 28 porte di I/O sono disponibili in una serie piuttosto differenziata di packages. Questo non è soltanto un vantaggio perché supporta lo sviluppo di diverse applicazioni ma permette anche l'implementazione di nuove features.
Prendete per esempio il DS4520: si tratta di un I/O expander che è anche dotato di un'espansione di memoria. Piuttosto simile a quello che fa il DS4550 solo che quest'ultimo lavora anche su JTAG. Di esempi potremmo farvene numerosi ma quello che ci interessa farvi capire è che l'I/O expanding per sua stessa natura vi permetterà di dotare la vostra applicazione anche di strumenti che non aveva prima.
A dir la verità, una ben più numerosa gamma di prodotti viene offerta dalla Texas Instruments. Per chi non conoscesse il loro sito, sappiate che una delle più utili funzioni che sono state previste è la ricerca parametrica; è grazie all'analisi dei semplici parametri che potrete già rendervi conto di quanto siano differenziati questi prodotti. Nulla di troppo nuovo, in realtà, rispetto a quello che abbiamo detto ma è fondamentale, perchè potrete fare una ricerca più semplice ed individuare subito gli integrati in base ai parametri che state cercando.
Se parliamo di I/O expander la prima e più importante voce sulla quale dovrete puntare è il numero delle uscite. Successivamente vi servirà cercare l'integrato sulla base della frequenza operativa. Fate bene attenzione alla massima frequenza operativa perché questo potrebbe essere utile se volete spingere l'applicazione oltre la frequenza di funzionamento per fare dei test.
Abbiamo anche parlato delle tensioni operative, anche e soprattutto in funzione della logica del circuito, per cui potrete scegliere con accuratezza VCC (min) e (MAX).
Vi avevamo parlato del fatto che l'indirizzo I2C può essere un parametro impostato come valore di fabbrica. Utilizzate questo criterio come funzione di controllo per evitare preventivamente che ci siano conflitti.
Se parliamo di aggiornare un'applicazione esistente non possiamo non tenere conto della temperatura operativa e del suo range di riferimento. Come sappiamo, questi valori sono direttamente connessi, se non conseguenza, del tipo di Package e del pinout dell'integrato.
Supponiamo che voi abbiate bisogno di un integrato che lavori in un range di temperatura compreso fra -30 e 85 °C, con una frequenza operativa di 400 kHz e che sia in grado di gestire 104 I/O. Il campo si è già ristretto ed una delle soluzioni proposte è l'LM8330, un keypad controller compatibile I2C con GPIO, PWM e protezione ESD IEC61000.
Di esempi se ne potrebbero fare tantissimi ma siamo sicuri che il concetto di base lo avete afferrato. Per questo motivo vediamo

Un esempio pratico

Si tratta di un caso abbastanza semplice cioè un booster pack su SPI/I2C. In realtà l'intera serie Launchpad è diventata davvero impressionante nel corso del tempo ed uno dei suoi esponenti  è proprio il TPL0401EVM.
É stato progettato per operare insieme con l'MSP-EXP430G2. La sua dotazione prevede un microcontrollore MSP430G2553 inserito in un socket DIP che consente tre distinte modalità operative di valutazione:
  • LED mode, ovvero una modalità standard in cui il TPL0401 viene alimentato. I dispositivi vengono utilizzati per controllare un LED RGB. Qui vengono limitati i valori di corrente al driver LED TLC59108. Questa modalità si avvia in automatico e non ha bisogno di essere controllato dall'utente attraverso alcun tipo di GUI. Il LED flashing e color mixing può essere controllata direttamente sulla scheda.
  • Adjustable voltage reference mode, in cui il TPL0401 viene impiegato insieme con l'LMV321 per fungere da riferimento di tensione controllabile.
  • Variable gain mode, ove il TPL0401 è configurato da amplificatore non in vertente a guadagno variabile, quest'ultimo controllabile da un'interfaccia digitale. Questa modalità può essere molto utile per effettuare una valutazione qualitativa della banda operativa del TPL0401.

Concludendo

Quello che abbiamo visto oggi è un resoconto abbastanza esaustivo di tutti quelli che sono gli aspetti fondamentali del protocollo di comunicazione I2C e del suo funzionamento. Le possibilità per migliorarlo ed approfondire il metodo di lavoro ma anche l'espansione delle sue caratteristiche lo rendono un argomento vasto e molto interessante. Sebbene le sue caratteristiche di base siano utili soltanto per applicazioni non eccessivamente professionali, la possibilità di migliorarle utilizzando strumenti aggiunti ci permettono di considerarlo uno strumento di lavoro di gran pregio.

 

Crediti: Le immagini utilizzate in questo articolo sono tratte da questo sito e da quest'altro.

 

Quello che hai appena letto è un Articolo Premium reso disponibile affinché potessi valutare la qualità dei nostri contenuti!

 

Gli Articoli Tecnici Premium sono infatti riservati agli abbonati e vengono raccolti mensilmente nella nostra rivista digitale EOS-Book in PDF, ePub e mobi.
volantino eos-book1
Vorresti accedere a tutti gli altri Articoli Premium e fare il download degli EOS-Book? Allora valuta la possibilità di sottoscrivere un abbonamento a partire da € 2,95!
Scopri di più

15 Comments

  1. Luca Di Capita 24 dicembre 2013
  2. Emanuele Emanuele 27 dicembre 2013
  3. adrirobot 31 dicembre 2013
  4. Marven 31 dicembre 2013
  5. IvanScordato Ivan Scordato 9 gennaio 2014
  6. Piero Boccadoro Piero Boccadoro 9 gennaio 2014
  7. Piero Boccadoro Piero Boccadoro 9 gennaio 2014
  8. IvanScordato Ivan Scordato 9 gennaio 2014
  9. Piero Boccadoro Piero Boccadoro 9 gennaio 2014
  10. Piero Boccadoro Piero Boccadoro 9 gennaio 2014
  11. Piero Boccadoro Piero Boccadoro 9 gennaio 2014
  12. Emanuele Emanuele 10 gennaio 2014
  13. IvanScordato Ivan Scordato 10 gennaio 2014
  14. Emanuele Emanuele 10 gennaio 2014
  15. IvanScordato Ivan Scordato 10 gennaio 2014

Leave a Reply

Raspberry Pi 3 GRATIS! (Win10 compatibile)

Fai un abbonamento Platinum (EOS-Book + Firmware), ricevi in OMAGGIO la RASPBERRY 3, inviaci il tuo progetto e OTTIENI IL RIMBORSO