Master I2C con MCC

LM75A e PIC18F26K42

In questa pagina è mostrato come utilizzare MPLAB Code Configurator per realizzare un master I2C con un PIC18 dotato di modulo I2C dedicato, per esempio un PIC18(L)F26K42. 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.

Questo esempio utilizza come slave il sensore di temperatura LM75A, ma può essere considerato sufficientemente generale per qualunque tipo di dispositivo.

Come microcontrollore è stato utilizzato un PIC18(L)F26K42 che contiene due moduli dedicati I2C ed un modulo PPS. Se il processore che utilizzate contiene un modulo MSSP invece che I2C (per esempio un PIC18F25K50 o un PIC18F2xK22), fate riferimento alla pagina Master I2C con MCC (MSSP).

Hardware

Il circuito di riferimento è PIC-WL-Sen, ma il circuito può essere realizzato senza problemi con una qualunque scheda di sviluppo (nota 1) o direttamente su breadboard.

I2C: schema di riferimento

Si noti in particolare:

Configurazione con MCC

La configurazione del modulo I2C è particolarmente semplice:

Configurazione di I2C

L'unica particolarità e fonte di errate interpretazioni è la scelta della frequenza del clock I2C; quella visibile in basso non è infatti la frequenza del clock visibile all'esterno sul pin SCL, ma, nel caso specifico, un valore cinque volte superiore: nell'esempio il bus avrà una frequenza di 100 kHz, quella standard (nota 2).

Altrettanto semplice è la configurazione dei pin. Occorre prestare attenzione alle impostazioni dei due pin I2C che devono essere uscite e Open Drain (OD).

Configurazione dei pin

Una differenza significativa rispetto a quasi tutti gli altri PIC18 è la flessibilità permessa nella scelta dei pin, praticamente tutti quelli delle porte B e C.

Il codice

Il codice per leggere due byte da un registro è costituito da una sola funzione

Temperature = i2c2_read2ByteRegister(0x48, 0);

 

Le forme d'onda: lettura di due byte

Simile la funzione di scrittura del dato 0x01 (terzo argomento) nel registro 0x01 (secondo argomento):

i2c2_write1ByteRegister(0x48, 0x01, 0x01);

Le forme d'onda: scrittura di un byte

Un esempio di uso minimale delle funzioni contenute nel codice disponibile a fondo pagina:

#include "mcc_generated_files/mcc.h"
#include "LM75A.h"

void main(void) {
  float Temperature_f; // Temperature [degree Celsius]
  SYSTEM_Initialize();
  while (1) {
     PowerUpLM75();      // Wake up LM75A
     __delay_ms(300);    // Wait
     Temperature_f = ReadTemperatureLM75Af();
     PowerDownLM75();    // Power down LM75A
     // NOP();           // For debug, place here breakpoint
     // Do other stuff
     }
  }

Il codice delle funzioni disponibile a fondo pagina deve essere ovviamente letto consultando i fogli tecnici di LM75A. L'unica osservazione è relativa alla presenza di due funzioni molto simili:

La seconda funzione è meno comoda, ma ha due importanti vantaggi:

Codice

Note

  1. Se utilizzate PICdemo oppure PICdemo R2 occorre verificare che i corrispondenti interruttore siano in posizione off
  2. Dipende dal valore di Fast Mode Enable e vale 4 se abilitato, 5 se disabilitato
  3. La durata della transazione I2C ovviamente non cambia con il clock del processore ed è poco più di 450 µs)
  4. I numeri possono cambiare, anche in modo significativo, a secondo del livello di ottimizzazione impostato nel compilatore e delle funzioni usate in altri punti del codice


Data di creazione di questa pagina: luglio 2019
Ultima modifica: 20 luglio 2019


Licenza Creative Commons Attribuzione 4.0 Internazionale


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima