Master I2C con MCC (MSSP)

PIC18 + TSL2561 + TC74

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 configurazione del sistema e del modulo MSSP

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:

MCC: configurazione del clock

La scelta di quali interrupt utilizzare e delle relative modalità dipende ovviamente dal complesso del progetto:

MCC: cofigurazione delle interruzioni

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.

MCC: configurazione dei pin

Infine occorre impostare il modulo MSSP come master I2C. I parametri da impostare:

MCC: configurazione di MSSP

Esempio 1: lettura di un byte

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)

I2C: semplice lettura di un byte

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:

Diagrammi temporali 

status

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

Esempio 2: lettura di un byte da un registro

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.

Lettura di un byte da un registro - Schema

Lettura di un byte da un registro - 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

Esempio 3: lettura e scrittura di un blocchi di dati

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.

Codice

Il codice mostrato è relativo al solo main() ed è richiesta la generazione del progetto utilizzando MPLAB(c) Code Configurator, come descritto in questa pagina

Esercizi

  1. Analizzare il codice del terzo esempio
  2. Scrivere il codice per utilizzare altri dispositivi I2C, in base alla effettiva disponibilità dei componenti

Note

  1. Non è stata verificata l'opzione "10 bit" in quanto non si dispone al momento di alcuno slave compatibile con tale modalità
  2. Nell'esempio non è strettamente richiesto perché il ritardo inserito è in genere sufficiente per l'intera trasmissione del frame


Data di creazione di questa pagina: aprile 2016
Ultima modifica: 25 aprile 2016


Licenza Creative Commons Attribuzione 4.0 Internazionale


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima