- Què és el protocol de comunicació I2C?
- Com funciona la comunicació I2C?
- On utilitzar la comunicació I2C?
- I2C a Nuvoton N76E003: requisit de maquinari
- Interfície AT24LC64 amb Nuvoton N76E003 - Diagrama de circuits
- Pins I2C a Nuvoton N76E003
- Comunicació I2C a N76E003
- Programació N76E003 per a la comunicació I2C
- Intermitent del codi i de la sortida
En el vast sistema d'aplicacions incrustades, cap microcontrolador pot realitzar totes les activitats per si mateix. En algun moment del temps, ha de comunicar-se amb altres dispositius per compartir informació, hi ha molts tipus diferents de protocols de comunicació per compartir aquesta informació, però els més utilitzats són USART, IIC, SPI i CAN. Cada protocol de comunicació té el seu propi avantatge i desavantatge. Centrem-nos en la part IIC per ara, ja que això és el que aprendrem en aquest tutorial. Si sou nou aquí, consulteu els tutorials de Nuvoton, on hem parlat de tots els perifèrics del microcontrolador N76E003 des del tutorial bàsic per començar. Si voleu aprendre a utilitzar I2C amb altres microcontroladors, podeu consultar els enllaços següents.
- Com utilitzar I2C a Arduino: comunicació entre dues plaques Arduino
- Comunicació I2C amb microcontrolador PIC PIC16F877
- Interfície LCD 16X2 amb ESP32 mitjançant I2C
- Comunicació I2C amb MSP430 Launchpad
- Interfície LCD amb NodeMCU sense utilitzar I2C
- Com gestionar comunicacions múltiples (I2C SPI UART) en un sol programa d'Arduino
I2C és un important protocol de comunicació desenvolupat per Philips (ara NXP). Mitjançant aquest protocol I2C, es pot connectar una MCU amb diversos dispositius i iniciar la comunicació. I2C només funciona amb dos cables, és a dir, SDA i SCL. On SDA significa Serial data i SCL significa Serial Clock. No obstant això, aquests dos pins requereixen resistències de tracció fins al nivell de voltatge VCC i amb una resistència de tracció adequada, el bus podria suportar 127 dispositius amb una adreça única.
Què és el protocol de comunicació I2C?
El terme IIC significa " Circuits integrats inter ". Normalment es denomina I2C o I al quadrat C o fins i tot com a protocol d'interfície de dos fils (TWI) en alguns llocs, però tot significa el mateix. I2C és un protocol de comunicació síncrona que significa que tots dos dispositius que comparteixen la informació han de compartir un senyal de rellotge comú. Només té dos cables per compartir informació dels quals un s'utilitza per al senyal del rellotge i l'altre s'utilitza per enviar i rebre dades.
Com funciona la comunicació I2C?
Phillips va introduir per primera vegada la comunicació I2C. Com s’ha dit anteriorment, té dos cables, aquests dos cables es connectaran a través de dos dispositius. Aquí un dispositiu s’anomena mestre i l’altre es diu esclau. La comunicació s’ha de produir i es produirà sempre entre dos, un mestre i un esclau. L’avantatge de la comunicació I2C és que es pot connectar més d’un esclau a un mestre.

La comunicació completa es realitza a través d'aquests dos cables, a saber, el rellotge en sèrie (SCL) i les dades en sèrie (SDA).
Rellotge en sèrie (SCL): comparteix el senyal de rellotge generat pel mestre amb l’esclau
Dades de sèrie (SDA): envia les dades entre i des del mestre fins a l'esclau.
En un moment donat, només el mestre podrà iniciar la comunicació. Com que hi ha més d’un esclau al bus, el mestre ha de referir-se a cada esclau amb una adreça diferent. Quan s’adreça només el salve amb aquesta adreça en particular respondrà amb la informació mentre els altres callen. D’aquesta manera, podem utilitzar el mateix bus per comunicar-nos amb diversos dispositius.
On utilitzar la comunicació I2C?
La comunicació I2C només s’utilitza per a comunicacions a curta distància. Sens dubte, és fiable fins a un cert punt, ja que té un pols de rellotge sincronitzat per fer-lo intel·ligent. Aquest protocol s'utilitza principalment per comunicar-se amb el sensor o altres dispositius que han d'enviar informació a un mestre. És molt útil quan un microcontrolador ha de comunicar-se amb molts altres mòduls esclaus mitjançant un mínim de només cables. Si busqueu comunicació de llarg abast, proveu RS232 i, si busqueu una comunicació més fiable, proveu el protocol SPI.
I2C a Nuvoton N76E003: requisit de maquinari
Com que el requisit d’aquest projecte és aprendre la comunicació I2C mitjançant N76E003, utilitzarem una EEPROM que estarà connectada amb la línia de dades I2C. Emmagatzemarem algunes dades a l’EEPROM i també les llegirem i les mostrarem mitjançant la pantalla UART.
Com que el valor emmagatzemat s’imprimirà a l’UART, cal qualsevol tipus de convertidor USB a UART. També podeu consultar el tutorial sobre UART amb Nuvoton si no coneixeu la comunicació UART a N76E003. Per a la nostra aplicació, utilitzarem el convertidor CP2102 UART a USB. A part de l’anterior, també necessitem els components següents:
- EEPROM 24C02
- 2pcs resistències de 4,7 k
Per no parlar, a part dels components anteriors, necessitem una placa de desenvolupament basada en microcontroladors N76E003, així com el programador Nu-Link. A més, també es requereixen cables de connexió i taulers per connectar tots els components.
Interfície AT24LC64 amb Nuvoton N76E003 - Diagrama de circuits
Com podem veure a l'esquema següent, l'EEPROM està connectada a la línia I2C juntament amb dues resistències pull up. A l'extrem esquerre, es mostra la connexió de la interfície de programació.

