Master I2C

Attenzione! Questa pagina contiene materiale obsoleto - Vai al tutorial relativo all'ambiente MPLAB X e XC8 Attenzione!

In questo breve tutorial vengono mostrati alcuni esempi di codice per collegare una periferica I2C ad un PIC18. La periferica è il MAX520 (un DAC quadruplo a 8 bit) ma con poche modifiche il codice è facilmente adattabile anche ad altri dispositivi.

Il circuito è stato realizzato su breadboard

Non verrà spiegato cosa è e come si usa il bus I2C. Semplicemente verrà illustrato un hardware e un programma minimale che permettono di usare un dispositivo I2C collegato ad un PIC.

Il circuito è stato realizzato su breadboard e per lo sviluppo del software è stato utilizzato il debugger ICD3 con il modulo header visibile nella fotografia, di colore rosso. Evidentemente la scelta non è vincolante.

Il semplice schema è lo stesso descritto alla in Collegare una periferica I2C al bus USB e si limita a due resistenze di pull-up da circa due kΩ connesse tra Vcc e le due linee SDA e SCL.

L'unica nota riguarda l'alimentazione. Il PIC18 è progettato per una alimentazione a 3,3 V, il MAX520 a 5 V. Per fortuna il PIC nella versione non a basso consumo è "5V tolerant" e quindi non ci sono problemi ad alimentare il tutto a questa tensione, anche attraverso l'emulatore. Purtroppo questo componente è l'unico trovato nel cassetto...

Usare il modulo MSSP come master I2C

Il PIC18 contiene al proprio interno un modulo hardware adatto, tra le altre cose, a funzionare come slave o come master I2C. Il codice completo.

I due segnali del PIC utilizzati per la comunicazione sono i pin 11 e 13 e non possono essere cambiati in quanto gestiti direttamente dall'hardware.

Prima di iniziare ad usare il modulo occorre inizializzarlo ed impostare la frequenza del clock, normalmente a 400 kHz. Da notare che la frequenza effettiva dipende dal clock del processore.

OpenI2C( MASTER, SLEW_ON );  // I2C Master mode, Slew rate enabled (for 400 kHz)
SSPADD = 9;                  // Set 400 kHz clock ( @ 16 MHz )

Il cuore del codice è piuttosto semplice:

StartI2C();     // Start I2C communication
IdleI2C();
WriteI2C( xx ); // Send data
IdleI2C();
[...]
StopI2C();      // Stop comunication

L'invio di un gruppo di byte, siano essi indirizzi o dati, inizia e termina con le funzioni di StartI2C() e StopI2C().

Inoltre ogni singolo invio di un byte deve essere preceduto e seguito dalla funzione IdleI2C() che permette di verificare che il modulo hardware non sia impegnato in altre operazioni.

Il significato dei codici trasmessi dipende ovviamente dalla specifica periferica utilizzata e possono essere trovati sui fogli tecnici del componente. Per il MAX520 potete inizialmente far riferimento alla a Collegare una periferica I2C al bus USB. Per comodità questi comandi sono stati raccolti nella funzione write_to_DAC().

Il codice nel suo complesso genera una coppia di segnali a denti di sega, utilizzando due dei DAC presenti, come di seguito mostrato.

Una coppia di segnali a denti di sega generati da un DAC i2c collegato ad un PIC

In un periodo (circa 60 ms) vengono trasmessi 256 + 256 campioni, velocità limitata a qualcosa meno di 10.000 pacchetti al secondo principalmente dalla lentezza del protocollo I2C.

Una funzione delle librerie Microchip permette di trasmettere in blocco una stringa ed è stata utilizzata per scrivere la funzione write_to_DAC_V2(), ovviamente alternativa alla precedente ed identica negli effetti. Una cosa sorprendente: la sua esecuzione è, di poco, più lenta della funzione che scrive un solo byte alla volta.

I2C software

Le librerie Microchip contengono anche alcune funzioni adatte ad operare senza appoggiarsi ad hardware specifico. In questo caso i pin utilizzati sono 6 e 7 (RC4 e RC3) ma possono, volendo, essere modificati.

L'uso di queste funzioni può rivelarsi utile nel caso in cui sia necessaria una seconda interfaccia di comunicazione oppure nel caso in cui il modulo hardware sia già utilizzato, per esempio per una comunicazione SPI.

Questo gruppo di funzioni sono state utilizzate per scrivere la funzione write_to_DAC_SW(), funzionalmente identica alle precedenti e simile a write_to_DAC() come struttura.

Scarica il codice sorgente

Licenza "Creative Commons" - Attribuzione-Condividi allo stesso modo 3.0 Unported


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima