- Cos'è il protocollo di comunicazione I2C?
- Come funziona la comunicazione I2C?
- Dove utilizzare la comunicazione I2C?
- I2C in MSP430: controllo del potenziometro digitale AD5171
MSP430 è una potente piattaforma fornita da Texas Instruments per progetti embedded, la sua natura versatile ha permesso di trovare modi in molte applicazioni e la fase è ancora in corso. Se hai seguito i nostri tutorial MSP430, avresti notato che abbiamo già coperto un'ampia gamma di tutorial su questo microcontrollore partendo dalle basi. Da ora, abbiamo coperto le basi, possiamo entrare in cose più interessanti come il portale di comunicazione.
Nel vasto sistema di applicazioni embedded, nessun microcontrollore può eseguire da solo tutte le attività. Ad un certo punto del tempo deve comunicare con altri dispositivi per condividere informazioni, ci sono molti diversi tipi di protocolli di comunicazione per condividere queste informazioni, ma i più utilizzati sono USART, IIC, SPI e CAN. Ogni protocollo di comunicazione ha i suoi vantaggi e svantaggi. Concentriamoci sulla parte I2C per ora poiché è ciò che impareremo in questo tutorial.
Cos'è il protocollo di comunicazione I2C?
Il termine IIC sta per " Inter Integrated Circuits ". Normalmente è indicato come I2C o I al quadrato C o anche come protocollo di interfaccia a 2 fili (TWI) in alcuni punti, ma significa tutto lo stesso. I2C è un protocollo di comunicazione sincrono che significa che entrambi i dispositivi che condividono le informazioni devono condividere un segnale di clock comune. Ha solo due fili per condividere le informazioni di cui uno viene utilizzato per il segnale del rubinetto e l'altro viene utilizzato per inviare e ricevere dati.
Come funziona la comunicazione I2C?
La comunicazione I2C è stata introdotta per la prima volta da Phillips. Come detto in precedenza, ha due fili, questi due fili saranno collegati tra due dispositivi. Qui un dispositivo è chiamato master e l'altro dispositivo è chiamato slave. La comunicazione dovrebbe e avverrà sempre tra due un Master e uno Slave. Il vantaggio della comunicazione I2C è che più di uno slave può essere collegato a un Master.
La comunicazione completa avviene attraverso questi due fili, ovvero Serial Clock (SCL) e Serial Data (SDA).
Serial Clock (SCL): condivide il segnale di clock generato dal master con lo slave
Dati seriali (SDA): invia i dati da e verso il master e lo slave.
In qualsiasi momento solo il master potrà avviare la comunicazione. Poiché nel bus è presente più di uno slave, il master deve fare riferimento a ciascuno slave utilizzando un indirizzo diverso. Quando viene indirizzato solo lo slave con quel particolare indirizzo risponderà con le informazioni mentre gli altri continuano a smettere. In questo modo possiamo utilizzare lo stesso bus per comunicare con più dispositivi.
I livelli di tensione di I2C non sono predefiniti. La comunicazione I2C è flessibile, significa che il dispositivo che è alimentato da 5v volt, può usare 5v per I2C ei dispositivi 3.3v possono usare 3v per la comunicazione I2C. Ma cosa succede se due dispositivi che funzionano con tensioni diverse, devono comunicare utilizzando I2C? Un bus I2C 5V non può essere collegato con 3.3V dispositivo. In questo caso vengono utilizzati i variatori di tensione per abbinare i livelli di tensione tra due bus I2C.
Esistono alcune serie di condizioni che inquadrano una transazione. L'inizializzazione della trasmissione inizia con un fronte di discesa di SDA, che è definita come condizione di 'AVVIO' nel diagramma sottostante in cui il master lascia SCL alto mentre imposta SDA basso.
Come mostrato nel diagramma qui sotto, Il fronte di discesa di SDA è il trigger hardware per la condizione START. Dopodiché tutti i dispositivi sullo stesso bus entrano in modalità di ascolto.
Allo stesso modo, il fronte di salita di SDA arresta la trasmissione che è indicata come condizione di "STOP" nel diagramma sopra, dove il master lascia SCL alto e rilascia anche SDA per andare ALTO. Quindi il fronte di salita di SDA interrompe la trasmissione.
Il bit R / W indica la direzione di trasmissione dei byte successivi, se è HIGH significa che lo slave trasmetterà e se è basso significa che il master trasmetterà.
Ogni bit viene trasmesso ad ogni ciclo di clock, quindi sono necessari 8 cicli di clock per trasmettere un byte. Dopo ogni byte inviato o ricevuto, il nono ciclo di clock viene mantenuto per ACK / NACK (riconosciuto / non riconosciuto). Questo bit ACK viene generato dallo slave o dal master a seconda della situazione. Per il bit ACK, SDA è impostato su basso dal master o dallo slave al 9 ° ciclo di clock. Quindi è basso considerato come ACK altrimenti NACK.
Dove utilizzare la comunicazione I2C?
La comunicazione I2C viene utilizzata solo per comunicazioni a breve distanza. È certamente affidabile in una certa misura poiché ha un impulso di clock sincronizzato per renderlo intelligente. Questo protocollo viene utilizzato principalmente per comunicare con sensori o altri dispositivi che devono inviare informazioni a un master. È molto utile quando un microcontrollore deve comunicare con molti altri moduli slave utilizzando un minimo di soli fili. Se stai cercando una comunicazione a lungo raggio dovresti provare RS232 e se stai cercando una comunicazione più affidabile dovresti provare il protocollo SPI.
I2C in MSP430: controllo del potenziometro digitale AD5171
Energia IDE è uno dei software più semplici per programmare il nostro MSP430. È lo stesso dell'IDE di Arduino. Puoi saperne di più su Come iniziare con MSP430 utilizzando Energia IDE qui.
Quindi, per utilizzare I2C in Energia IDE dobbiamo semplicemente includere il file di intestazione wire.h. La dichiarazione dei pin (SDA e SCL) è all'interno della libreria wire, quindi non è necessario dichiararla nella funzione di configurazione .
Esempi di esempi possono essere trovati nel menu Example dell'IDE. Uno degli esempi è spiegato di seguito:
Questo esempio mostra come controllare un potenziometro digitale AD5171 di Analog Devices che comunica tramite il protocollo seriale sincrono I2C. Utilizzando la libreria I2C Wire di MSP, il potenziometro digitale passerà attraverso 64 livelli di resistenza, attenuando un LED.
Per prima cosa, includeremo la libreria responsabile della comunicazione i2c, ovvero la libreria wire
#includere
Nella funzione setup , avvieremo la libreria wire dalla funzione .begin () .
void setup () { Wire.begin (); }
Quindi inizializza una variabile val per memorizzare i valori del potenziometro
byte val = 0;
Nella funzione loop , inizieremo la trasmissione al dispositivo slave i2c (in questo caso potenziometro digitale IC) specificando l'indirizzo del dispositivo che è dato nella scheda tecnica dell'IC.
void loop () { Wire.beginTransmission (44); // trasmette al dispositivo # 44 (0x2c)
Successivamente, mettere in coda i byte, cioè i dati che si desidera inviare all'IC per la trasmissione con la funzione write () .
Wire.write (byte (0x00)); // invia il byte di istruzione Wire.write (val); // invia il byte del valore del potenziometro
Quindi trasmettili chiamando endTransmission () .
Wire.endTransmission (); // interrompe la trasmissione di val ++; // incrementa il valore if (val == 64) {// se raggiunta la 64a posizione (max) val = 0; // ricomincia dal valore più basso } delay (500); }