Tutorials - Elettronica

 
 

PCF8574/A


Un semplice I/O expander I2C.

Dove sia necessario disporre di I/O su un  bus I2C, il chip PCF8574 offre una soluzione semplice dal punto di vista della gestione.

Si tratta di un array di 8 bit che il costruttore (NXP e Texas) definisce "quasi-bidirectional".

Sotto questa strana definizione si nasconde una struttura molto semplice, ma anche efficace, la cui comprensione, però, richiede una attenta lettura del foglio dati, oltre ad una certa conoscenza dell'elettronica.
Per superare questi ostacoli e rendere utilizzabile il componente alla maggioranza degli utenti, vediamo di descriverlo nel dettaglio.

Il foglio dati offre un diagramma semplificato del componente, che è disponibile in vari packages (SOIC, VQFN, TSSOP, TVSOP, compreso un DIP a 16 pin).
Si interfaccia con il bus I2C attraverso i soliti SDA/SCL, per un clock fino a 100kHz.
A questi segnali si aggiunge una linea INT. 

Si tratta di una uscita open drain che va a livello basso ogni volta che è rilevata una variazione di stato sull' I/O port (come ingressi).  Questo è utile per informare il microcontroller che è avvenuto un evento in ingresso. Il comando della linea INT è dipendente dal PCF8574 ed è una "iniziativa" che la periferica determina autonomamente. Non è mascherabile e quindi sta all' utente del microcontroller la gestione del segnale. INT potrà essere collegato ad un I/O del microcontroller, ad esempio uno dei pin che generano una chiamata di interrupt, in modo tale che il programma possa prendere in carico l' evento nel modo più rapido ed efficace; oppure collegata ad un I/O generico e interrogata in polling.
In ogni caso, dato che si tratta di un open drain, occorre una resistenza di pull-up (valore tipico 4K7-10k).  
Linee INT di più dispositivi possono essere collegate in ORing; in questo caso il microcontroller dovrà leggere tutti gli slave per verificare quale ha effettuato la chiamata. Il reset di questo segnale avviene a seguito del ritorno del livello del pin di I/O, che lo ha generato, al valore precedente o della lettura/scrittura del port.
La linea INT è l' unica azione attiva direttamente comandata dal chip, che, per il resto, è una periferica del tutto slave.

L' indirizzamento sul bus I2C è definito, come solito, da alcuni bit fissi assegnati alla periferica a cui si aggiungono 3 bit (A2:0) impostabili via hardware dall' utente. Le due versioni del chip (PCF8574 e 8574A) si differenziano solamente per la parte dell' indirizzo pre fissata nel chip stesso.

           PCF8574                                              PCF8574A

 

A seconda della configurazione del pin A0,1,2 il chip assumerà i seguenti indirizzi:

Ricordiamo che il bit 0 dell'indirizzo a 7 bit vale 0 per la scrittura e 1 per la lettura.
Risulta evidente che sarà possibile collegare su un solo bus 8 PCF8574 e 8 PCF8574A, per un totale di 128 I/O.

Il chip dispone esclusivamente di questo indirizzo e, contrariamente a quanto ci si aspetti, non ha alcun registro interno: da qui possiamo partire per comprendere la definizione iniziale di "quasi-bidirectional".

In questo ci può essere di aiuto il diagramma semplificato dei port:

Il buffer in uscita è costituito dai soliti MOSFET P-N; osserviamo, però, che, mentre il MOSFET N collega direttamente il pin di I/O al GND, il MOSFET P ha in serie un generatore di corrente da 100uA: si tratta di qualcosa di simile ad un weak pull-up. In sostanza:

  • se il port è impostato a livello basso, il pin è collegato al gnd

  • se il port è impostato a livello 1, sul pin è applicato questo livello, salvato nel FF dati, ma attraverso una resistenza elevata

Sostanzialmente, programmando il pin a livello 0 lo colleghiamo direttamente al GND; programmandolo a livello 1 gli applichiamo un pull-up da 100uA.

Questo è reso anche dalle caratteristiche elettriche (foglio dati Texas):
 

Vediamo come la corrente assorbibile dal pin sia di 20mA a livello basso, mentre di soli 4mA (1mA nelle specifiche di NXP) a livello alto.
Questo vuol dire che è possibile comandare direttamente carichi appesi alla Vcc, come LED e piccoli relais, attraverso il MOSFET N che collega il pin a massa, mentre, se si vuole sfruttare il livello alto, occorrerà un buffer, dato che il livello alto è gestito praticamente solo dal weak pull-up.
Considerando il mA massimo delle specifiche NXP, occorrerà come buffer o una porta logica a basso fan-in o transistor BJT con elevato guadagno (per 200mA in collettore con 1mA di base, occorre un guadagno superiore minimo di 200).
Nel caso in cui si comandassero MOSFET, va tenuto presente che la bassa disponibilità di corrente finirebbe per limitare la frequenza massima di commutazione.

In effetti il circuito è lievemente più complesso; riprendiamo lo schema visto sopra evidenziando in rosso alcuni punti:

Al momento dell' impulso di scrittura, se il dato impostato è a livello alto, viene attivato un MOSFET ausiliario che collega il pin con la Vcc. La durata di questo collegamento diretto è limitata alla durata dell' impulso di scrittura, ma è utile per iniettare una corrente maggiore di quella limitata da weak pull-up.
Si tratta di un "acceleratore" o strong pull-up di corrente che permette di superare i 100uA del generatore di corrente del MOSFET P.
La breve durata dell' impulso è necessaria per evitare problemi quando il pin è impiegato come ingresso e viene tirato a livello basso. Al termine dell' impulso il livello alto sarà mantenuto solo da generatore di corrente. Questo consente di comandare anche piccoli MOSFET esterni senza problemi.

In questa struttura sta il trucco che determina il "quasi-bidirectional".

Se per comandare un pin in uscita basterà portarlo a livello alto o basso (con i limiti descritti nella corrente in uscita), per usare lo stesso pin come ingresso non occorre altro che portarlo a livello 1 !

In questo modo al pin è applicato il weak pull-up e il circuito esterno ad esso collegato non dovrà fare altro che portarlo a livello basso.

Infatti il latch di lettura, comandato dal relativo Read Pulse, è sempre collegato al pin. Questo vuol dire che la lettura del PCF8574 renderà sempre lo stato elettrico applicato ai pin.

Con questa soluzione si evita la necessità di un registro di direzione.


Comandare PCF8574.

Da quanto sopra, il comando del PCF8574/A è estremamente semplice:

  • scrittura di  pin come uscita :
    - inviare indirizzo con bit 0 = 0 (write)
    - inviare il dato con il valore da assegnare al pin

  • lettura di pin come ingressi
    I pin che si vogliono usare come ingressi saranno stati preventivamente scritti a livello alto : questo applica il weak pull-up e permette ad un dispositivo esterno di portare l'I/O a livello basso.
    Quindi. basta:
    - inviare indirizzo con bit 0 = 1 (read)
    - leggere il dato che contiene il valore pari al livello di ognuno degli 8 I/O

Per i pin che sono usati come uscite, la lettura riporterà il livello logico del pin.

Nel caso il cui si utilizzi la linea INT, questa andrà a livello basso a seguito di un cambiamento di stato in un pin causato da un segnale esterno. Si collegherà ad un I/O del microcontroller che gestisca un interruzione esterna oppure ad un I/O generico da testare in polling.
La cancellazione del segnale avviene automaticamente leggendo/scrivendo il PCF8754. 


Collegare carchi e ingressi.

Per le caratteristiche di corrente, se si deve comandare  LED, questi andranno collegati tra il pin e la Vcc.
Ovviamente la resistenza di limitazione della corrente per ogni LED è necessaria.

Collegandoli tra il pin e il GND non ci sarà sufficiente corrente disponibile per accenderli.

Nel caso in cui il carico assorba una corrente maggiore di 20mA, si potranno collegare più pin assieme, avendo ovviamente cura di commutarli tutti nello stesso istante.

Nel comando di carichi esterni che assorbono corrente, va tenuto conto del fatto che il chip ha un limite di corrente massima erogabile complessiva, che è pari a 100mA. Quindi si potranno, ad esempio, collegare non più di 5 LED da 20mA ciascuno o 8 LED da 12.5mA ciascuno.

Se si connette LED e chip alla stessa Vcc, va considerato che il è essenziale che la tensione del MOSFET P sia superiore o uguale a VCC per ridurre al minimo il consumo di corrente. 
La soluzione è aggiungere una resistenza di alto valore in parallelo al LED. 
Questo mantiene la VI dell'I/O pari o superiore VCC e riduce il consumo di corrente a LED spento.
La cosa può essere necessaria in applicazioni alimentate a batteria, dove occorre minimizzare i consumi.

E' possibile, quindi, alimentare carichi con una tensione diversa da quella del chip (sempre restando nei limiti delle caratteristiche, ovvero tra 2.3 e 5.5V).

Ad esempio, è possibile usare una Vcc per il PCF8574 di 3.3V e una di 5V per il LED (la Vcc del LED è maggiore alla Vcc del chip+VT del LED e il MOSFET lavora in condizioni ideali).

In uno stesso chip si potranno utilizzare alcuni pin come input e altri come output.
Non ci sono problemi nel collegare elementi logici CMOS o TTL e buffer darlington del genere ULN o MOSFET tipo 2N7000 o piccoli BJT con almeno 200 di guadagno.

Per quanto riguarda i segnali di ingresso, si potranno applicare open collector/open drain, optoisolatori o contatti, per i quali può essere necessario aggiungere un pull-up esterno dove richiedano una corrente maggiore dei 100uA disponibili.
Si tratta di elementi che portano il pina a massa, quindi l'ingresso attivato sarà riconosciuto da un livello 0

Si potranno altresì collegare senza problemi tastiere a matrice, moduli display LCD, opto per comando di TRIAC, driver per motori a passi, ecc.

Ovviamente non è possibile utilizzare gli I/O programmati a livello 0 come ingressi, ovvero i contatti non potranno essere collegati tra il pin e la Vcc, cercando di rilevare l'azionamento con un livello alto. In tal caso si corticuiterebbe il MOSFET N alla Vcc, danneggiandolo.

La caratteristica del quasi-biderezionale consente di utilizzare il PCF8574 per espandere sia uscite che i ingressi con un solo componente ed in modo molto flessibile.

Ad esempio, nella gestione di una logica esterna bidirezionale, come possono essere le linee dati di un modulo LCD, non occorre invertire la direzione degli I/O per passare da uscita a ingresso: basta che in lettura i pin siano impostati a livello alto.

Inoltre, la  "mancanza" di registri interni rende estremamente semplice la gestione del chip, che richiede solamente la sequenza indirizzo+dato.


Altre informazioni.

Per informazioni dettagliate su segnali, temporizzazioni, ecc. si rimanda ai fogli dati.

Può essere utile sapere che:

  • CAT9554/A di OnSemi è analogo a PCF8574, con la possibilità di lavorare anche su bus a 400kHz

  • JLC1565B di OnSemi è similare, ma contiene anche un DAC a 6 bit

  • esiste un PCF8575 a 16 bit.


Documentazione.

e inoltre:

 

a

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 01/02/19.