Vaig utilitzar una placa de control per a l'IC AT24LC64 i vaig connectar l'IC a la meva placa de programador nuvoton mitjançant cables de pont. A continuació es mostra la configuració del maquinari juntament amb el programador nu-ink.

Pins I2C a Nuvoton N76E003
El diagrama de pins de N76E003 es pot veure a la imatge següent:

Com podem veure, cada pin té especificacions diferents i es pot utilitzar per a múltiples propòsits. Tot i això, el pin 1.4 s’utilitza com a pin SDA I2C, perdrà el PWM i altres funcionalitats. Però això no és un problema, ja que no cal una altra funcionalitat per a aquest projecte. El mateix passarà per al P1.3: el pin SCL d'I2C.
Atès que els pins I2C actuen com un GPIO, cal configurar-lo. Tots els pins GPIO es poden configurar en el mode descrit a continuació.

Segons el full de dades, PxM1.n i PxM2. n són dos registres que s'utilitzen per determinar l'operació de control del port d'E / S. Al full de dades, s’afirma que per utilitzar la funcionalitat I2C, cal utilitzar els modes d’E / S com a Open-drain per a comunicacions relacionades amb I2C.
Comunicació I2C a N76E003
El perifèric I2C és una cosa important per a qualsevol unitat de microcontrolador que admeti funcions I2C. Molts tipus de microcontroladors diferents inclouen un perifèric I2C integrat. Tanmateix, en alguns casos, I2C es pot configurar manualment mitjançant el control de programari on no hi ha suport de maquinari relacionat amb I2C (per exemple, molts microcontroladors 8051). No obstant això, el nuvoton N76E003 ve amb suport perifèric I2C.
M76E003 admet quatre tipus d'operacions en modes I2C: transmissor principal, receptor principal, transmissor esclau i receptor esclau. També admet velocitats estàndard (100 kbps) i ràpides (fins a 400 kbps) per a la línia I2C. I2C funciona amb poques regles genèriques a les línies de senyal SCL i SDA.
Condició d'inici i aturada:
És una cosa important en la comunicació I2C. Quan les dades es transfereixen a la línia I2C, comença amb la condició d'inici i acaba amb una condició d'aturada.
La condició inicial és la transició d’alta a baixa a l’SDA quan la línia SCL és alta i la condició d’aturada és la transició de baixa a alta a l’SDA quan la línia SCL és alta. Aquestes dues condicions són generades pel mestre (la MCU o qualsevol cosa que estigui controlant els altres dispositius esclaus). La línia de bus continua ocupada en aquest estat quan s’inicia la condició d’inici i torna a estar lliure quan s’inicia la condició d’aturada.
La condició d’inici i aturada es mostra excel·lentment a la perspectiva del senyal a la fitxa tècnica N76E003-

