utilizzando le librerie standard MQTT sara possibile utilizzare il BUS I2C ormai universale per tutti i processori e microcontrollori ?
l'HUB I2C permette di alimentare correttamente tutti i moduli connessi senza prelevare l 'alimentazione dal processore.
e assicurare che la coppia SDA e CLK siano sempre correttamente connessi
assicura anche il pull-up da 4.7 K verso i 5Vcc.
Con I2C, i dati vengono trasferiti nei messaggi. I messaggi sono suddivisi in frame di dati. Ciascun messaggio ha un frame di indirizzo che contiene l'indirizzo binario dello slave e uno o più frame di dati che contengono i dati trasmessi. Il messaggio include anche condizioni di avvio e arresto, bit di lettura/scrittura e bit ACK/NACK tra ciascun frame di dati:
Condizione iniziale: la linea SDA passa da un livello di alta tensione a un livello di bassa tensione prima che la linea SCL passi da un livello alto a basso.
Condizione di arresto: la linea SDA passa da un livello di bassa tensione a un livello di alta tensione dopo che la linea SCL è passata da un livello basso ad alto.
Frame di indirizzo: una sequenza di 7 o 10 bit univoca per ogni slave che identifica lo slave quando il master vuole parlargli.
Bit di lettura/scrittura: un singolo bit che specifica se il master sta inviando dati allo slave (livello di bassa tensione) o richiedendo dati da esso (livello di alta tensione).
Bit ACK/NACK: ogni frame in un messaggio è seguito da un bit di riconoscimento/non riconoscimento. Se un frame di indirizzo o un frame di dati è stato ricevuto correttamente, un bit ACK viene restituito al mittente dal dispositivo ricevente.
I2C non ha linee di selezione slave come SPI, quindi ha bisogno di un altro modo per far sapere allo slave che i dati gli vengono inviati e non un altro slave. Lo fa indirizzando . Il frame di indirizzo è sempre il primo frame dopo il bit di inizio in un nuovo messaggio.
Il master invia l'indirizzo dello slave con cui vuole comunicare ad ogni slave ad esso connesso. Ogni slave confronta quindi l'indirizzo inviato dal master con il proprio indirizzo. Se l'indirizzo corrisponde, invia un bit ACK a bassa tensione al master. Se l'indirizzo non corrisponde, lo slave non fa nulla e la linea SDA rimane alta.
Il frame di indirizzo include un singolo bit alla fine che informa lo slave se il master vuole scrivergli dati o riceverne dati. Se il master vuole inviare dati allo slave, il bit di lettura/scrittura è un livello di bassa tensione. Se il master richiede dati dallo slave, il bit è un livello di alta tensione.
Dopo che il master ha rilevato il bit ACK dallo slave, il primo frame di dati è pronto per essere inviato.
Il frame di dati è sempre lungo 8 bit e viene inviato per primo con il bit più significativo. Ogni frame di dati è immediatamente seguito da un bit ACK/NACK per verificare che il frame sia stato ricevuto correttamente. Il bit ACK deve essere ricevuto dal master o dallo slave (a seconda di chi sta inviando i dati) prima di poter inviare il frame di dati successivo.
Dopo che tutti i frame di dati sono stati inviati, il master può inviare una condizione di arresto allo slave per interrompere la trasmissione. La condizione di arresto è una transizione di tensione da bassa ad alta sulla linea SDA dopo una transizione da bassa ad alta sulla linea SCL, con la linea SCL che rimane alta.
1. Il master invia la condizione di avviamento a ogni slave collegato commutando la linea SDA da un livello di alta tensione a un livello di bassa tensione prima di commutare la linea SCL da alto a basso:
1. Il master invia la condizione di avviamento a ogni slave collegato commutando la linea SDA da un livello di alta tensione a un livello di bassa tensione prima di commutare la linea SCL da alto a basso:
2. Il master invia a ogni slave l'indirizzo a 7 o 10 bit dello slave con cui vuole comunicare, insieme al bit di lettura/scrittura:
3. Ogni slave confronta l'indirizzo inviato dal master con il proprio indirizzo. Se l'indirizzo corrisponde, lo slave restituisce un bit ACK tirando la linea SDA in basso per un bit. Se l'indirizzo del master non corrisponde all'indirizzo proprio dello slave, lo slave lascia la linea SDA alta.
4. Il master invia o riceve il frame di dati:
5. Dopo che ogni frame di dati è stato trasferito, il dispositivo ricevente restituisce un altro bit ACK al mittente per confermare la corretta ricezione del frame:
6. Per interrompere la trasmissione dei dati, il master invia una condizione di arresto allo slave commutando SCL alto prima di commutare SDA alto:
Poiché I2C utilizza l'indirizzamento, è possibile controllare più slave da un unico master. Con un indirizzo a 7 bit sono disponibili 128 (2 7 ) indirizzi univoci. L'uso di indirizzi a 10 bit è raro, ma fornisce 1.024 (2 10 ) indirizzi univoci. Per collegare più slave a un unico master, cablarli in questo modo, con resistori pull-up da 4,7K Ohm che collegano le linee SDA e SCL a Vcc:
È possibile collegare più master a uno o più slave. Il problema con più master nello stesso sistema si verifica quando due master tentano di inviare o ricevere dati contemporaneamente sulla linea SDA. Per risolvere questo problema, ogni master deve rilevare se la linea SDA è bassa o alta prima di trasmettere un messaggio. Se la linea SDA è bassa, significa che un altro master ha il controllo del bus e il master deve attendere per inviare il messaggio. Se la linea SDA è alta, è possibile trasmettere il messaggio. Per collegare più master a più slave, utilizzare il diagramma seguente, con resistori di pull-up da 4,7 K Ohm che collegano le linee SDA e SCL a Vcc:
C'è molto in I2C che potrebbe sembrare complicato rispetto ad altri protocolli, ma ci sono alcuni buoni motivi per cui potresti o meno voler usare I2C per connetterti a un particolare dispositivo:
Utilizza solo due fili
Supporta più master e più slave
Il bit ACK/NACK conferma che ogni frame è stato trasferito correttamente
L'hardware è meno complicato rispetto agli UART
Protocollo ben noto e ampiamente utilizzato
Velocità di trasferimento dati inferiore rispetto a SPI
La dimensione del frame di dati è limitata a 8 bit
È necessario implementare hardware più complicato rispetto a SPI