- Ce este protocolul de comunicare I2C?
- Cum funcționează comunicarea I2C?
- Unde să utilizați comunicarea I2C?
- I2C pe Nuvoton N76E003 - Cerință hardware
- Interfațarea AT24LC64 cu Nuvoton N76E003 - Diagrama circuitului
- Pinii I2C pe Nuvoton N76E003
- Comunicare I2C în N76E003
- Programare N76E003 pentru comunicare I2C
- Intermitentul codului și al ieșirii
În vastul sistem de aplicații încorporate, niciun microcontroler nu poate efectua toate activitățile singur. La un moment dat, trebuie să comunice cu alte dispozitive pentru a partaja informații, există multe tipuri diferite de protocoale de comunicare pentru a partaja aceste informații, dar cele mai utilizate sunt USART, IIC, SPI și CAN. Fiecare protocol de comunicare are propriul avantaj și dezavantaj. Să ne concentrăm asupra părții IIC pentru moment, deoarece asta vom învăța în acest tutorial. Dacă sunteți nou aici, consultați Tutorialele Nuvoton, unde am discutat fiecare periferic al microcontrolerului N76E003 din tutorialul de bază pentru început. Dacă doriți să aflați cum să utilizați I2C cu alte microcontrolere, puteți consulta linkurile de mai jos.
- Cum se folosește I2C în Arduino: comunicare între două plăci Arduino
- Comunicare I2C cu microcontroler PIC PIC16F877
- Interfață LCD 16X2 cu ESP32 folosind I2C
- Comunicare I2C cu MSP430 Launchpad
- Interfață LCD cu NodeMCU fără utilizarea I2C
- Cum să gestionați comunicațiile multiple (I2C SPI UART) într-un singur program Arduino
I2C este un protocol important de comunicare dezvoltat de Philips (acum NXP). Folosind acest protocol I2C, un MCU poate fi conectat cu mai multe dispozitive și poate începe comunicarea. I2C funcționează doar cu două fire, și anume SDA și SCL. Unde SDA înseamnă Serial data și SCL reprezintă Serial Clock. Cu toate acestea, acești doi pini necesită rezistențe de tracțiune la nivelul tensiunii VCC și cu un rezistor de tracțiune adecvat, magistrala ar putea suporta 127 de dispozitive cu o adresă unică.
Ce este protocolul de comunicare I2C?
Termenul IIC înseamnă „ Circuite integrate integrate ”. În mod normal este notat ca I2C sau I pătrat C sau chiar ca protocol de interfață cu 2 fire (TWI) în unele locuri, dar totul înseamnă același lucru. I2C este un protocol de comunicație sincron, ceea ce înseamnă că ambele dispozitive care partajează informațiile trebuie să partajeze un semnal de ceas comun. Are doar două fire pentru a partaja informații din care unul este utilizat pentru semnalul de ceas, iar celălalt este utilizat pentru trimiterea și primirea de date.
Cum funcționează comunicarea I2C?
Comunicarea I2C a fost introdusă pentru prima dată de Phillips. Așa cum am spus mai devreme, are două fire, aceste două fire vor fi conectate pe două dispozitive. Aici un dispozitiv este numit master și celălalt dispozitiv este numit sclav. Comunicarea ar trebui și va avea loc întotdeauna între doi, un Maestru și un Sclav. Avantajul comunicației I2C este că mai mult de un sclav poate fi conectat la un Master.
Comunicarea completă are loc prin intermediul acestor două fire și anume Serial Clock (SCL) și Serial Data (SDA).
Serial Clock (SCL): Partajează semnalul de ceas generat de master cu sclavul
Serial Data (SDA): Trimite datele către și de la Master și slave.
În orice moment, numai comandantul va putea iniția comunicarea. Deoarece există mai mult de un sclav în autobuz, comandantul trebuie să se refere la fiecare sclav folosind o adresă diferită. Atunci când este adresat, numai salvarea cu adresa respectivă va răspunde înapoi cu informațiile, în timp ce ceilalți păstrează tăcerea. În acest fel, putem folosi același autobuz pentru a comunica cu mai multe dispozitive.
Unde să utilizați comunicarea I2C?
Comunicarea I2C este utilizată numai pentru comunicarea pe distanțe scurte. Cu siguranță, este sigur într-o anumită măsură, deoarece are un impuls de ceas sincronizat pentru a-l face inteligent. Acest protocol este utilizat în principal pentru a comunica cu senzorul sau alte dispozitive care trebuie să trimită informații unui master. Este foarte la îndemână atunci când un microcontroler trebuie să comunice cu multe alte module slave folosind un minim de numai fire. Dacă sunteți în căutarea unei comunicări pe distanțe lungi, ar trebui să încercați RS232 și, dacă doriți o comunicare mai fiabilă, ar trebui să încercați protocolul SPI
I2C pe Nuvoton N76E003 - Cerință hardware
Deoarece cerința acestui proiect este de a învăța comunicarea I2C folosind N76E003, vom folosi o EEPROM care va fi conectată cu linia de date I2C. Vom stoca unele date în EEPROM și le vom citi și le vom afișa folosind ecranul UART.
Deoarece valoarea stocată va fi tipărită în UART, este necesar orice tip de convertor USB în UART. De asemenea, puteți consulta tutorialul despre UART cu Nuvoton dacă sunteți nou în comunicarea UART pe N76E003. Pentru aplicația noastră, vom folosi CP2102 convertor UART la USB. În afară de cele de mai sus, avem nevoie și de următoarele componente-
- EEPROM 24C02
- 2buc rezistențe 4.7k
Ca să nu mai vorbim, în afară de componentele de mai sus, avem nevoie de o placă de dezvoltare bazată pe microcontroler N76E003, precum și de programatorul Nu-Link. În plus, sunt necesare și fire de conectare și conectare pentru toate componentele.
Interfațarea AT24LC64 cu Nuvoton N76E003 - Diagrama circuitului
După cum putem vedea în schema de mai jos, EEPROM este conectată în linia I2C împreună cu două rezistențe pull up. În extrema stângă, este afișată conexiunea interfeței de programare.
Am folosit o placă pentru IC AT24LC64 și am conectat IC-ul la placa mea de programare nuvoton folosind fire jumper. Configurarea mea hardware împreună cu programatorul nu-ink este prezentată mai jos.
Pinii I2C pe Nuvoton N76E003
Diagrama pinilor N76E003 poate fi văzută în imaginea de mai jos
După cum putem vedea, fiecare pin are specificații diferite și fiecare pin poate fi utilizat în mai multe scopuri. Cu toate acestea, pinul 1.4 este utilizat ca pin I2C SDA, va pierde PWM și alte funcționalități. Dar aceasta nu este o problemă, deoarece nu este necesară o altă funcționalitate pentru acest proiect. Același lucru se va întâmpla pentru P1.3 este pinul SCL al I2C.
Deoarece pinii I2C acționează ca un GPIO, trebuie să fie configurat. Toți pinii GPIO pot fi configurați în modul descris mai jos.
Conform fișei tehnice, PxM1.n și PxM2. n sunt două registre care sunt utilizate pentru a determina funcționarea de control a portului I / O. În foaia tehnică, se afirmă că, pentru a utiliza funcționalitatea I2C, modurile I / O trebuie utilizate ca Open-drain pentru comunicațiile legate de I2C.
Comunicare I2C în N76E003
Perifericul I2C este un lucru important pentru orice unitate de microcontroler care acceptă caracteristici I2C. Multe tipuri de microcontrolere diferite vin cu un periferic I2C încorporat. Cu toate acestea, în unele cazuri, I2C poate fi configurat manual folosind controlul software acolo unde suportul hardware I2C nu este disponibil (De exemplu, multe microcontrolere 8051). Cu toate acestea, nuvoton N76E003 vine cu suport periferic I2C.
M76E003 acceptă patru tipuri de operații în modurile I2C - Master Transmitter, Master Receiver, Slave Transmitter și Slave Receiver. De asemenea, suportă viteze standard (100kbps) și rapide (până la 400kbps) pentru linia I2C. I2C funcționează cu câteva reguli generice în liniile de semnal SCL și SDA.
Stare de pornire și oprire:
Este un lucru important în comunicarea I2C. Când datele sunt transferate pe linia I2C, acestea încep cu condiția de început și se termină cu o condiție de oprire.
Condiția de pornire este tranziția de la mare la scăzut pe SDA atunci când linia SCL este ridicată și condiția de oprire este tranziția de la scăzut la înalt pe SDA când linia SCL este ridicată. Aceste două condiții sunt generate de master (MCU sau orice altceva care controlează celelalte dispozitive slave). Linia de autobuz rămâne ocupată în această stare când este inițiată starea de pornire și rămâne liberă din nou când este inițiată starea de oprire.
Condiția Start și Stop este excelent arătată în perspectiva semnalului în foaia tehnică N76E003-
Adresă pe 7 biți cu format de date:
N76E003 acceptă o adresă pe 7 biți și un format de date. După inițierea condiției de pornire, dispozitivul master trebuie să trimită datele către linia I2C. Primele date sunt importante. Dacă aceste date nu sunt create sau transmise în mod corespunzător, dispozitivul conectat nu va fi identificat și nu se pot face comunicări suplimentare.
Datele constau dintr-o adresă slave lungă de 7 biți, denumită SLA. Această adresă lungă de 7 biți trebuie să fie unică pentru fiecare dispozitiv dacă mai multe dispozitive sunt conectate pe magistrală. După adresa de 7 biți, bitul 8 este bitul de direcție a datelor. Asta înseamnă că, în funcție de cel de-al 8-lea bit, comandantul trimite informațiile către dispozitivul slave despre dacă datele vor fi scrise în dispozitivul slave sau datele vor fi citite de pe dispozitivul slave. Al 8-lea bit este bitul R / W denumit notificator Citire sau Scriere. După cum știm cu toții, informațiile pe 8 biți pot fi de 128 de tipuri, acceptând astfel 128 de dispozitive, dar I2C acceptă 127 de tipuri de dispozitive pe aceeași magistrală, dar nu 128. Deoarece adresa 0x00 este o adresă rezervată care se numește adresă de apel generală. Dacă comandantul dorește să trimită informații către toate dispozitivele,se va adresa 0x00 și fiecare dispozitiv va reda în același mod ca în configurațiile software individuale.
Astfel, transmiterea datelor arată ca mai jos-
Recunoașteți:
În imaginea adresei de date de mai sus, bitul 9 urmat de bitul R / W se numește bit de confirmare. Este unul important, deoarece folosind acest bit, maestrul sau sclavul răspunde la transmițătorul de date trăgând linia SDA jos. Pentru a obține bitul de confirmare, emițătorul trebuie să elibereze linia SDA.
Programare N76E003 pentru comunicare I2C
Programul complet utilizat în acest tutorial poate fi găsit în partea de jos a acestei pagini. Explicația segmentelor importante din cod este următoarea:
Setați Pinii ca Scurgere deschisă și configurați-i pentru I2C:
Să începem mai întâi cu secțiunea pin I2C. Așa cum s-a descris anterior, porturile I2C SCL și SDA trebuie configurate și setate ca configurație open-drain. Pentru a face acest lucru, folosim un fișier antet I2C.h împreună cu un fișier sursă I2C.c . Fragmentul de cod arată astfel -
faceți {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} în timp ce (0)
Codul de mai sus setează P13 și P14 ca pin Open-Drain și clr_I2CPX este utilizat pentru a selecta P13 și P14 ca pin SCL pe P1.3 și pin SDA pe P1.4.
Acest I2CPX este al 0- lea bit al registrului de control I2C I2CON. Dacă acest I2C_PX este setat ca 1, pinii sunt schimbați la P0.2 ca SCL și P1.6 ca SDA. Cu toate acestea, vom folosi P13 și P14. Aici nu se utilizează pini alternativi.
Registrul de control I2C I2CON:
Registrul de control I2C I2CON este utilizat pentru a controla operațiunile I2C. Primul bit este bitul de selectare pin I2C. Setarea acestuia 0 configurează pinul I2C ca P13 și P14.
Bitul AA este semnalizatorul de confirmare a confirmării, dacă semnalizarea AA este setată, un ACK va fi returnat în timpul impulsului de confirmare a ceasului liniei SCL. Dacă este șters, un NACK (nivel înalt pe SDA) va fi returnat în timpul impulsului de ceas recunoscut al liniei SCL.
Următorul bit este SI, care este întreruperea stării I2C. Dacă I2C Status Interrupt este activat, utilizatorul ar trebui să verifice registrul I2STAT pentru a determina ce pas a fost trecut și ar trebui să ia măsurile.
STO este steagul STOP care este setat în modul master. STO este șters automat de hardware odată ce starea STOP a fost detectată.
Următorul bit este bitul STA. Dacă acest flag este setat, atunci I2C generează o condiție START dacă autobuzul este liber. Dacă autobuzul este ocupat, I2C așteaptă o stare STOP și generează o condiție START după. Dacă STA este setat în timp ce I2C este deja în modul master și unul sau mai mulți octeți au fost transmiși sau primiți, I2C generează o condiție START repetată. STA trebuie să fie șters manual de software.
Ultimul, I2CEN este bitul de activare sau dezactivare a magistralei I2C.
EEPROM 24C02:
Acum, venind la 24C02. Pachetul de asistență pentru placa N76E003 are un cod I2C pentru 24LC64 și poate fi modificat cu ușurință. Cu toate acestea, vom folosi o metodă simplă pentru a înțelege funcția I2C.
Dacă cineva dorește să utilizeze interfața detaliată cu EEPROM 24C02, atunci programul EEPROM din BSP poate fi utilizat.
Vom conecta 24C02 numai în I2C unde N76E003 va fi master și EEPROM va fi un slave. Astfel, vom scrie orice date în adresa EEPROM și le vom citi la fel.
Pinul 24C02 EEPROM este prezentat mai jos-
A0, A1 și A2 sunt trei pini de selectare a adresei. Pinii WP sunt pini de protecție la scriere și trebuie conectați cu VSS pentru a permite scrierea în EEPROM.
Funcționalitatea de scriere a octeților este afișată în imaginea de mai jos
Ciclul complet de scriere se întâmplă cu un bit de pornire. După aceea, octetul de control trebuie să fie trimis. În octetul de control, sunt necesare următoarele lucruri-
După bitul de început, constă din adresa slave. 1010 este static și A0, A1 și A2 sunt adresa bazată pe conexiunea hardware. Dacă cei trei pini sunt conectați cu sursa GND sau VSS, acesta va fi citit ca 0. În caz contrar, dacă este conectat cu VCC, va fi citit ca 1. În cazul nostru, toate A0, A1 și A2 sunt conectate cu VSS. Astfel toate acestea vor fi 0.
Cheltuieli pentru condiția de citire sau scriere. Valoarea adresei cu bitul de citire sau scriere va fi - 0xA0 pentru scriere și 0xA1 pentru citire. Următorul este bitul de confirmare și, după aceea, va fi transmisă o adresă de 8 biți în cazul în care datele trebuie stocate și, în cele din urmă, datele care vor fi stocate în locația respectivă. Aceste lucruri sunt realizate într-un format pas cu pas în funcția principală.
Funcția principală și bucla While:
void main (void) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Important, folosiți funcția prinft trebuie să setați TI = 1; I2C_init (); while (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n Valoarea citită este% x", c & 0xff); }; }
Funcția principală este simplă, scrie în mod continuu valori în EEPROM în adresa 1 și citește datele. Datele sunt apoi tipărite utilizând funcția printf. Printf imprimă valoarea în hex.
Funcția de scriere EEPROM constă din următoarele lucruri care au fost descrise în secțiunea EEPROM-
void EEPROM_write (adresă de caracter nesemnată, valoare de caracter nesemnată) {I2C_start (); I2C_write (0xA0); I2C_write (adresa); I2C_write (valoare); I2C_stop (); }
Funcția de pornire I2C constă din următoarele lucruri:
void I2C_start (void) {semnat int time = timeout; set_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
În această funcție, starea SI este verificată împreună cu perioada de expirare predefinită (definită în I2C.h unde timpul predefinit este setat ca 1000). Funcția de pornire începe cu setarea STA și ștergerea SI.
void I2C_stop (void) {semnat int time = timeout; clr_SI; set_STO; while ((STO == 1) && (time> 0)) {time--; }; }
La fel ca și funcția Start, stop. Funcția de oprire este inițiată prin configurarea STO urmată de ștergerea SI. Funcția de mai jos este funcția de citire I2C-
unsigned char I2C_read (unsigned char ack_mode) {semnat int time = timeout; valoare de caracter nesemnat = 0x00; set_AA; clr_SI; while ((SI == 0) && (t> 0)) {time--; }; valoare = I2DAT; if (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; while ((SI == 0) && (t> 0)) {time--; }; } valoare returnată; }
Ack_mode și I2C_NACK , ambele sunt definite în fișierul antet I2C ca 0 și respectiv 1.
În mod similar, funcția de scriere este creată
void I2C_write (valoare de caracter nesemnat) {semnat int time = timeout; I2DAT = valoare; clr_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
Intermitentul codului și al ieșirii
Codul a returnat 0 avertisment și 0 erori și a fost intermitent folosind metoda intermitentă implicită de Keil. Dacă sunteți nou, verificați noțiunile de bază cu tutorialul nuvoton pentru a înțelege cum să încărcați codul. Informațiile de compilare ale codului pot fi găsite mai jos.
Construiți ținta „I2C_EEPROM” compilând I2C_EEPROM.c… compilând I2C.c… conectând… Dimensiune program: date = 59,2 xdata = 0 cod = 2409 creând fișier hexagonal din „. \ Output \ I2C_EEPROM„… ”. \ Output \ I2C_EEPROM "- 0 Eroare, 0 Avertisment (e). Timpul de construire scurs: 00:00:04 Rezumatul lotului de construcție: 1 reușit, 0 eșuat, 0 omis - Timpul scurs: 00:00:04
Hardware-ul este configurat pe un panou de lucru și funcționează conform așteptărilor. După cum puteți vedea în imaginea de mai jos, am reușit să scriem o valoare pe EEPROM și să o citim din memorie și să o afișăm pe monitorul serial.
Consultați videoclipul de mai jos pentru o demonstrație completă a modului în care funcționează placa pentru acest cod. Sper că ți-a plăcut tutorialul și ai învățat ceva util dacă ai întrebări, lasă-le în secțiunea de comentarii de mai jos. De asemenea, puteți utiliza forumurile noastre pentru a posta alte întrebări tehnice.