Adreça de 7 bits amb format de dades:
N76E003 admet un format de dades i adreça de 7 bits. Després d'iniciar la condició inicial, el dispositiu mestre ha d'enviar les dades a la línia I2C. Les primeres dades són importants. Si aquestes dades no es creen ni es transmeten adequadament, el dispositiu connectat no s’identificarà i no es podran fer més comunicacions.
Les dades consisteixen en una adreça esclava de 7 bits de llarg, denominada SLA. Aquesta adreça de 7 bits de longitud ha de ser única per a cada dispositiu si hi ha diversos dispositius connectats al bus. Després de l'adreça de 7 bits, el vuitè bit és el bit de direcció de dades. Això vol dir que, en funció del vuitè bit, el mestre envia la informació al dispositiu esclau sobre si s’escriuran dades al dispositiu esclau o si es llegiran les dades des del dispositiu esclau. El vuitè bit és el bit R / W conegut com a notificador de lectura o escriptura. Com tots sabem, la informació de 8 bits pot ser de 128 tipus, donant suport a 128 dispositius, però I2C admet 127 tipus de dispositius al mateix bus però no 128. Com que l'adreça 0x00 és una adreça reservada que s'anomena adreça de trucada general. Si el mestre vol enviar informació a tots els dispositius,tractarà 0x00 i cada dispositiu es reproduirà de la mateixa manera que segons les configuracions de programari individuals.
Per tant, la transmissió de dades es veu a continuació:

Reconeix:
A la imatge de l’adreça de dades anterior, el novè bit seguit del bit R / W s’anomena bit de confirmació. És important, ja que mitjançant aquest bit, el mestre o l’esclau respon al transmissor de dades tirant de la línia SDA cap avall. Per obtenir el bit de confirmació, el transmissor ha de deixar anar la línia SDA.
Programació N76E003 per a la comunicació I2C
El programa complet utilitzat en aquest tutorial es troba a la part inferior d’aquesta pàgina. L’explicació dels segments importants del codi és la següent:
Definiu els pins com a drenatge obert i configureu-los per a I2C:
Primer comencem per la secció de pins I2C. Com es va descriure abans, els ports I2C SCL i SDA han de configurar-se i configurar-se com a configuració de drenatge obert. Per a això, estem utilitzant un arxiu de capçalera I2C.h juntament amb un arxiu d'origen I2C.c . El fragment de codi té aquest aspecte:
fer {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} mentre que (0)
El codi anterior estableix P13 i P14 com a pin Open-Drain i clr_I2CPX s’utilitza per seleccionar els P13 i P14 com a pin SCL a P1.3 i pin SDA a P1.4.
Aquest I2CPX és el 0è bit del registre I2CON de control I2C. Si aquest I2C_PX s'estableix com a 1, els pins es canvien a P0.2 com a SCL i P1.6 com a SDA. Tot i això, utilitzarem P13 i P14. Aquí no s’utilitzen pins alternatius.
Registre de control I2C I2CON:
Registre de control I2C I2CON s'utilitza per controlar les operacions I2C. El primer bit és el bit de selecció de pins I2C. Si es posa 0, es configura el pin I2C com a P13 i P14.

El bit AA és el senyal de confirmació de confirmació, si es marca el senyal AA, es retornarà un ACK durant el pols de rellotge de confirmació de la línia SCL. Si s’esborra, es retornarà un NACK (nivell alt a SDA) durant el pols de rellotge reconegut de la línia SCL.
El següent bit és SI, que és la interrupció d'estat I2C. Si l’interrupció d’estat I2C està habilitada, l’usuari hauria de comprovar el registre I2STAT per determinar quin pas s’ha passat i hauria de dur a terme l’acció.
El STO és el senyal STOP que s'estableix en mode mestre. L'STO s'esborra automàticament per maquinari un cop s'ha detectat la condició STOP .
El següent bit és el bit STA. Si aquesta marca està establerta, llavors I2C genera una condició START si el bus és lliure. Si el bus està ocupat, l'I2C espera una condició STOP i genera una condició START. Si STA està configurat mentre l’I2C ja està en mode mestre i s’han transmès o rebut un o més bytes, l’I2C genera una condició d’INICI repetida. El programari ha d’eliminar manualment l’STA.
L'últim, I2CEN, és el bit d'activació o desactivació del bus I2C.
EEPROM 24C02:
Ara, arribant al 24C02. El paquet de suport de la placa N76E003 té un codi I2C per al 24LC64 i es pot modificar fàcilment. Tot i això, utilitzarem un mètode senzill per entendre la funció I2C.
Si algú vol utilitzar una interfície detallada amb EEPROM 24C02, es pot utilitzar el programa EEPROM del BSP.
Només connectarem el 24C02 a I2C on el N76E003 serà mestre i l'EEPROM serà un esclau. Per tant, escriurem qualsevol dada a l'adreça EEPROM i llegirem la mateixa.
A continuació es mostra el pinout 24C02 EEPROM-

A0, A1 i A2 són tres pins de selecció d’adreces. Els pins WP són pins de protecció contra escriptura i han d'estar connectats amb VSS per permetre l'escriptura a l'EEPROM.
La funcionalitat d’escriptura de bytes es mostra a la imatge següent:

