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