- Hva er I2C kommunikasjonsprotokoll?
- Hvordan fungerer I2C-kommunikasjon?
- Hvor skal jeg bruke I2C-kommunikasjon?
- I2C på Nuvoton N76E003 - Maskinvarekrav
- Grensesnitt AT24LC64 med Nuvoton N76E003 - Kretsdiagram
- I2C Pins på Nuvoton N76E003
- I2C-kommunikasjon i N76E003
- Programmering N76E003 for I2C-kommunikasjon
- Blinker koden og utdataene
I det enorme systemet med innebygde applikasjoner kan ingen mikrokontroller utføre alle aktivitetene av seg selv. På et tidspunkt av tiden må den kommunisere til andre enheter for å dele informasjon, det er mange forskjellige typer kommunikasjonsprotokoller for å dele denne informasjonen, men de mest brukte er USART, IIC, SPI og CAN. Hver kommunikasjonsprotokoll har sin egen fordel og ulempe. La oss fokusere på IIC-delen for nå, siden det er det vi skal lære i denne opplæringen. Hvis du er ny her, kan du sjekke ut Nuvoton Tutorials der vi har diskutert alle eksterne enheter av N76E003 Microcontroller fra den helt grunnleggende veiledningen. Hvis du vil lære hvordan du bruker I2C med andre mikrokontrollere, kan du sjekke ut lenkene nedenfor.
- Hvordan bruke I2C i Arduino: Kommunikasjon mellom to Arduino-brett
- I2C Kommunikasjon med PIC Microcontroller PIC16F877
- Grensesnitt 16X2 LCD med ESP32 ved bruk av I2C
- I2C-kommunikasjon med MSP430 Launchpad
- Grensesnitt LCD med NodeMCU uten å bruke I2C
- Hvordan håndtere multikommunikasjon (I2C SPI UART) i et enkelt Arduino-program
I2C er en viktig kommunikasjonsprotokoll som er utviklet av Philips (nå NXP). Ved hjelp av denne I2C-protokollen kan en MCU kobles til flere enheter og starte kommunikasjon. I2C fungerer med bare to ledninger, nemlig SDA og SCL. Hvor SDA står for Serial data og SCL står for Serial Clock. Imidlertid krever disse to pinnene opptrekksmotstander til VCC-spenningsnivået, og med en tilstrekkelig opptrekksmotstand kan bussen støtte 127 enheter med en unik adresse.
Hva er I2C kommunikasjonsprotokoll?
Begrepet IIC står for " Inter Integrated Circuits ". Det er vanligvis betegnet som I2C eller jeg kvadratisk C eller til og med som 2-leder grensesnittprotokoll (TWI) noen steder, men alt betyr det samme. I2C er en synkron kommunikasjonsprotokoll som betyr at begge enhetene som deler informasjonen må dele et vanlig klokkesignal. Den har bare to ledninger for å dele informasjon som den ene brukes til kloksignalet og den andre brukes til å sende og motta data.
Hvordan fungerer I2C-kommunikasjon?
I2C-kommunikasjon ble først introdusert av Phillips. Som sagt tidligere, den har to ledninger, disse to ledningene vil være koblet på tvers av to enheter. Her kalles den ene enheten en master og den andre enheten kalles en slave. Kommunikasjon skal og vil alltid skje mellom to, en mester og en slave. Fordelen med I2C-kommunikasjon er at mer enn en slave kan kobles til en Master.
Den komplette kommunikasjonen skjer gjennom disse to ledningene, nemlig Serial Clock (SCL) og Serial Data (SDA).
Serial Clock (SCL): Deler kloksignalet som genereres av mesteren med slaven
Serial Data (SDA): Sender dataene til og fra mellom Master og slave.
Til enhver tid er det bare mesteren som kan starte kommunikasjonen. Siden det er mer enn en slave i bussen, må mesteren henvise til hver slave ved hjelp av en annen adresse. Når salven med den aktuelle adressen blir adressert, vil den svare tilbake med informasjonen mens de andre blir stille. På denne måten kan vi bruke den samme bussen til å kommunisere med flere enheter.
Hvor skal jeg bruke I2C-kommunikasjon?
I2C-kommunikasjon brukes bare for kortdistansekommunikasjon. Det er absolutt pålitelig til en viss grad siden det har en synkronisert klokkepuls for å gjøre det smart. Denne protokollen brukes hovedsakelig til å kommunisere med sensoren eller andre enheter som må sende informasjon til en master. Det er veldig praktisk når en mikrokontroller må kommunisere med mange andre slave-moduler ved å bruke minimum bare ledninger. Hvis du er ute etter kommunikasjon over lang rekkevidde, bør du prøve RS232, og hvis du er ute etter mer pålitelig kommunikasjon, bør du prøve SPI-protokollen.
I2C på Nuvoton N76E003 - Maskinvarekrav
Ettersom kravet til dette prosjektet er å lære I2C-kommunikasjon ved hjelp av N76E003, vil vi bruke en EEPROM som vil være koblet til I2C-datalinjen. Vi vil lagre noen data i EEPROM og også lese det samme og vise det ved hjelp av UART-skjermen.
Ettersom den lagrede verdien blir skrevet ut i UART, er det nødvendig med en hvilken som helst USB til UART-omformer. Du kan også sjekke ut veiledningen om UART med Nuvoton hvis du ikke har brukt UART-kommunikasjon på N76E003. For vår applikasjon vil vi bruke CP2102 UART til USB-omformer. Annet enn det ovennevnte, krever vi også følgende komponenter -
- EEPROM 24C02
- 2 stk 4,7 k motstander
For ikke å nevne, bortsett fra de ovennevnte komponentene, trenger vi et N76E003 mikrokontrollerbasert utviklingskort, samt Nu-Link Programmer. I tillegg er det også nødvendig med brødbrett- og tilkoblingsledninger for å koble til alle komponenter.
Grensesnitt AT24LC64 med Nuvoton N76E003 - Kretsdiagram
Som vi kan se i skjematikken nedenfor, er EEPROM koblet til I2C-linjen sammen med to trekkmotstander. Ytterst til venstre vises programmeringsgrensesnittforbindelsen.
Jeg brukte et brødbrett til AT24LC64 IC og koblet ICen til min nuvoton programmererbrett ved hjelp av jumper ledninger. Maskinvareoppsettet mitt sammen med nu-ink-programmereren er vist nedenfor.
I2C Pins på Nuvoton N76E003
Pin-diagrammet til N76E003 kan ses på bildet nedenfor -
Som vi kan se, har hver pin forskjellige spesifikasjoner, og hver pin kan brukes til flere formål. Imidlertid brukes pin 1.4 som en I2C SDA-pin, den mister PWM og annen funksjonalitet. Men det er ikke et problem da det ikke kreves en annen funksjonalitet for dette prosjektet. Det samme vil skje for P1.3 er SCL-pinnen til I2C.
Siden I2C-pinner fungerer som en GPIO, må den konfigureres. Alle GPIO-pinner kan konfigureres i den nedenfor beskrevne modusen.
I henhold til databladet, PxM1.n og PxM2. n er to registre som brukes til å bestemme kontrolloperasjonen til I / O-porten. I databladet er det oppgitt at for å bruke I2C-funksjonaliteten, må I / O-modusene brukes som Open-drain for I2C-relatert kommunikasjon.
I2C-kommunikasjon i N76E003
I2C-periferien er en viktig ting for enhver mikrokontroller som støtter I2C-funksjoner. Mange typer forskjellige mikrokontrollere kommer med en innebygd I2C-periferiutstyr. I noen tilfeller kan I2C imidlertid konfigureres manuelt ved hjelp av programvarekontroll der I2C-relatert maskinvarestøtte ikke er tilgjengelig (for eksempel mange 8051 mikrokontrollere). Imidlertid kommer nuvoton N76E003 med I2C perifer støtte.
M76E003 støtter fire typer operasjoner i I2C-modus - Master Transmitter, Master Receiver, Slave Transmitter og Slave Receiver. Den støtter også standardhastigheter (100 kbps) og raske (opptil 400 kbps) hastigheter for I2C-linjen. I2C fungerer med få generiske regler i SCL- og SDA-signallinjene.
Start og stopp tilstand:
Det er en viktig ting i I2C-kommunikasjon. Når data overføres til I2C-linjen, begynner det med starttilstand og slutter med stopptilstand.
Startbetingelsen er den høye til lave overgangen på SDA når SCL-linjen er høy, og stopptilstanden er den lave til høye overgangen på SDA når SCL-linjen er høy. Disse to forholdene genereres av mesteren (MCU eller noe som styrer de andre slaveenhetene). Busslinjen forblir opptatt i denne tilstanden når starttilstanden startes og forblir ledig igjen når stopptilstanden er startet.
Start- og stopptilstanden vises utmerket i signalperspektivet i N76E003 datablad-
7-biters adresse med dataformat:
N76E003 støtter en 7-biters adresse og dataformat. Etter at starttilstanden er startet, må masterenheten sende dataene til I2C-linjen. De første dataene er viktige. Hvis disse dataene ikke blir opprettet eller overført på riktig måte, blir ikke den tilkoblede enheten identifisert, og ytterligere kommunikasjon kan ikke gjøres.
Dataene består av en 7-bit lang slave-adresse, betegnet som SLA. Denne 7-biters lange adressen må være unik for hver enhet hvis flere enheter er koblet til på bussen. Etter 7-biters adresse er den 8. biten dataretningsbiten. Det betyr at, avhengig av 8. bit, sender masteren informasjonen til slaveenheten om hvorvidt data vil bli skrevet i slaveenheten eller dataene vil bli lest fra slavenheten. Den 8. biten er R / W-biten referert til som lese- eller skrivevarsler. Som vi alle vet kan 8-biters informasjon være 128 typer, og dermed støtte 128 enheter, men I2C støtter 127 typer enheter på samme buss, men ikke 128. Fordi 0x00-adressen er en reservert adresse som kalles en generell samtaleadresse. Hvis mesteren vil sende informasjon til alle enheter,den vil adressere 0x00, og hver enhet vil spille av på samme måte som per individuell programvarekonfigurasjon.
Dermed ser dataoverføringen ut som nedenfor -
Anerkjenne:
I det ovennevnte dataadressebildet kalles den 9. biten etterfulgt av R / W-biten bekreftelsesbit. Det er viktig fordi master eller slave bruker denne biten, og reagerer på datasenderen ved å trekke SDA-linjen lavt. For å få bekreftelsesbiten, må senderen frigjøre SDA-linjen.
Programmering N76E003 for I2C-kommunikasjon
Det komplette programmet som brukes i denne veiledningen, finner du nederst på denne siden. Forklaringen på viktige segmenter i koden er som følger -
Sett pins som Open Drain og konfigurer dem for I2C:
La oss starte med I2C-pinneseksjonen først. Som beskrevet tidligere, må I2C SCL- og SDA-portene konfigureres og settes som åpen avløpskonfigurasjon. For å gjøre dette bruker vi en I2C.h-headerfil sammen med en I2C.c-kildefil . Kodebiten ser slik ut-
gjør {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} mens (0)
Ovennevnte kode setter P13 og P14 som Open-Drain pin og clr_I2CPX brukes til å velge P13 og P14 som SCL pin på P1.3 og SDA pin på P1.4.
Denne I2CPX er den 0. Biten av I2C-kontrollregisteret I2CON. Hvis denne I2C_PX er satt til 1, endres pinnene til P0.2 som SCL og P1.6 som SDA. Imidlertid vil vi bruke P13 og P14. Her brukes ikke alternative pinner.
I2C kontrollregister I2CON:
I2C-kontrollregister I2CON brukes til å kontrollere I2C-operasjonene. Den første biten er I2C-pinnevalgsbit. Hvis du setter den 0, konfigureres I2C-pinnen som P13 og P14.
AA-bit er bekreftelsesslagflagget. Hvis AA-flagget er satt, vil en ACK bli returnert under bekreftelseklokkepulsen til SCL-linjen. Hvis det slettes, vil et NACK (høyt nivå på SDA) bli returnert under den bekreftede klokkepulsen til SCL-linjen.
Den neste biten er SI som er I2C-statusavbrudd. Hvis I2C-statusavbrudd er aktivert, bør brukeren sjekke I2STAT-registeret for å finne ut hvilket trinn som er bestått, og bør utføre handlingen.
STO er STOP-flagget som settes i hovedmodus. STO slettes automatisk av maskinvare når STOP- tilstanden er oppdaget.
Den neste biten er STA-biten. Hvis dette flagget er satt, genererer I2C en START-tilstand hvis bussen er ledig. Hvis bussen er opptatt, venter I2C på en STOP-tilstand og genererer en START-tilstand som følger. Hvis STA er satt mens I2C allerede er i mastermodus og ett eller flere byte har blitt overført eller mottatt, genererer I2C en gjentatt START-tilstand. STA må tømmes manuelt av programvaren.
Den siste, I2CEN er I2C buss aktivere eller deaktivere bit.
EEPROM 24C02:
Nå, kommer til 24C02. Brettstøttepakken til N76E003 har en I2C-kode for 24LC64 og kan enkelt endres. Imidlertid vil vi bruke en enkel metode for å forstå I2C-funksjonen.
Hvis noen ønsker å bruke detaljert grensesnitt med EEPROM 24C02, kan EEPROM-programmet i BSP brukes.
Vi kobler bare 24C02 i I2C der N76E003 vil være master og EEPROM vil være en slave. Dermed vil vi skrive data inn i EEPROM-adressen og lese den samme.
24C02 EEPROM pinout er vist nedenfor-
A0, A1 og A2 er tre adressevalgstifter. WP-pinnene er skrivebeskyttelsespinner og må kobles til VSS for å muliggjøre skriving i EEPROM.
Byte Write-funksjonaliteten vises i bildet nedenfor -
Hele skrivesyklusen skjer med en startbit. Etter det må kontrollbyten sendes inn. I kontrollbyten kreves følgende ting-
Etter startbit, bestå av slaveadressen. 1010 er den statiske og A0, A1 og A2 er den maskinvareforbindelsesbaserte adressen. Hvis de tre pinnene er koblet til med GND- eller VSS-forsyning, vil den bli lest som 0. Hvis ikke, hvis den er koblet til VCC, vil den bli lest som 1. I vårt tilfelle er alle A0, A1 og A2 koblet til VSS. Dermed vil alle disse være 0.
Utgifter til lese- eller skrivetilstand. Verdien av adressen med lese- eller skrivebit vil være - 0xA0 for skriv og 0xA1 for lesing. Deretter er kvitteringsbiten, og etter det vil en 8-bits adresse bli overført der dataene må lagres, og til slutt dataene som vil bli lagret på den respektive plasseringen. Disse tingene gjøres i et trinnvis format i hovedfunksjonen.
Hovedfunksjon og While Loop:
ugyldig hoved (ugyldig) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Viktig, bruk skrivefunksjonen må sette TI = 1; I2C_init (); mens (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n Verdien som er lest er% x", c & 0xff); }; }
Hovedfunksjonen er enkel, det er kontinuerlig å skrive verdier til EEPROM i adressen 1 og lese dataene. Dataene blir deretter skrevet ut ved hjelp av printf-funksjonen. Printf skriver ut verdien i hex.
EEPROM-skrivefunksjonen består av følgende ting som ble beskrevet i avsnittet EEPROM-
ugyldig EEPROM_write (usignert char adresse, usignert char verdi) {I2C_start (); I2C_write (0xA0); I2C_write (adresse); I2C_write (verdi); I2C_stop (); }
I2C startfunksjon består av følgende ting-
ugyldig I2C_start (ugyldig) {signert int time = timeout; sett_STA; clr_SI; mens ((SI == 0) && (tid> 0)) {tid--; }; }
I denne funksjonen blir SI-statusen sjekket sammen med den forhåndsdefinerte tidsavbruddsperioden (definert i I2C.h der den forhåndsdefinerte tiden er satt til 1000). Startfunksjonen begynner med å stille inn STA og tømme SI.
ugyldig I2C_stop (ugyldig) {signert int time = timeout; clr_SI; sett_STO; mens ((STO == 1) && (tid> 0)) {tid--; }; }
Samme som Start, stopp-funksjonen brukes. Den stoppfunksjonen startes ved å sette opp STO etterfulgt av tømme SI. Nedenfor funksjonen er I2C lese funksjon-
usignert char I2C_read (usignert char ack_mode) {signert int time = timeout; usignert røyeverdi = 0x00; sett_AA; clr_SI; mens ((SI == 0) && (t> 0)) {tid--; }; verdi = I2DAT; hvis (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; mens ((SI == 0) && (t> 0)) {tid--; }; } returverdi; }
Den ack_mode og I2C_NACK , som begge er definert i I2C topptekstfilen som henholdsvis 0 og 1.
Tilsvarende opprettes skrivefunksjonen-
ugyldig I2C_write (usignert verdi) {signert int time = timeout; I2DAT = verdi; clr_STA; clr_SI; mens ((SI == 0) && (tid> 0)) {tid--; }; }
Blinker koden og utdataene
Koden returnerte 0 advarsler og 0 feil og ble blinket ved hjelp av standard blinkemetode av Keil. Hvis du er ny, sjekk ut i gang med opplæringen for nuvoton for å forstå hvordan du laster opp kode. Den sammenfattende informasjonen til koden finner du nedenfor.
Bygg mål 'I2C_EEPROM' som kompilerer I2C_EEPROM.c… kompilerer I2C.c… lenker… Programstørrelse: data = 59.2 xdata = 0 kode = 2409 og lager hex-fil fra ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 feil (er), 0 advarsel (er). Byggetid forløpt: 00:00:04 Sammendrag av batch-build: 1 lyktes, 0 mislyktes, 0 hoppet over - Tid forløpt: 00:00:04
Maskinvaren blir satt opp på et brødbrett og fungerer som forventet. Som du kan se på bildet nedenfor, var vi i stand til å skrive en verdi på EEPROM og lese den tilbake fra minnet og vise den på den serielle skjermen.
Sjekk ut videoen nedenfor for en fullstendig demonstrasjon av hvordan tavlen fungerer for denne koden. Håper du likte opplæringen og lærte noe nyttig hvis du har spørsmål, legg dem i kommentarseksjonen nedenfor. Du kan også bruke forumene våre til å legge ut andre tekniske spørsmål.