ORbit16™ – Libreria EEprom I2C

Ho appena finito di testare una piccola libreria che ho scritto per ORbit16™ da utilizzare per l’interfacciamento con le EEprom I2C. Anche se oramai ci abbiamo provato gusto con la memorizzazione dei dati su pendrive usb, avere una eeprom a portata di mano è sempre comodo, anche perchè sono molto semplici da utilizzare, costano poco e occupano poco spazio. In aggiunta si tratta sicuramente di una buona base di partenza per l’interfacciamento con qualsiasi dispositivo funzionante in I2C dato che funzionano tutti più o meno allo stesso modo.

La libreria in oggetto si appoggia alla libreria standard I2C della Microchip per cui è necessario includere questa prima di includere la libreria per le eeprom:

#include <i2c.h>

Maggiori informazioni sull’utilizzo della libreria standard della microchip possono essere trovate (oserei aggiungere: finalmente!) nel documento

Microchip PIC24F Peripheral Library.chm

disponibile con le nuove versioni di MPLAB C30 nella cartella

C:\Program Files\Microchip\mplabc30\vX.XXc\docs\periph_lib

La Microchip con questo documento ha colmato una grande lacuna dato che la documentazione per le librerie fin’ora era disponibile unicamente per gli altri PICmicro a 16bit, in formato html, e molte cose non combaciavano.

La libreria per le eeprom I2C include unicamente 3 semplici funzioni:

void ee_write(const unsigned char deviceId, unsigned int address, unsigned char data);
unsigned char ee_read(const unsigned char deviceId, unsigned char address);
void ee_seq_read(const unsigned char deviceId, unsigned int startAddress, unsigned char numReads, char *buffer);

deviceId rappresenta l’indirizzo dell’eeprom nel formato a 7bit. Il bit di lettura/scrittura viene aggiunto dalle funzioni, quindi tenete conto di questa cosa!

ee_write scrive il byte data nella locazione (nella “cella di memoria”) address. ee_read restituisce il byte letto dalla locazione address. ee_seq_read implementa la modalità di lettura sequenziale: vengono letti numReads bytes  a partire dall’indirizzo startAddress e quindi memorizzati nell’array buffer.

Non ho previsto una funzione per la scrittura page write dal momento che ogni eeprom implementa questa funzionalità in maniera diversa: alcune eeprom richiedono la scrittura di minimo 64bytes, altre di 128 ecc.

La libreria è corredata da un documento in PDF che, oltre ad illustrarne l’utilizzo, fornisce una breve panoramica sulle eeprom I2C e da indicazioni relativamente ai 2 moduli I2C presenti sul PIC24FJ64GB002.

Ricordo infatti che il PIC24FJ64GB002 montato di default su ORbit16™, possiede due moduli I2C. Di default il modulo 1 è posizionato sui pin RB8/RB9 che tra l’altro sono 5V-tolerant, il che può tornarci molto utile per l’interfacciamento a vecchi dispositivi che non possono funzionare a 3.3V. Il modulo I2C non può essere riposizionato mediante la funzione PPS, ma può eventualmente utilizzare i pin alternativi (RA0/RA1) modificando la word di configurazione n°2. I pin alternativi, però, non sono 5V-tolerant. Se nemmeno RA0/RA1 ci vanno bene, possiamo utilizzare il modulo I2C numero 2, posizionato sui pin RB2/RB3. Nemmeno questi 2 pin sono 5V-tolerant e in aggiunta il modulo 2 non ha un posizionamento alternativo. Se usiamo il modulo 2 bisognerà cambiare i nomi delle funzioni I2C di base, nel documento è spiegato come fare.

Oltre alla libreria e al manuale di utilizzo ho messo un programma di esempio che mostra l’utilizzo delle funzioni disponibili nella libreria. Il modulo I2C numero 1 viene inizializzato per lavorare a 400KHz (nel programma di esempio sono illustrati nelle note i settaggi alternativi per 100KHz e per 1MHz), i collegamenti dell’eeprom sono i seguenti:

Le due resistenze di pull-up sulle linee SCL e SDA sono da 4.7KΩ (per una frequenza diversa da 400KHz questi valori non vanno più bene). L’indirizzo a 7 bit dell’eeprm così collegata, con i pin A0,A1 e A2 a massa, è quindi 0x50 (per maggiori informazioni su come funzionano le eeprom I2C vi rimando a questo vecchio articolo).

Le eeprom con LC nella sigla possono lavorare a 3.3V, per cui ho scelto di alimentarla a tale tensione. Controllate il datasheet dell’eeprom che avete in vostro possesso per capire a quale tensione può essere alimentata. Se deve essere necessariamente alimentata a 5V problemi non ce ne sono perchè BP8 e BP9 sono 5V-tolerant: dovete preoccuparvi soltanto se utilizzate il posizionamento alternativo del modulo I2C 1 o se usate il modulo I2C numero 2.

Ricordo che sulle eeprom da 1024Kbits (24xx1024, 24xx1025, 24xx1026) il pin n°1 (A0) deve essere necessariamente collegato a VCC e soltanto A1 e A2 vengono utilizzati per la selezione dell’indirizzo. Su tali eeprom il bit occupato da A0, che ora si chiama B0, serve per selezionare il primo o il secondo banco da 512Kbits. Queste eeprom possono difatti essere considerate come 2 eeprom da 512Kbits in parallelo sullo stesso bus.

Il programma di esempio utilizza anche il display tipo Nokia 3310 per mostrare il risultato delle operazioni sull’eeprom.

Links

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)