In questa pagina è mostrato come utilizzare MPLAB Code Configurator per realizzare un master I2C con il PIC18. Non verrà qui spiegato cosa è e come si usa il bus I2C. Semplicemente verranno presentati alcuni esempi che permettono di comprendere come usare un dispositivo I2C collegato ad un PIC. Qui qualche informazione.
Gli esempi utilizzano due slave piuttosto diffusi (il sensore di temperatura TC74 ed il sensore di luminosità TSL2561), ma possono essere considerati sufficientemente generali per qualunque tipo di dispositivo. Analogamente il processore utilizzato (un PIC18F25K50) è sostituibile con altri, purché supportati dal MCC e dotato di modulo MSSP. Il circuito stampato PIC-USB, parzialmente visibile nella fotografia di apertura, è facilmente sostituibile con altri oppure può essere realizzato direttamente su breadboard.
Se invece il vostro processore utilizza un modulo I2C dedicato, come ad esempio il PIC18(L)F2xK42, fate riferimento alla pagina Master I2C con MCC.
MCC gestisce il bus I2C tramite interruzioni e permette di trasmettere frame anche complessi.
La creazione del progetto non presenta particolati difficoltà.
Pur non essendo strettamente necessario conviene impostare il clock ad una frequenza elevata al fine di ridurre la latenza delle interruzioni:
La scelta di quali interrupt utilizzare e delle relative modalità dipende ovviamente dal complesso del progetto:
Anche la configurazione dei pin dipende dal complesso del progetto. Nell'esempio viene utilizzato solo RA1 (MyLED). Da osservare che è necessario configurare esplicitamente i due pin SDA e SCL (RB0 e RB1) come ingressi digitali, richiesta presente nei manuali tecnici, ma non evidenziata nella documentazione del MCC.
Infine occorre impostare il modulo MSSP come master I2C. I parametri da impostare:
Questo esempio (nota 2) mostra la semplice lettura di un byte. Lo slave utilizzato è il sensore di temperatura TC74 che, ad una richiesta di lettura, semplicemente risponde con un byte indicante la temperatura.
Il frame "teorico" scambiato tra master e slave è mostrato nello schema seguente dove il significato di lettere e simboli è il seguente:
Inoltre in blu sono i segnali generati dal PIC18 (master), in giallo quelli generati dal TC74 (slave)
Si notino in particolare il valore del bit di lettura / scrittura (freccia rossa) ed il riscontro negativo al termine della comunicazione (freccia verde).
Il codice è particolarmente semplice e l'avvio del processo di lettura consiste praticamente di una singola funzione:
I2C1_MasterRead(readBuffer, 1, TC74_ADDR, &status);
Gli argomenti di questa funzione sono piuttosto intuitivi e descritti all'interno del file i2c1.h, automaticamente generato da MCC:
Ovviamente prima dell'inizio del superloop del main() è necessario configurare le periferiche (operazione svolta automaticamente da MCC) ed attivare le interruzioni (codice da scrivere manualmente, decommentando le righe opportune)
Il seguente diagramma temporale mostra i segnali presenti. Dall'altro:
L'ultimo valore ritornato dalla funzione I2C1_MasterRead() indica lo stato della trasmissione I2C, che come abbiamo visto evolve in modo asincrono rispetto al programma principale.
I valori significativi di tale variabile sono:
Nel codice è inserito qualche esempio, sotto forma di commento
Questo esempio mostra la comunicazione più diffusa tra master e slave: quella in cui il master scrive un comando oppure un registro e lo slave risponde.
Come esempio viene utilizzato sempre il TC74. Il master invia prima l'indirizzo del registro che vuole leggere (nell'esempio: 0x00) e lo slave risponde con il suo contenuto (nell'esempio: 0x15).
Di seguito lo schema del frame scambiato tra master e slave ed il relativo diagramma temporale.
Nel linguaggio usato nella descrizione di MCC, tale frame viene definito come costituito da due Transaction Request Blocks (TRB), il primo di scrittura, il secondo di lettura.
Le funzioni utilizzate sono suddivise in due gruppi:
Gli argomenti delle due funzioni di *TRBBuild():
Nel codice di esempio:
La funzione I2C1_MasterTRBInsert(2, TRB, &status); inserisce nella coda di trasmissione i due elementi presenti nell'array TRB, iniziando l'effettiva trasmissione. Il significato di &status è già stato descritto
Il protocollo I2C prevede la lettura e la scrittura anche di blocchi di dati. Nel terzo esempio viene utilizzato un sensore di luminosità TSL2561 che permette di leggere un blocco di 4 byte dopo aver specificato gli opportuni valori nei registri interni.
Il codice è oggetto del primo esercizio, da fare consultando i fogli tecnici del componente.
Il codice mostrato è relativo al solo main() ed è richiesta la generazione del progetto utilizzando MPLAB(c) Code Configurator, come descritto in questa pagina
Data di creazione di questa pagina: aprile 2016
Ultima modifica: 25 aprile 2016
PIC18 in C - Versione 0.991 - luglio 2019
Copyright 2014-2019, Vincenzo Villa (https://www.vincenzov.net)
PIC18 in C di Vincenzo Villa è distribuito con Licenza Creative Commons Attribuzione 4.0 Internazionale