- Hvad er I2C kommunikationsprotokol?
- Hvordan fungerer I2C-kommunikation?
- Hvor skal jeg bruge I2C-kommunikation?
- I2C på Nuvoton N76E003 - Hardwarekrav
- Grænseflade AT24LC64 med Nuvoton N76E003 - kredsløbsdiagram
- I2C Pins på Nuvoton N76E003
- I2C-kommunikation i N76E003
- Programmering N76E003 til I2C-kommunikation
- Blinker koden og output
I det store system af integrerede applikationer kan ingen mikrokontroller udføre alle aktiviteterne alene. På et tidspunkt er det nødvendigt at kommunikere til andre enheder for at dele information, der er mange forskellige typer kommunikationsprotokoller til at dele disse informationer, men de mest anvendte er USART, IIC, SPI og CAN. Hver kommunikationsprotokol har sin egen fordel og ulempe. Lad os fokusere på IIC-delen for nu, da det er det, vi skal lære i denne vejledning. Hvis du er ny her, skal du tjekke Nuvoton Tutorials, hvor vi har diskuteret alle eksterne enheder af N76E003 Microcontroller fra den grundlæggende startvejledning. Hvis du vil lære at bruge I2C med andre mikrokontrollere, kan du tjekke nedenstående links.
- Sådan bruges I2C i Arduino: Kommunikation mellem to Arduino Boards
- I2C Kommunikation med PIC Microcontroller PIC16F877
- Interfacing 16X2 LCD med ESP32 ved hjælp af I2C
- I2C kommunikation med MSP430 Launchpad
- Interfacing LCD med NodeMCU uden brug af I2C
- Sådan håndteres multikommunikation (I2C SPI UART) i et enkelt program af Arduino
I2C er en vigtig kommunikationsprotokol, der er udviklet af Philips (nu NXP). Ved hjælp af denne I2C-protokol kan en MCU forbindes med flere enheder og starte kommunikation. I2C fungerer kun med to ledninger, nemlig SDA og SCL. Hvor SDA står for serielle data, og SCL står for serielt ur. Disse to ben kræver imidlertid pull-up-modstande til VCC-spændingsniveauet, og med en passende pull-up-modstand kan bussen understøtte 127 enheder med en unik adresse.
Hvad er I2C kommunikationsprotokol?
Udtrykket IIC står for " Inter Integrated Circuits ". Det betegnes normalt som I2C eller I kvadrat C eller endda som 2-leder interface-protokol (TWI) nogle steder, men det hele betyder det samme. I2C er en synkron kommunikationsprotokol, der betyder, at begge enheder, der deler informationen, skal dele et fælles ursignal. Den har kun to ledninger til at dele information, hvoraf den ene bruges til kloksignalet, og den anden bruges til at sende og modtage data.
Hvordan fungerer I2C-kommunikation?
I2C-kommunikation blev først introduceret af Phillips. Som tidligere nævnt har den to ledninger, disse to ledninger forbindes på tværs af to enheder. Her kaldes den ene enhed en master, og den anden enhed kaldes en slave. Kommunikation skal og vil altid forekomme mellem to, en mester og en slave. Fordelen ved I2C-kommunikation er, at mere end en slave kan forbindes til en Master.
Den komplette kommunikation finder sted gennem disse to ledninger, nemlig Serial Clock (SCL) og Serial Data (SDA).
Serielt ur (SCL): Deler det ursignal, der genereres af masteren, med slaven
Serial Data (SDA): Sender dataene til og fra mellem Master og slave.
På ethvert givet tidspunkt er det kun mesteren, der er i stand til at starte kommunikationen. Da der er mere end en slave i bussen, skal mesteren henvise til hver slave ved hjælp af en anden adresse. Når der er tale om kun salven med den bestemte adresse, svarer tilbage med informationen, mens de andre bliver stille. På denne måde kan vi bruge den samme bus til at kommunikere med flere enheder.
Hvor skal jeg bruge I2C-kommunikation?
I2C-kommunikation bruges kun til kortdistancekommunikation. Det er bestemt pålideligt i et omfang, da det har en synkroniseret urpuls for at gøre det smart. Denne protokol bruges hovedsageligt til at kommunikere med sensoren eller andre enheder, der skal sende information til en master. Det er meget praktisk, når en mikrocontroller skal kommunikere med mange andre slave-moduler ved hjælp af et minimum af kun ledninger. Hvis du leder efter langtrækkende kommunikation, skal du prøve RS232, og hvis du leder efter mere pålidelig kommunikation, skal du prøve SPI-protokollen.
I2C på Nuvoton N76E003 - Hardwarekrav
Da kravet i dette projekt er at lære I2C-kommunikation ved hjælp af N76E003, vil vi bruge en EEPROM, der vil være forbundet med I2C- datalinjen. Vi gemmer nogle data i EEPROM og læser også de samme og viser dem ved hjælp af UART-skærmen.
Da den gemte værdi udskrives i UART, kræves enhver form for USB til UART-konverter. Du kan også tjekke vejledningen om UART med Nuvoton, hvis du ikke har brugt UART-kommunikation på N76E003. Til vores applikation bruger vi CP2102 UART til USB-konverter. Bortset fra ovenstående kræver vi også følgende komponenter-
- EEPROM 24C02
- 2stk 4.7k modstande
For ikke at nævne, bortset fra ovennævnte komponenter, har vi brug for et N76E003 mikrokontrollerbaseret udviklingskort såvel som Nu-Link Programmer. Derudover kræves der også brødbræt og tilslutningsledninger for at forbinde alle komponenter.
Grænseflade AT24LC64 med Nuvoton N76E003 - kredsløbsdiagram
Som vi kan se i skemaet nedenfor, er EEPROM forbundet i I2C-linjen sammen med to pull-up-modstande. Yderst til venstre vises forbindelsen til programmeringsgrænsefladen.
Jeg brugte et brødbræt til AT24LC64 IC og tilsluttede IC til mit nuvoton programmørkort ved hjælp af jumper ledninger. Min hardwareopsætning sammen med nu-ink-programmøren er vist nedenfor.
I2C Pins på Nuvoton N76E003
Stiftdiagrammet til N76E003 kan ses i nedenstående billede-
Som vi kan se, har hver pin forskellige specifikationer, og hver pin kan bruges til flere formål. Imidlertid er pin 1.4 bruges som en I2C SDA pin, vil den miste PWM og andre funktioner. Men det er ikke et problem, da der ikke kræves en anden funktionalitet til dette projekt. Den samme ting vil ske for P1.3 er SCL-stiften på I2C.
Da I2C-ben fungerer som en GPIO, skal den konfigureres. Alle GPIO-ben kan konfigureres i den nedenfor beskrevne tilstand.
I henhold til databladet PxM1.n og PxM2. n er to registre, der bruges til at bestemme I / O-portens kontrolfunktion. I databladet er det angivet, at for at bruge I2C-funktionaliteten skal I / O-tilstande bruges som Open-drain til I2C-relateret kommunikation.
I2C-kommunikation i N76E003
I2C-periferien er en vigtig ting for enhver mikrokontrollerenhed, der understøtter I2C-funktioner. Mange typer forskellige mikrocontrollere leveres med en indbygget periferi I2C. I nogle tilfælde kan I2C imidlertid konfigureres manuelt ved hjælp af softwarekontrol, hvor I2C-relateret hardwaresupport ikke er tilgængelig (for eksempel mange 8051 mikrokontroller). Nuvoton N76E003 leveres dog med I2C perifer support.
M76E003 understøtter fire typer operationer i I2C-tilstande - Master Transmitter, Master Receiver, Slave Transmitter og Slave Receiver. Det understøtter også standardhastigheder (100 kbps) og hurtige (op til 400 kbps) hastigheder til I2C-linjen. I2C fungerer med få generiske regler i SCL- og SDA-signallinjerne.
Start- og stoptilstand:
Det er en vigtig ting i I2C-kommunikation. Når data overføres til I2C-linjen, starter det med starttilstand og slutter med en stoptilstand.
Startbetingelsen er den høje-til-lave overgang på SDA, når SCL-linjen er høj, og stoptilstanden er den lave til høje overgang på SDA, når SCL-linjen er høj. Disse to betingelser genereres af masteren (MCU'en eller andet, der styrer de andre slaveenheder). Buslinjen forbliver optaget i denne tilstand, når starttilstanden initieres, og forbliver fri igen, når stoptilstanden startes.
Start- og stoptilstanden vises fremragende i signalperspektivet i N76E003 datablad-
7-bit adresse med dataformat:
N76E003 understøtter en 7-bit adresse og dataformat. Efter starttilstanden er startet, skal masterenheden sende dataene til I2C-linjen. De første data er vigtige. Hvis disse data ikke oprettes eller transmitteres korrekt, identificeres den tilsluttede enhed ikke, og yderligere kommunikation kan ikke foretages.
Dataene består af en 7-bit lang slave-adresse, betegnet som SLA. Denne 7-bit lange adresse skal være unik for hver enhed, hvis der er tilsluttet flere enheder på bussen. Efter 7-bit-adressen er den 8. bit dateretningsbit. Det betyder, afhængigt af 8. bit, sender masteren informationen til slaveindretningen om, hvorvidt data vil blive skrevet i slaveenheden, eller dataene læses fra slaveenheden. Den 8. bit er R / W-biten, der betegnes som læse- eller skrivemeddelelse. Som vi alle ved kan 8-bit information være 128 typer, hvilket understøtter 128 enheder, men I2C understøtter 127 typer enheder på samme bus, men ikke 128. Fordi 0x00-adressen er en reserveret adresse, der kaldes en generel opkaldsadresse. Hvis skibsføreren vil sende information til alle enheder,den vil adressere 0x00, og hver enhed afspilles på samme måde som pr. de enkelte softwarekonfigurationer.
Således ser dataoverførslen ud som nedenfor -
Anerkende:
I det ovennævnte datadresseadgangsbillede kaldes den 9. bit efterfulgt af R / W-bit bekræftelsesbiten. Det er vigtigt, fordi master eller slave ved hjælp af denne bit reagerer på datasenderen ved at trække SDA-linjen lavt. For at få kvitteringsbiten skal senderen frigøre SDA-linjen.
Programmering N76E003 til I2C-kommunikation
Det komplette program, der bruges i denne vejledning, kan findes nederst på denne side. Forklaringen på vigtige segmenter i koden er som følger-
Indstil pins som åben afløb, og konfigurer dem til I2C:
Lad os starte med I2C pin-sektionen først. Som beskrevet tidligere skal I2C SCL- og SDA-porte konfigureres og indstilles som open-drain-konfiguration. For at gøre dette bruger vi en I2C.h-headerfil sammen med en I2C.c-kildefil . Kodestykket ser sådan ud-
gør {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} mens (0)
Ovenstående kode indstiller P13 og P14 som Open-Drain-pin og clr_I2CPX bruges til at vælge P13 og P14 som SCL-pin på P1.3 og SDA-pin på P1.4.
Denne I2CPX er den 0. Bit af I2C-kontrolregisteret I2CON. Hvis denne I2C_PX er indstillet til 1, ændres benene til P0.2 som SCL og P1.6 som SDA. Vi bruger dog P13 og P14. Alternative ben bruges ikke her.
I2C kontrolregister I2CON:
I2C-kontrolregister I2CON bruges til at styre I2C-operationerne. Den første bit er I2C-pinudvælgelsesbit. Indstilling af 0 konfigurerer I2C-stiften som P13 og P14.
AA-bit er bekræftelsesflagget, hvis AA-flag er indstillet, returneres en ACK under bekræftelsesurimpulsen på SCL-linjen. Hvis det er ryddet, returneres et NACK (højt niveau på SDA) under den anerkendte urimpuls på SCL-linjen.
Den næste bit er SI, som er I2C-statusafbrydelsen. Hvis I2C-statusafbrydelse er aktiveret, skal brugeren kontrollere I2STAT-registret for at bestemme, hvilket trin der er bestået, og skal tage handlingen.
STO er STOP-flag, der indstilles i mastertilstand. STO ryddes automatisk af hardware, når STOP- tilstanden er fundet.
Den næste bit er STA-biten. Hvis dette flag er indstillet, genererer I2C en START-tilstand, hvis bussen er fri. Hvis bussen er optaget, venter I2C på en STOP-tilstand og genererer en START-tilstand, der følger. Hvis STA er indstillet, mens I2C allerede er i mastertilstand, og en eller flere bytes er blevet sendt eller modtaget, genererer I2C en gentagen START-tilstand. STA skal ryddes manuelt af softwaren.
Den sidste, I2CEN er I2C-bus-aktivering eller deaktivering af bit.
EEPROM 24C02:
Kommer nu til 24C02. Board-understøttelsespakken til N76E003 har en I2C-kode til 24LC64 og kan let ændres. Vi vil dog bruge en enkel metode til at forstå I2C-funktionen.
Hvis nogen ønsker at bruge detaljeret grænseflade med EEPROM 24C02, kan EEPROM-programmet i BSP bruges.
Vi forbinder kun 24C02 i I2C, hvor N76E003 vil være master, og EEPROM vil være en slave. Således skriver vi alle data i EEPROM-adressen og læser de samme.
24C02 EEPROM pinout er vist nedenfor-
A0, A1 og A2 er tre adressevalgstifter. WP-stifter er skrivebeskyttelsesstifter og skal forbindes med VSS for at muliggøre skrivning til EEPROM.
Funktionen Byte Write vises i nedenstående billede-
Den fulde skrivecyklus sker med en startbit. Derefter skal kontrolbyte indsendes. I kontrolbyte kræves følgende ting-
Efter startbit består af slave-adressen. 1010 er den statiske og A0, A1 og A2 er den hardwareforbindelsesbaserede adresse. Hvis de tre ben er forbundet med GND- eller VSS-forsyning, læses den som 0. Hvis ikke, hvis den er forbundet med VCC, læses den som 1. I vores tilfælde er alle A0, A1 og A2 forbundet med VSS. Således vil alle disse være 0.
Brug af læse- eller skrivetilstanden. Værdien af adressen med læse- eller skrivbit vil være - 0xA0 for skrivning og 0xA1 til læsning. Dernæst er kvitteringsbiten, og derefter sendes en 8-bit-adresse, hvor dataene skal lagres, og endelig de data, der vil blive gemt på den respektive placering. Disse ting udføres i et trin for trin-format i hovedfunktionen.
Hovedfunktion og While Loop:
ugyldigt hoved (ugyldigt) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Vigtigt, brug printerfunktion skal indstille TI = 1; I2C_init (); mens (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n Den læste værdi er% x", c & 0xff); }; }
Hovedfunktionen er enkel, den skriver kontinuerligt værdier til EEPROM i adressen 1 og læser dataene. Dataene udskrives derefter ved hjælp af printf-funktionen. Printf udskriver værdien i hex.
EEPROM-skrivefunktionen består af følgende ting, der blev beskrevet i afsnittet EEPROM-
ugyldig EEPROM_write (usigneret char adresse, usigneret char værdi) {I2C_start (); I2C_write (0xA0); I2C_write (adresse); I2C_write (værdi); I2C_stop (); }
I2C startfunktionen består af følgende ting-
ugyldigt I2C_start (ugyldigt) {signeret intid = timeout; sæt_STA; clr_SI; mens ((SI == 0) && (tid> 0)) {tid--; }; }
I denne funktion kontrolleres SI-status sammen med den foruddefinerede timeoutperiode (defineret i I2C.h, hvor den foruddefinerede tid er indstillet til 1000). Startfunktionen begynder med at indstille STA og rydde SI.
ugyldigt I2C_stop (ugyldigt) {signeret int time = timeout; clr_SI; sæt_STO; mens ((STO == 1) && (tid> 0)) {tid--; }; }
Samme som Start, stop-funktionen bruges. Den stop- funktion initieres ved opsætning af STO efterfulgt af rydde SI. Nedenfor funktionen er I2C læse funktion-
usigneret char I2C_read (usigneret char ack_mode) {signeret int time = timeout; usigneret char-værdi = 0x00; sæt_AA; clr_SI; mens ((SI == 0) && (t> 0)) {tid--; }; værdi = I2DAT; hvis (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; mens ((SI == 0) && (t> 0)) {tid--; }; } returværdi; }
Den ack_mode og I2C_NACK , begge er defineret i I2C headerfilen som 0 og 1 hhv.
Tilsvarende oprettes skrivefunktionen-
ugyldigt I2C_write (usigneret char værdi) {signeret int time = timeout; I2DAT = værdi; clr_STA; clr_SI; mens ((SI == 0) && (tid> 0)) {tid--; }; }
Blinker koden og output
Koden returnerede 0 advarsel og 0 fejl og blev blinket ved hjælp af standardblinkmetoden af Keil. Hvis du er ny, skal du tjekke at komme i gang med nuvoton tutorial for at forstå, hvordan du uploader kode. De kompilerende oplysninger om koden findes nedenfor.
Byg mål 'I2C_EEPROM' kompilering af I2C_EEPROM.c… kompilering af I2C.c… sammenkædning… Programstørrelse: data = 59.2 xdata = 0 kode = 2409 opretter hex-fil fra ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 Fejl, 0 Advarsel. Bygget tid forløbet: 00:00:04 Batch-build-oversigt: 1 lykkedes, 0 mislykkedes, 0 sprunget over - Tid forløbet: 00:00:04
Hardwaren sættes op på et brødbræt og fungerer som forventet. Som du kan se på billedet nedenfor, kunne vi skrive en værdi på EEPROM og læse den tilbage fra hukommelsen og vise den på den serielle skærm.
Tjek videoen nedenfor for en komplet demonstration af, hvordan tavlen fungerer for denne kode. Håber du har haft vejledningen og lært noget nyttigt, hvis du har spørgsmål, skal du lade dem være i kommentarfeltet nedenfor. Du kan også bruge vores fora til at stille andre tekniske spørgsmål.