ORbit16™ – Interfacciamento fisico I/O
Questo post è principalmente per ricordare che il PIC24FJ64GB002 montato a bordo di ORbit16™, è una MCU che funziona a 3.3V, per cui sulla maggior parte dei pin non è possibile interfacciarsi con logiche a 5V, a meno che non si tratti di pin 5V-Tolerant. Con il passare del tempo saranno sempre meno le MCU funzionanti a 5V: ci si sposterà sempre di più verso logiche a 3.3V, che consentono una miniaturizzazione maggiore del die o, che è lo stesso, di avere un maggior numero di periferiche nello stesso spazio. Quando tutti si saranno “convertiti” ai 3.3V, il prossimo passo sarà, probabilmente, quello degli 1.8V.
Oggigiorno è inoltre sempre più facile trovare dispositivi capaci di interfacciarsi sia a 5V che a 3.3V, come display, moduli GPS, moduli GSM ecc. Anzi molti di questi ultimi moduli funzionano soltanto a 3.3V. Faccio qui una panoramica degli IO disponibili su ORbit16™:
In questo disegno ho indicato in viola i pin aventi anche funzione analogica (tra l’altro già contraddistinti da un asterisco sulla serigrafia, seguito dal numero del canale) e in verde i pin 5V-Tolerant.
In particolare ricordo che i pin il cui nome è racchiuso tra parentesi non sono subito disponibili perchè normalmente utilizzati da altre funzioni della scheda, ma possono esserlo seguendo le istruzioni riportate sul documento “Jumper Settings”. In particolare vediamo che i pin 5V tolerant sono un totale di 6.
RB11/RP11 (BP11) e RB10/RP10 (BP10) normalmente non sono disponibili perchè utilizzati rispettivamente dalle linee D- e D+ del modulo USB, per cui se volete utilizzare ORbit16™ con una MCU compatibile che non ha il modulo USB (o volete utilizzare lo stesso PIC fornito di serie sulla scheda, ma senza sfruttare il modulo USB), potete utilizzare anche questi 2 pin.
RB7/RP7 (B7), è il pin sul quale si trova anche la sorgente di interrupt esterno INT0, su tale pin è normalmente connesso il pulsante SW2, utilizzato sia come pulsante “utente” che per entrare in modalità bootloader. Ad ogni modo è anche possibile utilizzare tale pin escludendo il pulsante in maniera molto semplice, ma se utilizzate il bootloader non è consigliato.
RB5 (B5) è normalmente utilizzato dal led utente LD2, anche questo è facilmente escludibile. Anche se utilizzato per la segnalazione di ingresso in modalità bootloader, in realtà non è strettamente necessario per tale funzione dal momento che il software lato pc comunque rileva la connessione con ORbit16™ e questa segnalazione già può bastare.
Rimangono quindi RB8/RP8 (BP8) e RB9/RP9 (BP9), non utilizzati da altro sulla scheda e tra l’altro appartenenti al modulo1 I2C.
Indice dei contenuti
Interfacciamento UART
Nel momento in cui desideriamo interfacciarci con un dispositivo a 5V utilizzando l’UART, le soluzioni possibili sono tante. Innanzitutto, se non stiamo utilizzando il modulo I2C, possiamo ridirezionare la UART, utilizzando la funzionalità di PPS, sui pin RP8 e RP9, che sono 5V-tolerant. Anche se in realtà a noi interessa che soltanto la funzione di ricezione si trovi su un pin 5V-tolerant; la funzione di trasmissione del pic, su qualsiasi pin si trovi, opera sempre con un livello di 3.3V che in ogni caso viene riconosciuto correttamente anche dalle logiche a 5V e non richiede mai di essere adattato se non in casi eccezionali.
Per avere, ad esempio, la funzione RX (che è una funzione di Input) del modulo UART1 su RP8, possiamo scrivere:
__builtin_write_OSCCONL(OSCCON & ~(1<<6)); // sblocca i registri PPS RPINR18bits.U1RXR = 8; // assegno RX della UART1 al pin RP8 __builtin_write_OSCCONL(OSCCON | (1<<6)); // blocco i registri |
Ricordo che il registro RPINR18 serve a rimappare le sole funzioni di input del modulo UART1 (RX e CTS). I registri che permettono la funzionalità PPS sono organizzati in strutture, per cui abbiamo una struttura RPINR18bits che ci permette di accedere singolarmente ai vari gruppi di bit, in particolare il gruppo U1RX serve a ridirezionare unicamente la funzione RX: impostando tali bit sul valore 8 diciamo che tale funzione deve essere assegnata al pin RP8. Per maggiori informazioni vi rimando al nostro esauriente articolo sul Peripheral Pin Select e al PIC24F Family Reference Manual, Sezione 12 “I/O Ports with Peripheral Pin Select”.
I moduli GPS, a volte per interfacciarsi hanno bisogno che venga sfruttata unicamente la loro linea di trasmissione. Anche se hanno una linea di ricezione, questa serve spesso soltanto ad eseguire settaggi di cui magari non ce n’è bisogno perchè vanno bene le impostazioni di default. Personalmente tutti i moduli GPS che ho utilizzato li uso soltanto in ricezione e non ho mai avuto bisogno di trasmettergli nulla.
Nel caso in cui non possiamo interfacciare il nostro dispositivo UART funzionante a 5V ad un pin 5V-tolerant, la soluzione più semplice è quella di adottare un semplice partitore di tensione unicamente sulla linea di trasmissione del dispositivo che funziona a 5V:
Possiamo utilizzare R1=12KΩ e R2=22KΩ oppure R1=10KΩ e R2=18KΩ. La soluzione migliore, a mio avviso, resta quella di scegliere periferiche funzionanti a 3.3V in maniera “nativa”, questo se ovviamente dovete acquistarle.
Interfacciamento I2C
Se dovete interfacciarvi con dispositivi I2C che possono unicamente funzionare a 5V, la scelta giusta ricade sicuramente sui pin RB8 e RB9.
Ricordo che il PIC24FJ64GB002 ha due moduli I2C. Il modulo1 ha di default i pin su RB8 (clock) e RB9 (data), ma può anche essere ridirezionato su RA1 (clock) e RA0 (data). Questi due pin hanno difatti anche il contrassegno ASDA1 e ASCL1, tali pin però non sono 5V-tolerant. Il modulo2 I2C è invece posizionato sui pin RB3 (clock) e RB2 (data). Ad ogni modo le informazioni relative al posizionamento dei pin dei moduli I2C sono anche riportate sulla serigrafia in maniera da rendere facile l’individuazione dei pin, dato che il modulo I2C non può essere spostato sui pin RPx utilizzando la funzionalità di PPS. Come vedete a me piace lavorare senza dover avere troppe carte sottomano.
I livelli di tensione del modulo I2C non possono essere adattati utilizzando un partitore di tensione dato che la linea dati è bidirezionale e le velocità in gioco sono più alte: il partitore di tensione induce di fatti un certo slew rate che è ininfluente su una comunicazione UART, la quale che avviene a velocità relativamente basse, ma diventa importante su comunicazioni a velocità più elevate.
Se è proprio necessario dover interfacciare una periferica I2C a 5 Volt e le soluzioni esposte non vanno bene o non sono praticabili, l’unica via è utilizzare dei convertitori (o traslatori) di livello logico bidirezionali adatti all’I2C, come quelli basati sul PCA9306.
Interfacciamento SPI
La maggior parte dei moduli che comunicano in SPI in genere funzionano già a 3.3V (interfacce ethernet, interfacce wi-fi ecc). Ad ogni modo il modulo SPI può essere ridirezionato utilizzando la funzionalità PPS per cui è facile impostarlo su pin 5V tolerant. Se questa strada non è praticabile bisogna ricorrere a traslatori di livello logico. Nel caso dell’SPI abbiamo una scelta più ampia dato che non ha i problemi dell’I2C, dovuti soprattutto al fatto che l’I2C utilizza alti valori di resistenze di pullup che mandano in tilt molti integrati che si occupano del level-shifting. Utilizzando una comunicazione SPI a 3 o 4 fili (nelle quali un pin trasmette e uno riceve), non è necessario utilizzare traslatori bidirezionali e vanno bene soluzioni basate sul 4050 (buffer non invertente con pin tolleranti) sul più complicato 74LVX245. Altrimenti vanno anche bene soluzioni come questa utilizzante il TXB0108, che è bidirezionale.
Interfacciamento segnali analogici
Gli ingressi analogici si trovano tutti su pin non tolleranti i 5V.
Per i segnali analogici la soluzione migliore è utilizzare sensori che non forniscano più di 3.3V in uscita. Generalmente tutti i sensori possono essere alimentati anche a 3.3V e forniscono in uscita un valore proporzionale alla grandezza misurata e avente come limite superiore la tensione di alimentazione. Nei casi in cui si rende necessario utilizzare un sensore a 5V, le soluzioni sono tante e spaziano dall’utilizzare diodi di clamping ad attenuatori, come illustrato nel documento linkato nella sezione downloads di questo articolo.
Downloads
3V Tips ‘n Tricks: documento della Microchip che illustra le più svariate soluzioni per l’interfacciamento tra logiche a 3V e logiche a 5V.
SLAA148 Texas Instruments.