- Čo je komunikačný protokol I2C?
- Ako funguje komunikácia I2C?
- Kde používať komunikáciu I2C?
- I2C na Nuvoton N76E003 - Hardvérová požiadavka
- Prepojenie AT24LC64 s Nuvoton N76E003 - Schéma zapojenia
- I2C piny na Nuvoton N76E003
- Komunikácia I2C v N76E003
- Programovanie N76E003 pre komunikáciu I2C
- Blikanie kódu a výstupu
V rozsiahlom systéme zabudovaných aplikácií nemôže žiadny mikrokontrolér vykonávať všetky činnosti sám. V určitej fáze času musí komunikovať s ostatnými zariadeniami, aby mohli zdieľať informácie, existuje veľa rôznych typov komunikačných protokolov na zdieľanie týchto informácií, ale najpoužívanejšie sú USART, IIC, SPI a CAN. Každý komunikačný protokol má svoje vlastné výhody a nevýhody. Teraz sa zamerajme na časť IIC, pretože to sa v tomto návode naučíme. Ak ste tu nový, pozrite si výukové programy Nuvoton, kde sme diskutovali o každej periférii mikrokontroléra N76E003 od úplne základného tutoriálu Začíname. Ak sa chcete dozvedieť, ako používať I2C s inými mikrokontrolérmi, môžete skontrolovať nasledujúce odkazy.
- Ako používať I2C v Arduine: Komunikácia medzi dvoma doskami Arduino
- Komunikácia I2C s mikrokontrolérom PIC PIC16F877
- Prepojenie LCD 16X2 s ESP32 pomocou I2C
- Komunikácia I2C s MSP430 Launchpad
- Prepojenie LCD s NodeMCU bez použitia I2C
- Ako zvládnuť viacnásobnú komunikáciu (I2C SPI UART) v jednom programe Arduina
I2C je dôležitý komunikačný protokol vyvinutý spoločnosťou Philips (teraz NXP). Pomocou tohto protokolu I2C je možné MCU pripojiť k viacerým zariadeniam a zahájiť komunikáciu. I2C pracuje iba s dvoma drôtmi, a to SDA a SCL. Kde SDA znamená Serial data a SCL znamená Serial Clock. Tieto dva piny však vyžadujú pull-up rezistory na úroveň napätia VCC a s adekvátnym pull-up rezistorom môže zbernica podporovať 127 zariadení s jedinečnou adresou.
Čo je komunikačný protokol I2C?
Pojem IIC znamená „ integrované obvody “. Normálne sa na niektorých miestach označuje ako I2C alebo I na druhú C alebo dokonca ako 2-vodičový protokol rozhrania (TWI), ale všetko to znamená to isté. I2C je synchrónny komunikačný protokol, čo znamená, že obe zariadenia, ktoré zdieľajú informácie, musia zdieľať spoločný hodinový signál. Má iba dva vodiče na zdieľanie informácií, z ktorých jeden sa používa pre hodinový signál a druhý sa používa na odosielanie a prijímanie údajov.
Ako funguje komunikácia I2C?
Komunikáciu I2C prvýkrát predstavil Phillips. Ako už bolo povedané, má dva vodiče, tieto dva vodiče budú prepojené cez dve zariadenia. Tu sa jedno zariadenie nazýva hlavný a druhé zariadenie sa nazýva slave. Komunikácia by mala a bude prebiehať vždy medzi dvoma, Master a Slave. Výhodou I2C komunikácie je, že k Master môže byť pripojených viac ako jeden slave.
Kompletná komunikácia prebieha prostredníctvom týchto dvoch káblov, a to Serial Clock (SCL) a Serial Data (SDA).
Serial Clock (SCL): Zdieľa hodinový signál generovaný hlavnou jednotkou s podradenou jednotkou
Serial Data (SDA): Sends the data to and from between the Master and slave.
V ktoromkoľvek danom okamihu bude môcť komunikáciu zahájiť iba hlavný server. Pretože v zbernici je viac ako jeden slave, musí master odkazovať na každého slave pomocou inej adresy. Pri oslovení odpovie iba mast s touto konkrétnou adresou späť s informáciami, zatiaľ čo ostatní budú ticho. Týmto spôsobom môžeme použiť rovnakú zbernicu na komunikáciu s viacerými zariadeniami.
Kde používať komunikáciu I2C?
Komunikácia I2C sa používa iba na komunikáciu na krátke vzdialenosti. Je to do istej miery spoľahlivé, pretože má synchronizovaný hodinový impulz, aby bol inteligentný. Tento protokol sa používa hlavne na komunikáciu so senzorom alebo inými zariadeniami, ktoré musia odosielať informácie nadriadenému. Je to veľmi užitočné, keď mikrokontrolér musí komunikovať s mnohými ďalšími podradenými modulmi pomocou minimálne iba drôtov. Ak hľadáte komunikáciu na diaľku, mali by ste vyskúšať RS232 a ak hľadáte spoľahlivejšiu komunikáciu, mali by ste vyskúšať protokol SPI.
I2C na Nuvoton N76E003 - Hardvérová požiadavka
Pretože požiadavkou tohto projektu je naučiť sa komunikáciu I2C pomocou N76E003, použijeme EEPROM, ktorá bude prepojená s dátovou linkou I2C. Niektoré údaje uložíme do EEPROM a tiež ich prečítame a zobrazíme pomocou obrazovky UART.
Pretože uložená hodnota bude vytlačená v UART, je potrebný akýkoľvek druh prevodníka USB na UART. Môžete si tiež pozrieť návod na UART s Nuvoton, ak ste v komunikácii UART na N76E003 nováčikom. Pre našu aplikáciu použijeme prevodník CP2102 UART na USB. Okrem vyššie uvedeného požadujeme aj nasledujúce komponenty -
- EEPROM 24C02
- 2ks 4,7k rezistory
Nehovoriac o tom, že okrem vyššie uvedených komponentov potrebujeme vývojovú dosku založenú na mikrokontroléroch N76E003, ako aj programátor Nu-Link. Ďalej sú na pripojenie všetkých komponentov potrebné tiež nepájivé pole a pripojovacie vodiče.
Prepojenie AT24LC64 s Nuvoton N76E003 - Schéma zapojenia
Ako vidíme na schéme nižšie, EEPROM je pripojená k linke I2C spolu s dvoma pull up rezistormi. Úplne vľavo je zobrazené pripojenie programovacieho rozhrania.
Použil som nepájivú dosku pre IC AT24LC64 a pripojil som IC k mojej programátorskej doske nuvoton pomocou prepojovacích vodičov. Moje hardvérové nastavenie spolu s programátorom nu-ink je zobrazené nižšie.
I2C piny na Nuvoton N76E003
Schéma pinov N76E003 je vidieť na obrázku nižšie -
Ako vidíme, každý pin má iné technické parametre a každý pin je možné použiť na rôzne účely. Avšak, pin 1.4 sa používa ako kolík I2C SDA, bude to stratí PWM a ďalšie funkcie. To však nie je problém, pretože pre tento projekt sa nevyžaduje ďalšia funkčnosť. To isté sa stane s P1.3 je SCL pin I2C.
Pretože piny I2C fungujú ako GPIO, je potrebné ich nakonfigurovať. Všetky piny GPIO je možné konfigurovať v nižšie popísanom režime.
Podľa údajového listu, PxM1.n a PxM2. n sú dva registre, ktoré sa používajú na určenie riadiacej činnosti I / O portu. V údajovom liste sa uvádza, že na použitie funkcionality I2C je potrebné použiť I / O režimy ako Open-drain pre komunikáciu súvisiacu s I2C.
Komunikácia I2C v N76E003
Periférne zariadenie I2C je dôležitá vec pre každú jednotku mikrokontroléra, ktorá podporuje funkcie I2C. Mnoho typov rôznych mikrokontrolérov má zabudovanú perifériu I2C. V niektorých prípadoch však možno I2C nakonfigurovať manuálne pomocou softvérového riadenia, kde nie je k dispozícii hardvérová podpora súvisiaca s I2C (napríklad veľa 8051 mikrokontrolérov). Nuvoton N76E003 však prichádza s periférnou podporou I2C.
M76E003 podporuje štyri typy operácií v režimoch I2C - hlavný vysielač, hlavný prijímač, podriadený vysielač a podriadený prijímač. Podporuje tiež štandardné (100 kb / s) a rýchle (až 400 kb / s) rýchlosti pre linku I2C. I2C pracuje s niekoľkými všeobecnými pravidlami v signálnych vedeniach SCL a SDA.
Stav spustenia a zastavenia:
V komunikácii I2C je to dôležitá vec. Keď sa dáta prenášajú na linku I2C, začína sa podmienkou begin a končí sa stavom stop.
Podmienkou spustenia je prechod z vysokej na nízku na SDA, keď je linka SCL vysoká, a podmienkou zastavenia je prechod z vysokej na nízku na SDA, keď je linka SCL vysoká. Tieto dve podmienky generuje master (MCU alebo čokoľvek, čo riadi ďalšie podriadené zariadenia). Autobusová linka zostáva v tomto stave zaneprázdnená, keď je iniciovaná podmienka spustenia, a zostáva opäť voľná, keď je iniciovaná podmienka zastavenia.
Podmienky Štart a Stop sú vynikajúco zobrazené v perspektíve signálu v datasheete N76E003 -
7-bitová adresa s formátom údajov:
N76E003 podporuje 7-bitový formát adresy a údajov. Po iniciovaní štartovacej podmienky musí hlavné zariadenie odoslať údaje na linku I2C. Prvý údaj je dôležitý. Ak tieto údaje nebudú správne vytvorené alebo prenesené, pripojené zariadenie nebude identifikované a nebude možné nadviazať ďalšiu komunikáciu.
Dáta pozostávajú zo 7-bitovej adresy typu Slave, označenej ako SLA. Táto 7-bitová adresa musí byť pre každé zariadenie jedinečná, ak je na zbernici pripojených viac zariadení. Po 7-bitovej adrese je 8. bit bitom dátového smeru. To znamená, že v závislosti na 8. bite master pošle informáciu do podriadeného zariadenia o tom, či budú dáta zapísané do podriadeného zariadenia alebo budú dáta načítané z podriadeného zariadenia. 8. bit je bit R / W označovaný ako oznamovač čítania alebo zápisu. Ako všetci vieme, 8-bitové informácie môžu byť 128 typov, čo podporuje 128 zariadení, ale I2C podporuje 127 typov zariadení na tej istej zbernici, ale nie 128. Pretože adresa 0x00 je vyhradená adresa, ktorá sa nazýva všeobecná adresa volania. Ak chce hlavný poslať informácie do všetkých zariadení,bude adresa 0x00 a každé zariadenie sa bude prehrávať rovnakým spôsobom ako podľa jednotlivých softvérových konfigurácií.
Prenos dát teda vyzerá takto -
Potvrdiť:
Na vyššie uvedenom obrázku dátovej adresy sa 9. bit nasledovaný bitom R / W nazýva potvrdzovací bit. Je to dôležité, pretože pomocou tohto bitu reaguje master alebo slave na dátový vysielač potiahnutím SDA linky nízko. Na získanie potvrdzovacieho bitu musí vysielač uvoľniť linku SDA.
Programovanie N76E003 pre komunikáciu I2C
Celý program použitý v tomto návode nájdete v spodnej časti tejto stránky. Vysvetlenie dôležitých segmentov v kóde je nasledovné -
Nastavte piny ako Open Drain a nakonfigurujte ich pre I2C:
Najprv začneme s kolíkovou časťou I2C. Ako už bolo opísané, porty I2C SCL a SDA je potrebné nakonfigurovať a nastaviť ako konfiguráciu otvoreného odtoku. K tomu, aby sme používate hlavičkový súbor I2C.h spolu s zdrojový súbor I2C.c . Fragment kódu vyzerá takto -
do {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} while (0)
Vyššie uvedený kód nastavuje P13 a P14 ako pin Open-Drain a clr_I2CPX sa používa na výber P13 a P14 ako SCL pin na P1.3 a SDA pin na P1.4.
Tento I2CPX je 0. bitom riadiaceho registra I2C I2CON. Ak je táto I2C_PX nastavená na 1, kolíky sa zmenia na P0,2 ako SCL a P1,6 ako SDA. Použijeme však P13 a P14. Alternatívne kolíky sa tu nepoužívajú.
Riadiaci register I2C I2CON:
Riadiaci register I2C I2CON sa používa na riadenie operácií I2C. Prvý bit je bit na výber pinov I2C. Nastavením na 0 sa nakonfiguruje pin I2C na P13 a P14.
Bit AA je príznakom potvrdenia potvrdenia, ak je nastavený príznak AA, vráti sa ACK počas potvrdzovacieho hodinového impulzu linky SCL. Ak je zrušené, počas potvrdeného hodinového impulzu linky SCL sa vráti NACK (vysoká úroveň na SDA).
Ďalším bitom je SI, čo je prerušenie stavu I2C. Ak je povolené prerušenie stavu I2C, používateľ by mal skontrolovať register I2STAT, aby zistil, ktorý krok prešiel, a mal by konať.
STO je príznak STOP nastavený v hlavnom režime. Po zistení stavu STOP sa hardvér STO automaticky vymaže.
Ďalším bitom je bit STA. Ak je tento príznak nastavený, potom I2C vygeneruje podmienku START, ak je zbernica voľná. Ak je zbernica obsadená, I2C čaká na stav STOP a vygeneruje nasledujúcu podmienku START. Ak je nastavená STA, keď je I2C už v hlavnom režime a bol vysielaný alebo prijímaný jeden alebo viac bajtov, I2C generuje opakovanú podmienku ŠTART. Softvér musí STA vyčistiť manuálne.
Posledný z nich, I2CEN, je bit umožňujúci alebo deaktivujúci zbernicu I2C.
EEPROM 24C02:
Teraz prichádza na 24C02. Balík podpory dosiek N76E003 má I2C kód pre 24LC64 a dá sa ľahko upraviť. Na pochopenie funkcie I2C však použijeme jednoduchú metódu.
Ak chce niekto použiť podrobné prepojenie s EEPROM 24C02, môže použiť program EEPROM v BSP.
Pripojíme iba 24C02 v I2C, kde N76E003 bude hlavný a EEPROM bude podriadený. Zapíšeme teda akékoľvek údaje na adresu EEPROM a prečítame ich rovnaké.
Pinout 24C02 EEPROM je zobrazený nižšie -
A0, A1 a A2 sú tri kolíky na výber adresy. Kolíky WP sú kolíky chrániace proti zápisu a na umožnenie zápisu do EEPROM je potrebné ich spojiť s VSS.
Funkcia Byte Write je zobrazená na obrázku nižšie -
Celý cyklus zápisu sa uskutoční so začiatočným bitom. Potom je potrebné odoslať riadiaci bajt. V riadiacom bajte sú vyžadované nasledujúce veci -
Po štartovacom bite sa skladá z adresy slave. 1010 je statická a A0, A1 a A2 sú adresy založené na hardvérovom pripojení. Pokiaľ sú tieto tri piny spojené s napájaním GND alebo VSS, bude sa čítať ako 0. V opačnom prípade sa bude čítať ako 1. V našom prípade sú všetky A0, A1 a A2 spojené s VSS. Teda všetky tieto budú 0.
Výdavky na stav čítania alebo zápisu. Hodnota adresy s bitom Čítať alebo Zápis bude - 0xA0 pre zápis a 0xA1 pre čítanie. Ďalej je to bit Potvrdenie a potom sa prenesie 8-bitová adresa, na ktorú je potrebné uložiť údaje, a nakoniec dáta, ktoré sa uložia na príslušnom mieste. Tieto veci sa robia v hlavnej funkcii vo formáte krok za krokom.
Hlavná funkcia a cyklus Loop:
void main (void) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Dôležité, použitie funkcie tlače musí nastaviť TI = 1; I2C_init (); while (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n Čítaná hodnota je% x", c & 0xff); }; }
Hlavná funkcia je jednoduchá, je to nepretržité zapisovanie hodnôt do EEPROM na adresu 1 a čítanie údajov. Dáta sa potom tlačia pomocou funkcie printf. Printf tlačí hodnotu v hex.
Funkcia zápisu na EEPROM sa skladá z nasledujúcich vecí, ktoré boli popísané v časti EEPROM -
void EEPROM_write (nepodpísaná char adresa, nepodpísaná char hodnota) {I2C_start (); I2C_write (0xA0); I2C_write (adresa); I2C_write (hodnota); I2C_stop (); }
Funkcia spustenia I2C pozostáva z nasledujúcich vecí -
void I2C_start (void) {signed int time = timeout; sada_STA; clr_SI; while ((SI == 0) && (čas> 0)) {čas--; }; }
V tejto funkcii sa kontroluje stav SI spolu s preddefinovaným časovým limitom (definovaným v I2C.h, kde je preddefinovaný čas nastavený na 1000). Funkcia spustenia začína nastavením STA a vymazaním SI.
void I2C_stop (void) {signed int time = timeout; clr_SI; sada_STO; while ((STO == 1) && (čas> 0)) {čas--; }; }
Rovnako ako sa používa funkcia Štart, stop. Funkcia zastavenia sa inicializuje nastavením STO a následným vymazaním SI. Nižšie uvedená funkcia je funkcia čítania I2C -
unsigned char I2C_read (unsigned char ack_mode) {signed int time = timeout; nepodpísaná char hodnota = 0x00; set_AA; clr_SI; while ((SI == 0) && (t> 0)) {time--; }; hodnota = I2DAT; if (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; while ((SI == 0) && (t> 0)) {time--; }; } návratová hodnota; }
Ack_mode a I2C_NACK , ako sú definované v záhlaví súboru I2C ako 0 a 1, v danom poradí.
Podobne je vytvorená funkcia zápisu -
void I2C_write (hodnota znaku bez znamienka) {signed int time = timeout; I2DAT = hodnota; clr_STA; clr_SI; while ((SI == 0) && (čas> 0)) {čas--; }; }
Blikanie kódu a výstupu
Kód vrátil 0 varovaní a 0 chýb a bol bliknutý pomocou predvolenej metódy blikania pomocou Keila. Ak ste nový, prečítajte si príručku Začíname s programom nuvoton, aby ste pochopili, ako nahrať kód. Informácie o zostavení kódu nájdete nižšie.
Vytvorte cieľ 'I2C_EEPROM' kompilujúci I2C_EEPROM.c… kompilujúci I2C.c… prepájajúci sa… Veľkosť programu: data = 59,2 xdata = 0 kód = 2409 vytváranie hexadecimálneho súboru z ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 chýb, 0 varovaní. Uplynutý čas zostavenia: 00:00:04 Zhrnutie dávkového zostavenia: 1 úspech, 0 zlyhanie, 0 preskočenie - čas uplynul: 00:00:04
Hardvér sa nastavuje na nepájivej doske a pracuje podľa očakávaní. Ako vidíte na obrázku nižšie, dokázali sme napísať hodnotu na EEPROM a prečítať ju späť z pamäte a zobraziť na sériovom monitore.
Na videu uvedenom nižšie nájdete úplnú ukážku toho, ako doska funguje pre tento kód. Dúfam, že sa vám návod páčil a dozvedeli ste sa niečo užitočné, ak máte nejaké otázky, nechajte ich v sekcii komentárov nižšie. Môžete tiež použiť naše fóra na zverejnenie ďalších technických otázok.