Il bus I2C, come hai detto tu, è un bus di comunicazione seriale.
A differenza di quanto hai scritto l'I2C è molto diverso dal bus seriale RS232, dato che è un bus sincrono e non asincrono come la RS232 (e tutte le derivazioni, come RS422, RS485, ecc.).
Cosa significano asincrono e sincrono?
Nel bus asincrono il clock viene generato localmente sia dal trasmettitore che dal ricevitore, che devono quindi avere lo stesso baud-rate, ovvero le stesse temporizzazioni per decidere quando leggere il bit.
Praticamente quando il trasmettitore inizia a trasmettere, sulla linea il livello del segnale cambia di stato e questa variazione viene considerata come bit di start che sincronizza la ricezione con la trasmissione.
Da quel momento ogni tot tempo (dove tot è dipendente dal baud-rate impostato) il ricevitore legge lo stato del bit inviato dal trasmettitore e lo inserisce nel buffer di ricezione.
Quindi nelle porte seriali asincrone il clock viene generato localmente non solo dal "master" (trasmettitore), ma anche dallo "slave" (ricevitore).
Nei bus sincroni (come l'I2C) clock e dato vengono generati entrambi dal master e lo slave li riceve, usando il clock per sapere in quale momento deve leggere (campionare) il dato.
A parte casi molto particolari (che non interessano il bus I2C) la velocità di trasmissione (equivalente al baud-rate delle linee asincrone) non è importante: un dispositivo slave può lavorare anche a velocità inferiori a quella nominale, dato che il dato viene letto solo in concomitanza del fronte del clock, senza che intervengano temporizzazioni particolari.
Il limite semmai é nella velocità massima del bus, oltre la quale si rischia che i dati scambiati non siano interpretati correttamente.
Nell'I2C è il fronte di salita del segnale di clock ad essere usato per campionare il bit di dato.
Il bus I2C ha quindi bisogno di 2 segnali riferiti a massa, il clock (chiamato SCL) e il dato (chiamato SDA). Ogni dispositivo, sia master o slave, può generare solo un livello logico 0, chiudendo a massa (0V che nei chip è chiamato anche GND o Vss) la corrispondente linea, con la differenza che il master può agire sia su SCL che su SDA, mentre lo slave agisce solo su SDA, dato che il clock è sempre gestito dal master.
Come dicevo ogni dispositivo fornisce solo il livello logico 0, mentre il livello logico 1 è assicurato da una resistenza di pull-up su ognuna delle 2 linee del bus.
La resistenza di pull-up deve avere un valore non troppo basso per non sovraccaricare le uscite di master e slave (in questo caso il livello logico 0 potrebbe non essere riconosciuto correttamente) e neppure troppo alto, perché altrimenti i segnali impiegano troppo tempo a salire dallo 0 all'1, arrotondando i fronti e rischiando errori di comunicazione.
Generalmente il valore è compreso fra 1K e 10K.
CITAZIONE
L'indirizzamento dei vari dispositivi slave può essere fatto a 7 o 10 bit, anche se non ho ben capito come si fa ad indirizzarli, cioè gli si da un indirizzo arbitrario univoco?
Ogni slave ha un suo indirizzo dipendente sia dalla configurazione interna (base address), ricavabile dal data-sheet, sia da quella esterna, modificabile generalmente col livello logico di uno o più piedini di selezione indirizzo.
Prendendo ad esempio l'EEPROM 24C01 si nota che nella versione a 8 pin esistono 3 ingressi di selezione indirizzo (A0-A2) che, abbinati al base address interno (A0hex), permettono di avere indirizzi che variano da A0hex a AEhex con salti di 2 (A0, A2, A4,....AE).
Il bit 0 del byte di indirizzamento é invece quello che decide la direzione dei dati (se 0 l'operazione é una scrittura, se 1 l'operazione è una lettura).
Lo slave address non ha nulla a che vedere con l'indirizzo interno del dispositivo slave, quello, tanto per intenderci, dove si vuole scrivere o che si vuole leggere. Lo slave address serve solo per "svegliare" uno dei dispositivi slave collegati al bus (tutti i dispositivi sono collegati in parallelo).
La velocità massima di comunicazione può essere di 100Kbit/s, 400Kbit/s oppure 3,4Mbit/s, fermo restando che questa é appunto la velocità massima a cui i dati possono essere scambiati correttamente, mentre, come ho già detto, la velocità può essere rallentata a piacimento, col vantaggio di aumentare l'immunità del sistema ai disturbi elettrici.
Per decidere la posizione di scrittura/lettura del dispositivo slave occorre inviare, dopo il bit di start e lo slave address, 1 o 2 byte di indirizzamento (il numero dipende dallo slave collegato che può avere la necessità di indirizzare più di 256 byte come nel caso di eeprom dalla 24C04 in su).
Sullo stesso bus I2C possono essere collegati slave con indirizzamento sia a 7 che a 10bit, dato che in caso di mancato riconoscimento dello slave address un dispositivo slave ignora il resto dei dati inviati dal master, perché li considera diretti ad un altro slave.
<segue>
Edited by robo67 - 5/1/2011, 22:49