El cicle complet d’escriptura passa amb un bit inicial. Després, cal enviar el byte de control. Al byte de control, es requereixen les següents coses:

Després del bit d'inici, consisteix en l'adreça esclava. 1010 és estàtic i A0, A1 i A2 són l'adreça basada en la connexió de maquinari. Si els tres pins estan connectats amb el subministrament GND o VSS, es llegirà com 0. En cas contrari, si es connecta amb VCC, es llegirà com 1. En el nostre cas, tots els A0, A1 i A2 estan connectats amb VSS. Així, tots aquests seran 0.
Despeses en la condició de lectura o escriptura. El valor de l'adreça amb el bit de lectura o escriptura serà: 0xA0 per a l'escriptura i 0xA1 per a la lectura. A continuació, es mostra el bit Reconeixement i, després, es transmetrà una adreça de 8 bits on cal emmagatzemar les dades i, finalment, les dades que s’emmagatzemaran a la ubicació respectiva. Aquestes coses es fan en un format pas a pas a la funció principal.
Funció principal i bucle While:
void main (buit) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Important, utilitzeu la funció prinft que ha d’establir TI = 1; I2C_init (); mentre que (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n El valor llegit és% x", c & 0xff); }; }
La funció principal és senzilla, és escriure contínuament valors a la EEPROM a l’adreça 1 i llegir les dades. Les dades s’imprimeixen mitjançant la funció printf. Printf imprimeix el valor en hexadecimal.
La funció d’escriptura EEPROM consisteix en les següents coses que es van descriure a la secció EEPROM:
void EEPROM_write (adreça de caràcter sense signar, valor de caràcter sense signar) {I2C_start (); I2C_write (0xA0); I2C_write (adreça); I2C_write (valor); I2C_stop (); }
La funció d’inici I2C consta de les següents coses:
void I2C_start (void) {firmat int time = timeout; set_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
En aquesta funció, s'està comprovant l'estat del SI juntament amb el període de temps d'espera predefinit (definit a I2C.h on el temps predefinit s'estableix com a 1000). La funció d'inici comença amb l'establiment de l'STA i l'esborrat del SI.
void I2C_stop (void) {signat int time = timeout; clr_SI; set_STO; while ((STO == 1) && (time> 0)) {time--; }; }
S’utilitza el mateix que la funció Inici, atura. La funció d' aturada s'inicia configurant l'STO seguida d'esborrar el SI. A sota de la funció hi ha la funció de lectura I2C-
unsigned char I2C_read (unsigned char ack_mode) {signat int time = timeout; valor de caràcter sense signar = 0x00; set_AA; clr_SI; while ((SI == 0) && (t> 0)) {time--; }; valor = I2DAT; if (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; while ((SI == 0) && (t> 0)) {time--; }; } valor de retorn; }
El ack_mode i I2C_NACK , tots dos es defineixen a l'arxiu de capçalera I2C com 0 i 1 respectivament.
De la mateixa manera, es crea la funció d’escriptura-
void I2C_write (valor de caràcter sense signar) {signat int time = timeout; I2DAT = valor; clr_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
Intermitent del codi i de la sortida
El codi va retornar 0 advertència i 0 errors i el Keil el va emetre mitjançant el mètode de parpelleig predeterminat. Si sou nou, consulteu el tutorial per començar amb nuvoton per entendre com penjar codi. La informació de compilació del codi es pot trobar a continuació.
Compileu l'objectiu 'I2C_EEPROM' compilant I2C_EEPROM.c… compilant I2C.c… enllaçant… Mida del programa: dades = 59,2 xdata = 0 codi = 2409 creant fitxer hexadecimal des de ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 error (s), 0 advertència (s). Temps de compilació transcorregut: 00:00:04 Resum de compilació per lots: 1 correctament, 0 fallits, 0 omesos - Temps transcorregut: 00:00:04
El maquinari s'està configurant en una taula de treball i funciona com s'esperava. Com podeu veure a la imatge següent, vam poder escriure un valor a EEPROM i tornar-lo a llegir de la memòria i mostrar-lo al monitor sèrie.

Mireu el vídeo que es mostra a continuació per obtenir una demostració completa del funcionament del tauler per a aquest codi. Espero que hagueu gaudit del tutorial i hàgiu après alguna cosa útil si teniu alguna pregunta, deixeu-los a la secció de comentaris a continuació. També podeu utilitzar els nostres fòrums per publicar altres preguntes tècniques.
