- Wat is het I2C-communicatieprotocol?
- Hoe werkt I2C-communicatie?
- Waar gebruik ik I2C-communicatie?
- I2C op Nuvoton N76E003 - Hardwarevereiste
- Koppeling AT24LC64 met Nuvoton N76E003 - Schakelschema
- I2C-pinnen op Nuvoton N76E003
- I2C-communicatie in N76E003
- N76E003 programmeren voor I2C-communicatie
- Knipperende code en uitvoer
In het enorme systeem van embedded applicaties kan geen enkele microcontroller alle activiteiten zelf uitvoeren. Op een bepaald moment moet het communiceren met andere apparaten om informatie te delen. Er zijn veel verschillende soorten communicatieprotocollen om deze informatie te delen, maar de meest gebruikte zijn USART, IIC, SPI en CAN. Elk communicatieprotocol heeft zijn eigen voor- en nadeel. Laten we ons voorlopig concentreren op het IIC-gedeelte, want dat is wat we in deze tutorial gaan leren. Als u hier nieuw bent, bekijk dan de Nuvoton-zelfstudies waar we alle randapparatuur van de N76E003-microcontroller hebben besproken vanaf de zeer eenvoudige zelfstudie om aan de slag te gaan. Als je wilt leren hoe je I2C met andere microcontrollers kunt gebruiken, kun je de onderstaande links bekijken.
- Hoe I2C in Arduino te gebruiken: communicatie tussen twee Arduino-kaarten
- I2C communicatie met PIC Microcontroller PIC16F877
- 16X2 LCD-interface met ESP32 met I2C
- I2C-communicatie met MSP430 Launchpad
- Interfacing LCD met NodeMCU zonder I2C te gebruiken
- Hoe om te gaan met multi-communicatie (I2C SPI UART) in een enkel programma van Arduino
I2C is een belangrijk communicatieprotocol dat is ontwikkeld door Philips (nu NXP). Met behulp van dit I2C-protocol kan een MCU worden verbonden met meerdere apparaten en de communicatie starten. I2C werkt met slechts twee draden, namelijk SDA en SCL. Waar SDA staat voor Serial data en SCL staat voor Serial Clock. Deze twee pinnen vereisen echter pull-up-weerstanden tot het VCC-spanningsniveau en met een geschikte pull-up-weerstand kan de bus 127 apparaten met een uniek adres ondersteunen.
Wat is het I2C-communicatieprotocol?
De term IIC staat voor " Inter Integrated Circuits ". Het wordt normaal gesproken aangeduid als I2C of I squared C of zelfs als 2-draads interfaceprotocol (TWI) op sommige plaatsen, maar het betekent allemaal hetzelfde. I2C is een synchroon communicatieprotocol, wat betekent dat beide apparaten die de informatie delen een gemeenschappelijk kloksignaal moeten delen. Het heeft slechts twee draden om informatie te delen, waarvan de ene wordt gebruikt voor het kloksignaal en de andere wordt gebruikt voor het verzenden en ontvangen van gegevens.
Hoe werkt I2C-communicatie?
I2C-communicatie werd voor het eerst geïntroduceerd door Phillips. Zoals eerder gezegd, heeft het twee draden, deze twee draden worden over twee apparaten verbonden. Hier wordt het ene apparaat een master genoemd en het andere apparaat een slaaf. Communicatie moet en zal altijd plaatsvinden tussen twee, een Master en een Slave. Het voordeel van I2C-communicatie is dat er meer dan één slaaf op een master kan worden aangesloten.
De volledige communicatie vindt plaats via deze twee draden, namelijk Serial Clock (SCL) en Serial Data (SDA).
Seriële klok (SCL): deelt het kloksignaal dat door de master wordt gegenereerd met de slave
Seriële gegevens (SDA): verzendt de gegevens van en naar tussen de master en slave.
Op elk moment kan alleen de master de communicatie starten. Omdat er meer dan één slave in de bus is, moet de master naar elke slave verwijzen met een ander adres. Wanneer alleen de zalf met dat specifieke adres wordt geadresseerd, antwoordt hij met de informatie terwijl de anderen zwijgen. Op deze manier kunnen we dezelfde bus gebruiken om met meerdere apparaten te communiceren.
Waar gebruik ik I2C-communicatie?
I2C-communicatie wordt alleen gebruikt voor communicatie op korte afstand. Het is zeker tot op zekere hoogte betrouwbaar omdat het een gesynchroniseerde klokpuls heeft om het slim te maken. Dit protocol wordt voornamelijk gebruikt om te communiceren met de sensor of andere apparaten die informatie naar een master moeten sturen. Het is erg handig wanneer een microcontroller moet communiceren met veel andere slavemodules met een minimum aan alleen draden. Als u op zoek bent naar langeafstandscommunicatie, moet u RS232 proberen en als u op zoek bent naar betrouwbaardere communicatie, moet u het SPI-protocol proberen.
I2C op Nuvoton N76E003 - Hardwarevereiste
Aangezien de vereiste van dit project is om I2C-communicatie te leren met behulp van N76E003, zullen we een EEPROM gebruiken die wordt verbonden met de I2C-datalijn. We zullen enkele gegevens opslaan in de EEPROM en deze ook lezen en weergeven met behulp van het UART-scherm.
Omdat de opgeslagen waarde wordt afgedrukt in de UART, is elke soort USB naar UART-converter vereist. U kunt ook de tutorial over UART met Nuvoton bekijken als u nieuw bent bij UART-communicatie op N76E003. Voor onze applicatie zullen we CP2102 UART naar USB-converter gebruiken. Naast het bovenstaande hebben we ook de volgende componenten nodig:
- EEPROM 24C02
- 2 stuks 4.7k weerstanden
Om nog maar te zwijgen, behalve de bovenstaande componenten, hebben we een N76E003-microcontroller-gebaseerd ontwikkelbord nodig, evenals de Nu-Link Programmer. Bovendien zijn ook breadboard- en aansluitdraden vereist voor het aansluiten van alle componenten.
Koppeling AT24LC64 met Nuvoton N76E003 - Schakelschema
Zoals we in het onderstaande schema kunnen zien, is de EEPROM verbonden in de I2C-lijn samen met twee pull-up-weerstanden. Helemaal links wordt de aansluiting van de programmeerinterface weergegeven.
Ik gebruikte een breadboard voor de AT24LC64 IC en verbond het IC met mijn nuvoton programmeerbord met behulp van jumperdraden. Mijn hardware-instellingen samen met de nu-ink-programmeur worden hieronder weergegeven.
I2C-pinnen op Nuvoton N76E003
Het pin-diagram van N76E003 is te zien in de onderstaande afbeelding-
Zoals we kunnen zien, heeft elke pin verschillende specificaties en kan elke pin voor meerdere doeleinden worden gebruikt. Echter, wordt pin 1.4 gebruikt als een I2C SDA pin, zal het de PWM en andere functionaliteit verliezen. Maar dat is geen probleem, want voor dit project is geen andere functionaliteit vereist. Hetzelfde zal gebeuren voor de P1.3, de SCL-pin van I2C.
Omdat I2C-pinnen fungeren als een GPIO, moet deze worden geconfigureerd. Alle GPIO-pinnen kunnen worden geconfigureerd in de hieronder beschreven modus.
Volgens het gegevensblad, PxM1.n en PxM2. n zijn twee registers die worden gebruikt om de besturingswerking van de I / O-poort te bepalen. In de datasheet wordt vermeld dat om de I2C-functionaliteit te gebruiken, de I / O-modi moeten worden gebruikt als Open-drain voor I2C-gerelateerde communicatie.
I2C-communicatie in N76E003
Het I2C-randapparaat is een belangrijk ding voor elke microcontrollereenheid die I2C-functies ondersteunt. Veel soorten verschillende microcontrollers worden geleverd met een ingebouwde I2C-randapparatuur. In sommige gevallen kan I2C echter handmatig worden geconfigureerd met behulp van softwarebesturing waar I2C-gerelateerde hardware-ondersteuning niet beschikbaar is (bijvoorbeeld veel 8051-microcontrollers). De nuvoton N76E003 wordt echter geleverd met I2C-randapparatuur.
De M76E003 ondersteunt vier soorten bewerkingen in I2C-modi: masterzender, masterontvanger, slave-zender en slave-ontvanger. Het ondersteunt ook standaard (100 kbps) en hoge (tot 400 kbps) snelheden voor de I2C-lijn. I2C werkt met enkele generieke regels in de SCL- en SDA-signaallijnen.
Start- en stopvoorwaarde:
Het is een belangrijk ding in I2C-communicatie. Wanneer gegevens worden overgedragen naar de I2C-lijn, begint deze met een begintoestand en eindigt deze met een stopvoorwaarde.
De startvoorwaarde is de overgang van hoog naar laag op de SDA wanneer de SCL-lijn hoog is en de stopvoorwaarde is de overgang van laag naar hoog op de SDA wanneer de SCL-lijn hoog is. Deze twee voorwaarden worden gegenereerd door de master (de MCU of iets dat de andere slaafapparaten bestuurt). De buslijn blijft in deze toestand bezet wanneer de startvoorwaarde wordt geïnitieerd en blijft weer vrij wanneer de stopvoorwaarde wordt geïnitieerd.
De start- en stopconditie wordt uitstekend weergegeven in het signaalperspectief in de N76E003-datasheet-
7-bits adres met gegevensformaat:
N76E003 ondersteunt een 7-bits adres- en gegevensindeling. Nadat de startvoorwaarde is geïnitieerd, moet het masterapparaat de gegevens naar de I2C-lijn sturen. De eerste gegevens zijn belangrijk. Als deze gegevens niet correct worden aangemaakt of verzonden, wordt het aangesloten apparaat niet geïdentificeerd en kan er geen verdere communicatie plaatsvinden.
De gegevens bestaan uit een 7-bit lang slave-adres, aangeduid als SLA. Dit 7-bits lange adres moet uniek zijn voor elk apparaat als er meerdere apparaten op de bus zijn aangesloten. Na het 7-bits adres is het 8ste bit de datarichtingbit. Dat betekent dat, afhankelijk van de 8e bit, de master de informatie naar het slaafapparaat stuurt over of gegevens in het slaafapparaat worden geschreven of dat de gegevens van het slaafapparaat worden gelezen. Het 8ste bit is het R / W-bit dat wordt aangeduid als lees- of schrijfnotificator. Zoals we allemaal weten, kan 8-bits informatie 128 typen zijn, dus 128 apparaten ondersteunen, maar I2C ondersteunt 127 typen apparaten op dezelfde bus, maar niet 128. Omdat het 0x00-adres een gereserveerd adres is dat een algemeen oproepadres wordt genoemd. Als de master informatie naar alle apparaten wil sturen,het adresseert 0x00 en elk apparaat wordt op dezelfde manier afgespeeld als bij de individuele softwareconfiguraties.
De gegevensoverdracht ziet er dus als volgt uit:
Erkennen:
In het bovenstaande gegevensadresbeeld wordt het 9e bit gevolgd door het R / W-bit het bevestigingsbit genoemd. Het is een belangrijke omdat met behulp van dit bit de master of slave op de datatransmitter reageert door de SDA-lijn naar beneden te trekken. Om het bevestigingsbit te krijgen, moet de zender de SDA-lijn vrijgeven.
N76E003 programmeren voor I2C-communicatie
Het volledige programma dat in deze tutorial wordt gebruikt, vindt u onderaan deze pagina. De uitleg van belangrijke segmenten in de code is als volgt-
Stel pinnen in als open afvoer en configureer ze voor I2C:
Laten we eerst beginnen met de I2C-pin-sectie. Zoals eerder beschreven, moeten de I2C SCL- en SDA-poorten worden geconfigureerd en ingesteld als de open-drain-configuratie. Om dit te doen, gebruiken we een I2C.h-headerbestand samen met een I2C.c-bronbestand . Het codefragment ziet er als volgt uit:
doe {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} while (0)
De bovenstaande code stelt de P13 en P14 in als Open-Drain-pin en clr_I2CPX wordt gebruikt om de P13 en P14 als SCL-pin op P1.3 en SDA-pin op P1.4 te selecteren.
Deze I2CPX is het 0ste bit van I2C control register I2CON. Als deze I2C_PX is ingesteld als 1, worden de pinnen gewijzigd in P0.2 als SCL en P1.6 als SDA. We zullen echter P13 en P14 gebruiken. Alternatieve pinnen worden hier niet gebruikt.
I2C Control Register I2CON:
I2C-besturingsregister I2CON wordt gebruikt om de I2C-bewerkingen te besturen. Het eerste bit is het I2C-pinselectiebit. Door het in te stellen op 0, wordt de I2C-pin geconfigureerd als P13 en P14.
AA-bit is de bevestigingsvlag, als de AA-vlag is ingesteld, zal een ACK worden geretourneerd tijdens de bevestigingsklokpuls van de SCL-lijn. Als het wordt gewist, wordt een NACK (hoog niveau op SDA) geretourneerd tijdens de bevestigde klokpuls van de SCL-lijn.
Het volgende bit is SI, de I2C-statusonderbreking. Als I2C Status Interrupt is ingeschakeld, moet de gebruiker het I2STAT-register controleren om te bepalen welke stap is voltooid en moet hij de actie ondernemen.
De STO is de STOP-vlag die wordt ingesteld in de mastermodus. STO wordt automatisch gewist door hardware zodra de STOP- conditie is gedetecteerd.
Het volgende bit is het STA-bit. Als deze vlag is ingesteld, genereert I2C een START-voorwaarde als de bus vrij is. Als de bus bezet is, wacht de I2C op een STOP-conditie en genereert daarna een START-conditie. Als STA is ingesteld terwijl de I2C zich al in de mastermodus bevindt en een of meer bytes zijn verzonden of ontvangen, genereert de I2C een herhaalde START-conditie. De STA moet handmatig worden gewist door de software.
De laatste, I2CEN is de I2C-bus in- of uitschakelen bit.
EEPROM 24C02:
Nu, komend naar de 24C02. Het bordondersteuningspakket van N76E003 heeft een I2C-code voor de 24LC64 en kan eenvoudig worden gewijzigd. We zullen echter een eenvoudige methode gebruiken om de I2C-functie te begrijpen.
Als iemand een gedetailleerde interface met EEPROM 24C02 wil gebruiken, kan het EEPROM-programma in de BSP worden gebruikt.
We zullen alleen de 24C02 in I2C aansluiten waar de N76E003 master zal zijn en de EEPROM een slave. We zullen dus alle gegevens naar het EEPROM-adres schrijven en hetzelfde lezen.
24C02 EEPROM-pinout wordt hieronder weergegeven
A0, A1 en A2 zijn drie adresselectiepennen. De WP-pinnen zijn schrijfbeveiligingspinnen en moeten worden verbonden met VSS om schrijven naar de EEPROM mogelijk te maken.
De Byte Write-functionaliteit wordt getoond in de onderstaande afbeelding-
De volledige schrijfcyclus vindt plaats met een startbit. Daarna moet de besturingsbyte worden verzonden. In de besturingsbyte zijn de volgende dingen vereist:
Bestaat na de startbit uit het slave-adres. 1010 is het statische adres en A0, A1 en A2 zijn het op hardware gebaseerde adres. Als de drie pinnen zijn verbonden met GND- of VSS-voeding, wordt dit gelezen als 0. Anders, indien verbonden met VCC, wordt dit gelezen als 1. In ons geval zijn alle A0, A1 en A2 verbonden met VSS. Al deze zullen dus 0 zijn.
Uitgaven aan de lees- of schrijfconditie. De waarde van het adres met de lees- of schrijfbit is - 0xA0 voor schrijven en 0xA1 voor lezen. Het volgende is het bevestigingsbit en daarna wordt een 8-bit adres verzonden waar de gegevens moeten worden opgeslagen en ten slotte de gegevens die op de respectieve locatie zullen worden opgeslagen. Deze dingen worden stap voor stap gedaan in de hoofdfunctie.
Hoofdfunctie en While-lus:
void main (void) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Belangrijk, gebruik de prinft-functie moet TI = 1 instellen; I2C_init (); while (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n De gelezen waarde is% x", c & 0xff); }; }
De belangrijkste functie is eenvoudig, het is continu waarden schrijven naar de EEPROM in adres 1 en de gegevens lezen. De gegevens worden vervolgens afgedrukt met de functie printf. De printf drukt de waarde in hex af.
De EEPROM-schrijffunctie bestaat uit de volgende dingen die werden beschreven in de EEPROM-sectie-
void EEPROM_write (unsigned char-adres, unsigned char-waarde) {I2C_start (); I2C_write (0xA0); I2C_write (adres); I2C_write (waarde); I2C_stop (); }
De I2C-startfunctie bestaat uit de volgende dingen:
void I2C_start (void) {ondertekende int tijd = time-out; set_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
In deze functie wordt de SI-status gecontroleerd samen met de vooraf gedefinieerde time-outperiode (gedefinieerd in I2C.h waar de vooraf gedefinieerde tijd is ingesteld op 1000). De startfunctie begint met het instellen van de STA en het wissen van de SI.
void I2C_stop (void) {ondertekende int tijd = time-out; clr_SI; set_STO; while ((STO == 1) && (time> 0)) {time--; }; }
Hetzelfde als de Start, stop-functie wordt gebruikt. De stop -functie wordt gestart door instellen van de STO gevolgd door het selectievakje SI. Onderstaande functie is de I2C-leesfunctie-
unsigned char I2C_read (unsigned char ack_mode) {ondertekende int tijd = time-out; niet-ondertekende char-waarde = 0x00; set_AA; clr_SI; while ((SI == 0) && (t> 0)) {tijd--; }; waarde = I2DAT; if (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; while ((SI == 0) && (t> 0)) {tijd--; }; } winstwaarde; }
De ack_mode en I2C_NACK , beide zijn gedefinieerd in het I2C-headerbestand als respectievelijk 0 en 1.
Evenzo wordt de schrijffunctie gemaakt-
void I2C_write (unsigned char value) {ondertekende int time = time-out; I2DAT = waarde; clr_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
Knipperende code en uitvoer
De code retourneerde 0 waarschuwing en 0 fouten en werd geflitst met behulp van de standaard knipperende methode door de Keil. Als u nieuw bent, bekijk dan de handleiding Aan de slag met nuvoton om te begrijpen hoe u code uploadt. De samenstellingsinformatie van de code vindt u hieronder.
Bouw doel 'I2C_EEPROM' compileren I2C_EEPROM.c… compileren I2C.c… koppelen… Programmagrootte: data = 59.2 xdata = 0 code = 2409 creëren hex-bestand van ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 Fout (en), 0 Waarschuwing (en). Verstreken buildtijd: 00:00:04 Batch-build samenvatting: 1 geslaagd, 0 mislukt, 0 overgeslagen - Verstreken tijd: 00:00:04
De hardware wordt op een breadboard geïnstalleerd en werkt zoals verwacht. Zoals u in de onderstaande afbeelding kunt zien, waren we in staat om een waarde op EEPROM te schrijven en deze uit het geheugen terug te lezen en weer te geven op de seriële monitor.
Bekijk de onderstaande video voor een complete demonstratie van hoe het bord werkt voor deze code. Ik hoop dat je de tutorial leuk vond en iets nuttigs hebt geleerd als je vragen hebt, laat ze achter in het commentaargedeelte hieronder. U kunt ook onze forums gebruiken om andere technische vragen te stellen.