- Cos'è il protocollo di comunicazione I2C?
- Come funziona la comunicazione I2C?
- Dove utilizzare la comunicazione I2C?
- I2C su Nuvoton N76E003 - Requisiti hardware
- Interfacciamento di AT24LC64 con Nuvoton N76E003 - Schema del circuito
- Perni I2C su Nuvoton N76E003
- Comunicazione I2C in N76E003
- Programmazione di N76E003 per comunicazione I2C
- Lampeggiante il codice e l'uscita
Nel vasto sistema di applicazioni embedded, nessun microcontrollore può eseguire tutte le attività da solo. 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 IIC per ora poiché è ciò che impareremo in questo tutorial. Se sei nuovo qui, dai un'occhiata ai tutorial Nuvoton in cui abbiamo discusso di ogni periferica del microcontrollore N76E003 dal tutorial introduttivo di base. Se vuoi imparare a usare I2C con altri microcontrollori, puoi controllare i link sottostanti.
- Come utilizzare I2C in Arduino: comunicazione tra due schede Arduino
- Comunicazione I2C con microcontrollore PIC PIC16F877
- Interfacciamento LCD 16X2 con ESP32 utilizzando I2C
- Comunicazione I2C con MSP430 Launchpad
- Interfacciamento LCD con NodeMCU senza utilizzare I2C
- Come gestire le comunicazioni multiple (I2C SPI UART) in un unico programma di Arduino
I2C è un importante protocollo di comunicazione sviluppato da Philips (ora NXP). Utilizzando questo protocollo I2C, una MCU può essere collegata a più dispositivi e avviare la comunicazione. I2C funziona con solo due fili, ovvero SDA e SCL. Dove SDA sta per Serial data e SCL sta per Serial Clock. Tuttavia, questi due pin richiedono resistori di pull-up al livello di tensione VCC e con un resistore di pull-up adeguato, il bus potrebbe supportare 127 dispositivi con un indirizzo univoco.
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 di clock 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 su 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 sarà in grado di 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 il balsamo con quel particolare indirizzo risponderà con le informazioni mentre gli altri tacciono. In questo modo, possiamo utilizzare lo stesso bus per comunicare con più dispositivi.
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 il sensore 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 su Nuvoton N76E003 - Requisiti hardware
Poiché il requisito di questo progetto è apprendere la comunicazione I2C utilizzando N76E003, utilizzeremo una EEPROM che sarà collegata alla linea dati I2C. Memorizzeremo alcuni dati nella EEPROM, li leggeremo e li visualizzeremo utilizzando lo schermo UART.
Poiché il valore memorizzato verrà stampato nell'UART, è richiesto qualsiasi tipo di convertitore da USB a UART. Puoi anche controllare il tutorial su UART con Nuvoton se sei nuovo nella comunicazione UART su N76E003. Per la nostra applicazione, utilizzeremo il convertitore da UART a USB CP2102. Oltre a quanto sopra, richiediamo anche i seguenti componenti:
- EEPROM 24C02
- 2 resistori 4.7k
Per non parlare, oltre ai componenti di cui sopra, abbiamo bisogno di una scheda di sviluppo basata su microcontrollore N76E003 e del programmatore Nu-Link. Inoltre, per il collegamento di tutti i componenti sono necessari anche breadboard e cavi di collegamento.
Interfacciamento di AT24LC64 con Nuvoton N76E003 - Schema del circuito
Come possiamo vedere nello schema seguente, la EEPROM è collegata nella linea I2C insieme a due resistori di pull up. All'estrema sinistra viene mostrato il collegamento dell'interfaccia di programmazione.
Ho usato una breadboard per l'IC AT24LC64 e ho collegato l'IC alla mia scheda programmatore nuvoton usando cavi jumper. Di seguito è mostrata la mia configurazione hardware insieme al programmatore nu-ink.
Perni I2C su Nuvoton N76E003
Il diagramma dei pin di N76E003 può essere visto nell'immagine sottostante-
Come possiamo vedere, ogni pin ha specifiche diverse e ogni pin può essere utilizzato per più scopi. Tuttavia, il pin 1.4 viene utilizzato come pin I2C SDA, perderà il PWM e altre funzionalità. Ma questo non è un problema in quanto per questo progetto non è richiesta un'altra funzionalità. La stessa cosa accadrà per il P1.3 è il pin SCL di I2C.
Poiché i pin I2C agiscono come GPIO, è necessario configurarlo. Tutti i pin GPIO possono essere configurati nella modalità descritta di seguito.
Come da datasheet, PxM1.n e PxM2. n sono due registri utilizzati per determinare l'operazione di controllo della porta I / O. Nella scheda tecnica si afferma che per utilizzare la funzionalità I2C, le modalità I / O devono essere utilizzate come Open-drain per le comunicazioni relative a I2C.
Comunicazione I2C in N76E003
La periferica I2C è una cosa importante per qualsiasi unità microcontrollore che supporta le funzionalità I2C. Molti tipi di microcontrollori diversi sono dotati di una periferica I2C incorporata. Tuttavia, in alcuni casi, I2C può essere configurato manualmente utilizzando il controllo software dove il supporto hardware relativo a I2C non è disponibile (ad esempio, molti microcontrollori 8051). Tuttavia, il nuvoton N76E003 viene fornito con il supporto periferico I2C.
M76E003 supporta quattro tipi di operazioni nelle modalità I2C: trasmettitore master, ricevitore master, trasmettitore slave e ricevitore slave. Supporta anche velocità standard (100 kbps) e veloci (fino a 400 kbps) per la linea I2C. I2C funziona con poche regole generiche nelle linee di segnale SCL e SDA.
Condizione di avvio e arresto:
È una cosa importante nella comunicazione I2C. Quando i dati vengono trasferiti alla linea I2C, iniziano con una condizione di inizio e terminano con una condizione di arresto.
La condizione di inizio è la transizione da alto a basso sullo SDA quando la linea SCL è alta e la condizione di arresto è la transizione da basso ad alto sullo SDA quando la linea SCL è alta. Queste due condizioni sono generate dal master (l'MCU o qualsiasi cosa che controlli gli altri dispositivi slave). La linea bus rimane occupata in questo stato quando viene avviata la condizione di avviamento e resta libera quando viene avviata la condizione di arresto.
La condizione di avvio e arresto è mostrata in modo eccellente nella prospettiva del segnale nella scheda tecnica N76E003-
Indirizzo a 7 bit con formato dati:
N76E003 supporta un indirizzo a 7 bit e un formato dati. Dopo che la condizione di avvio è stata avviata, il dispositivo master deve inviare i dati alla linea I2C. Il primo dato è importante. Se questi dati non vengono creati o trasmessi correttamente, il dispositivo collegato non verrà identificato e non sarà possibile effettuare ulteriori comunicazioni.
I dati sono costituiti da un indirizzo slave lungo 7 bit, indicato come SLA. Questo indirizzo lungo 7 bit deve essere univoco per ogni dispositivo se più dispositivi sono collegati sul bus. Dopo l'indirizzo a 7 bit, l'8 ° bit è il bit di direzione dei dati. Ciò significa che, a seconda dell'8 ° bit, il master invia le informazioni al dispositivo slave riguardo se i dati verranno scritti nel dispositivo slave o se i dati verranno letti dal dispositivo slave. L'ottavo bit è il bit R / W denominato notificatore di lettura o scrittura. Come tutti sappiamo, le informazioni a 8 bit possono essere di 128 tipi, supportando quindi 128 dispositivi, ma I2C supporta 127 tipi di dispositivi sullo stesso bus ma non 128. Poiché l'indirizzo 0x00 è un indirizzo riservato che viene chiamato indirizzo di chiamata generale. Se il master desidera inviare informazioni a tutti i dispositivi,indirizzerà 0x00 e ogni dispositivo verrà riprodotto nello stesso modo delle singole configurazioni software.
Pertanto, la trasmissione dei dati appare come di seguito-
Riconoscere:
Nell'immagine dell'indirizzo dati sopra, il 9 ° bit seguito dal bit R / W è chiamato bit di riconoscimento. È importante perché utilizzando questo bit, il master o lo slave risponde al trasmettitore di dati portando la linea SDA verso il basso. Per ottenere il bit di riconoscimento, il trasmettitore deve rilasciare la linea SDA.
Programmazione di N76E003 per comunicazione I2C
Il programma completo utilizzato in questo tutorial si trova in fondo a questa pagina. La spiegazione di segmenti importanti nel codice è la seguente:
Imposta i pin come Open Drain e configurali per I2C:
Cominciamo prima con la sezione dei pin I2C. Come descritto in precedenza, le porte I2C SCL e SDA devono essere configurate e impostate come configurazione open-drain. Per fare questo, stiamo usando un file di intestazione I2C.h insieme a un file sorgente I2C.c . Lo snippet di codice ha questo aspetto:
do {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} while (0)
Il codice precedente imposta P13 e P14 come pin Open-Drain e clr_I2CPX viene utilizzato per selezionare P13 e P14 come pin SCL su P1.3 e pin SDA su P1.4.
Questo I2CPX è il bit 0 del registro di controllo I2C I2CON. Se questo I2C_PX è impostato come 1, i pin vengono modificati in P0.2 come SCL e P1.6 come SDA. Tuttavia, useremo P13 e P14. I pin alternativi non vengono utilizzati qui.
Registro di controllo I2C I2CON:
Il registro di controllo I2C I2CON viene utilizzato per controllare le operazioni I2C. Il primo bit è il bit di selezione dei pin I2C. Impostandolo 0 si configura il pin I2C come P13 e P14.
Il bit AA è il flag di conferma affermazione, se il flag AA è impostato, verrà restituito un ACK durante l'impulso di clock di riconoscimento della linea SCL. Se viene azzerato, verrà restituito un NACK (livello alto su SDA) durante l'impulso di clock riconosciuto della linea SCL.
Il bit successivo è SI che è l'interrupt di stato I2C. Se l'interrupt di stato I2C è abilitato, l'utente deve controllare il registro I2STAT per determinare quale passaggio è stato superato e deve eseguire l'azione.
STO è il flag STOP impostato nel modo master. STO viene automaticamente cancellato dall'hardware una volta rilevata la condizione di STOP .
Il bit successivo è il bit STA. Se questo flag è impostato, I2C genera una condizione di START se il bus è libero. Se il bus è occupato, l'I2C attende una condizione di STOP e successivamente genera una condizione di START. Se STA è impostato mentre I2C è già in modalità master e uno o più byte sono stati trasmessi o ricevuti, l'I2C genera una condizione di START ripetuta. La STA deve essere cancellata manualmente dal software.
L'ultimo, I2CEN è il bit di abilitazione o disabilitazione del bus I2C.
EEPROM 24C02:
Ora, arrivando al 24C02. Il pacchetto di supporto della scheda di N76E003 ha un codice I2C per 24LC64 e può essere modificato facilmente. Tuttavia, utilizzeremo un metodo semplice per comprendere la funzione I2C.
Se qualcuno desidera utilizzare un'interfaccia dettagliata con EEPROM 24C02, è possibile utilizzare il programma EEPROM nel BSP.
Collegheremo solo il 24C02 in I2C dove l'N76E003 sarà master e la EEPROM sarà uno slave. Pertanto, scriveremo tutti i dati nell'indirizzo EEPROM e leggeremo lo stesso.
Il pinout della EEPROM 24C02 è mostrato di seguito
A0, A1 e A2 sono tre pin di selezione dell'indirizzo. I pin WP sono pin di protezione da scrittura e devono essere collegati con VSS per consentire la scrittura nella EEPROM.
La funzionalità Byte Write è mostrata nell'immagine sottostante-
L'intero ciclo di scrittura avviene con un bit di inizio. Dopodiché, è necessario inviare il byte di controllo. Nel byte di controllo, sono richieste le seguenti cose:
Dopo il bit di avvio, sono costituiti dall'indirizzo dello slave. 1010 è l'indirizzo statico e A0, A1 e A2 sono l'indirizzo basato sulla connessione hardware. Se i tre pin sono collegati con alimentazione GND o VSS, verrà letto come 0. Altrimenti, se collegati con VCC, verrà letto come 1. Nel nostro caso, tutti A0, A1 e A2 sono collegati con VSS. Quindi tutti questi saranno 0.
Spesa per la condizione di lettura o scrittura. Il valore dell'indirizzo con il bit di lettura o scrittura sarà - 0xA0 per la scrittura e 0xA1 per la lettura. Il prossimo è il bit di riconoscimento e successivamente verrà trasmesso un indirizzo a 8 bit in cui i dati devono essere memorizzati e, infine, i dati che verranno memorizzati nella rispettiva posizione. Queste cose vengono eseguite in un formato passo dopo passo nella funzione principale.
Funzione principale e While Loop:
void main (void) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Importante, utilizzare la funzione prinft deve impostare TI = 1; I2C_init (); while (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n Il valore letto è% x", c & 0xff); }; }
La funzione principale è semplice, consiste nel scrivere continuamente valori nella EEPROM nell'indirizzo 1 e leggere i dati. I dati vengono quindi stampati utilizzando la funzione printf. Il printf sta stampando il valore in esadecimale.
La funzione di scrittura EEPROM consiste delle seguenti cose che sono state descritte nella sezione EEPROM:
void EEPROM_write (indirizzo char non firmato, valore char non firmato) {I2C_start (); I2C_write (0xA0); I2C_write (indirizzo); I2C_write (valore); I2C_stop (); }
La funzione di avvio I2C è composta dalle seguenti cose:
void I2C_start (void) {signed int time = timeout; set_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
In questa funzione, lo stato SI viene verificato insieme al periodo di timeout predefinito (definito in I2C.h dove il tempo predefinito è impostato su 1000). La funzione di avvio inizia con l'impostazione di STA e la cancellazione di SI.
void I2C_stop (void) {signed int time = timeout; clr_SI; set_STO; while ((STO == 1) && (time> 0)) {time--; }; }
Come la funzione Start, viene utilizzata l'arresto. La funzione di arresto viene avviata impostando la STO seguita dalla cancellazione dell'SI. La funzione sotto è la funzione di lettura I2C-
unsigned char I2C_read (unsigned char ack_mode) {signed int time = timeout; valore di caratteri senza segno = 0x00; set_AA; clr_SI; while ((SI == 0) && (t> 0)) {time--; }; valore = I2DAT; if (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; while ((SI == 0) && (t> 0)) {time--; }; } valore di ritorno; }
L'ack_mode e I2C_NACK , entrambi sono definiti nel file di intestazione I2C rispettivamente 0 e 1.
Allo stesso modo, viene creata la funzione di scrittura-
void I2C_write (valore char senza segno) {signed int time = timeout; I2DAT = valore; clr_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
Lampeggiante il codice e l'uscita
Il codice ha restituito 0 avvisi e 0 errori ed è stato lampeggiato utilizzando il metodo di lampeggiamento predefinito dal Keil. Se sei nuovo, dai un'occhiata al tutorial su come iniziare con nuvoton per capire come caricare il codice. Le informazioni per la compilazione del codice sono disponibili di seguito.
Compilare la destinazione 'I2C_EEPROM' compilando I2C_EEPROM.c… compilando I2C.c… collegamento… Dimensione programma: data = 59.2 xdata = 0 codice = 2409 creazione di file esadecimale da ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 errore / i, 0 avviso / i. Tempo di compilazione trascorso: 00:00:04 Riepilogo build in batch: 1 riuscito, 0 non riuscito, 0 ignorato - Tempo trascorso: 00:00:04
L'hardware viene impostato su una breadboard e funziona come previsto. Come puoi vedere nell'immagine sottostante, siamo stati in grado di scrivere un valore su EEPROM e di rileggerlo dalla memoria e visualizzarlo sul monitor seriale.
Guarda il video riportato di seguito per una dimostrazione completa di come funziona la scheda per questo codice. Spero ti sia piaciuto il tutorial e hai imparato qualcosa di utile se hai domande, lasciale nella sezione commenti qui sotto. Puoi anche utilizzare i nostri forum per pubblicare altre domande tecniche.