- Co je komunikační protokol I2C?
- Jak funguje komunikace I2C?
- Kde použít komunikaci I2C?
- I2C na Nuvoton N76E003 - Hardwarový požadavek
- Propojení AT24LC64 s Nuvoton N76E003 - Schéma zapojení
- Piny I2C na Nuvoton N76E003
- Komunikace I2C v N76E003
- Programování N76E003 pro komunikaci I2C
- Blikající kód a výstup
V rozsáhlém systému integrovaných aplikací nemůže žádný mikrokontrolér provádět všechny činnosti sám. V určité fázi času musí komunikovat s dalšími zařízeními za účelem sdílení informací, existuje mnoho různých typů komunikačních protokolů ke sdílení těchto informací, ale nejpoužívanější jsou USART, IIC, SPI a CAN. Každý komunikační protokol má své vlastní výhody a nevýhody. Pojďme se nyní zaměřit na část IIC, protože to se v tomto tutoriálu naučíme. Pokud jste zde noví, podívejte se na výukové programy Nuvoton, kde jsme diskutovali o všech periferiích mikrokontroléru N76E003 od samotného základního tutoriálu Začínáme. Pokud se chcete naučit používat I2C s jinými mikrokontroléry, můžete se podívat na níže uvedené odkazy.
- Jak používat I2C v Arduinu: Komunikace mezi dvěma deskami Arduino
- Komunikace I2C s mikrokontrolérem PIC PIC16F877
- Rozhraní 16X2 LCD s ESP32 pomocí I2C
- Komunikace I2C s Launchpadem MSP430
- Propojení LCD s NodeMCU bez použití I2C
- Jak zvládnout více komunikací (I2C SPI UART) v jediném programu Arduino
I2C je důležitý komunikační protokol vyvinutý společností Philips (nyní NXP). Pomocí tohoto protokolu I2C lze MCU připojit k více zařízením a zahájit komunikaci. I2C pracuje pouze se dvěma dráty, jmenovitě SDA a SCL. Kde SDA znamená Serial data a SCL znamená Serial Clock. Tyto dva piny však vyžadují pull-up rezistory na úroveň napětí VCC a s odpovídajícím pull-up rezistorem může sběrnice podporovat 127 zařízení s jedinečnou adresou.
Co je komunikační protokol I2C?
Termín IIC znamená „ Inter Integrated Circuits “. Obvykle se na některých místech označuje jako I2C nebo I na druhou C nebo dokonce jako 2vodičový protokol rozhraní (TWI), ale všechno to znamená totéž. I2C je synchronní komunikační protokol, což znamená, že obě zařízení, která sdílejí informace, musí sdílet společný hodinový signál. Má pouze dva vodiče ke sdílení informací, z nichž jeden se používá pro hodinový signál a druhý pro odesílání a příjem dat.
Jak funguje komunikace I2C?
Komunikaci I2C poprvé představil Phillips. Jak již bylo řečeno, má dva vodiče, tyto dva vodiče budou připojeny přes dvě zařízení. Zde se jedno zařízení nazývá master a druhé zařízení slave. Komunikace by měla a vždy proběhne mezi dvěma, Master a Slave. Výhodou komunikace I2C je, že k Master může být připojeno více než jeden slave.
Kompletní komunikace probíhá prostřednictvím těchto dvou vodičů, jmenovitě Serial Clock (SCL) a Serial Data (SDA).
Serial Clock (SCL): Sdílí hodinový signál generovaný nadřízeným s podřízeným
Serial Data (SDA): Sends the data to and from between the Master and slave.
Komunikaci může kdykoli zahájit pouze nadřízený. Protože ve sběrnici je více než jeden slave, musí master odkazovat na každého slave pomocí jiné adresy. Při oslovení odpoví pouze mast s touto konkrétní adresou, zatímco ostatní mlčí. Tímto způsobem můžeme použít stejnou sběrnici ke komunikaci s více zařízeními.
Kde použít komunikaci I2C?
Komunikace I2C se používá pouze pro komunikaci na krátkou vzdálenost. Určitě je do jisté míry spolehlivý, protože má synchronizovaný hodinový puls, aby byl chytrý. Tento protokol se používá hlavně ke komunikaci se senzorem nebo jinými zařízeními, která musí odesílat informace hlavnímu zařízení. Je velmi užitečné, když mikrokontrolér musí komunikovat s mnoha dalšími podřízenými moduly pomocí minimálně pouze vodičů. Pokud hledáte komunikaci na velké vzdálenosti, měli byste vyzkoušet RS232 a pokud hledáte spolehlivější komunikaci, vyzkoušejte protokol SPI.
I2C na Nuvoton N76E003 - Hardwarový požadavek
Protože požadavkem tohoto projektu je naučit se komunikaci I2C pomocí N76E003, použijeme EEPROM, která bude spojena s datovou linkou I2C. Uložíme některá data do EEPROM a také je přečteme a zobrazíme pomocí obrazovky UART.
Protože uložená hodnota bude vytištěna na UART, je vyžadován jakýkoli druh převaděče USB na UART. Můžete si také prohlédnout výukový program o UART s Nuvoton, pokud jste v komunikaci UART na N76E003 noví. Pro naši aplikaci použijeme převodník CP2102 UART na USB. Kromě výše uvedeného požadujeme také následující komponenty -
- EEPROM 24C02
- 2ks 4,7k rezistory
Nemluvě o tom, kromě výše uvedených komponent potřebujeme vývojovou desku založenou na mikrokontroléru N76E003 a programátor Nu-Link. Kromě toho jsou pro připojení všech komponent vyžadovány také nepájivé pole a připojovací vodiče.
Propojení AT24LC64 s Nuvoton N76E003 - Schéma zapojení
Jak vidíme na níže uvedeném schématu, EEPROM je připojena k lince I2C spolu se dvěma pull up odpory. Zcela vlevo je zobrazeno připojení programovacího rozhraní.
Použil jsem prkénko pro IC AT24LC64 a připojil jsem IC k mé desce programátoru nuvoton pomocí propojovacích vodičů. Moje nastavení hardwaru spolu s programátorem nu-ink je uvedeno níže.
Piny I2C na Nuvoton N76E003
Pinový diagram N76E003 je vidět na obrázku níže -
Jak vidíme, každý kolík má jiné specifikace a každý kolík lze použít pro různé účely. Nicméně, pin 1.4 se používá jako kolík I2C SDA, bude to ztratí PWM a další funkce. Ale to není problém, protože pro tento projekt není vyžadována další funkce. Totéž se stane pro P1.3 je SCL pin I2C.
Vzhledem k tomu, že piny I2C fungují jako GPIO, je třeba je nakonfigurovat. Všechny piny GPIO lze konfigurovat v níže popsaném režimu.
Podle datového listu, PxM1.n a PxM2. n jsou dva registry, které se používají k určení řídicí činnosti I / O portu. V datovém listu se uvádí, že pro použití funkce I2C je třeba použít I / O režimy jako Open-drain pro komunikaci související s I2C.
Komunikace I2C v N76E003
Periferní zařízení I2C je důležitá věc pro každou jednotku mikrokontroléru, která podporuje funkce I2C. Mnoho typů různých mikrokontrolérů je vybaveno vestavěnou periferií I2C. V některých případech však lze I2C konfigurovat ručně pomocí softwarového ovládání, kde není k dispozici hardwarová podpora související s I2C (například mnoho mikrokontrolérů 8051). Nuvoton N76E003 však přichází s periferní podporou I2C.
M76E003 podporuje čtyři typy operací v režimech I2C - hlavní vysílač, hlavní přijímač, podřízený vysílač a podřízený přijímač. Podporuje také standardní (100 kb / s) a rychlé (až 400 kb / s) rychlosti pro linku I2C. I2C pracuje s několika obecnými pravidly v signálních vedeních SCL a SDA.
Stav spuštění a zastavení:
V komunikaci I2C je to důležitá věc. Když jsou data přenesena na linku I2C, začíná podmínkou zahájení a končí podmínkou zastavení.
Podmínkou spuštění je přechod z vysoké na nízkou na SDA, když je linka SCL vysoká, a podmínkou zastavení je přechod z nízké na vysokou na SDA, když je linka SCL vysoká. Tyto dvě podmínky generuje hlavní jednotka (MCU nebo cokoli, co ovládá ostatní podřízená zařízení). Sběrnicová linka zůstává v tomto stavu zaneprázdněna, když je spuštěna podmínka spuštění, a zůstává znovu volná, když je aktivována podmínka zastavení.
Podmínky spuštění a zastavení jsou skvěle zobrazeny v perspektivě signálu v datovém listu N76E003 -
7bitová adresa s formátem dat:
N76E003 podporuje 7bitovou adresu a datový formát. Po zahájení podmínky spuštění musí hlavní zařízení odeslat data na linku I2C. První data jsou důležitá. Pokud tato data nebudou správně vytvořena nebo přenesena, připojené zařízení nebude identifikováno a nebude možné navázat další komunikaci.
Data se skládají ze 7bitové adresy slave, označené jako SLA. Tato 7bitová adresa musí být pro každé zařízení jedinečná, pokud je na sběrnici připojeno více zařízení. Po 7bitové adrese je 8. bit bitem směru dat. To znamená, že v závislosti na 8. bitu odešle hlavní jednotka podřízenému zařízení informace o tom, zda budou data zapsána do podřízeného zařízení, nebo budou data přečtena z podřízeného zařízení. 8. bit je bit R / W označovaný jako oznamovač čtení nebo zápisu. Jak všichni víme, 8bitové informace mohou být 128 typů, což podporuje 128 zařízení, ale I2C podporuje 127 typů zařízení na stejné sběrnici, ale ne 128. Protože adresa 0x00 je vyhrazená adresa, která se nazývá obecná adresa volání. Pokud chce hlavní poslat informace do všech zařízení,bude adresovat 0x00 a každé zařízení se bude přehrávat stejným způsobem jako podle jednotlivých softwarových konfigurací.
Přenos dat tedy vypadá níže -
Potvrdit:
Ve výše uvedeném obrázku datové adresy se 9. bit následovaný bitem R / W nazývá potvrzovací bit. Je to důležité, protože pomocí tohoto bitu reaguje master nebo slave na datový vysílač tahem za linku SDA nízko. Pro získání potvrzovacího bitu musí vysílač uvolnit linku SDA.
Programování N76E003 pro komunikaci I2C
Kompletní program použitý v tomto výukovém programu najdete ve spodní části této stránky. Vysvětlení důležitých segmentů v kódu je následující -
Nastavte piny jako Open Drain a nakonfigurujte je pro I2C:
Začněme nejprve s pinovou částí I2C. Jak bylo popsáno výše, porty I2C SCL a SDA je třeba nakonfigurovat a nastavit jako konfiguraci s otevřeným odtokem. K tomu, abychom používáte hlavičkový soubor I2C.h spolu s zdrojový soubor I2C.c . Fragment kódu vypadá takto-
do {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} while (0)
Výše uvedený kód nastavuje P13 a P14 jako pin Open-Drain a clr_I2CPX se používá k výběru P13 a P14 jako SCL pinů na P1.3 a SDA pinů na P1.4.
Tento I2CPX je 0. bit řídicího registru I2C I2CON. Pokud je tato I2C_PX nastavena na 1, změní se piny na P0,2 jako SCL a P1,6 jako SDA. Použijeme však P13 a P14. Zde se nepoužívají alternativní kolíky.
Řídicí registr I2C I2CON:
Řídicí registr I2C I2CON se používá k řízení operací I2C. První bit je bit pro výběr pinů I2C. Nastavením na 0 nakonfigurujete pin I2C jako P13 a P14.
Bit AA je příznakem Potvrzení potvrzení, pokud je nastaven příznak AA, během potvrzovacího hodinového pulzu linky SCL bude vrácen ACK. Pokud je zrušeno, během potvrzeného hodinového pulzu linky SCL bude vrácen NACK (vysoká úroveň na SDA).
Dalším bitem je SI, což je přerušení stavu I2C. Pokud je povoleno přerušení stavu I2C, měl by uživatel zkontrolovat registr I2STAT a určit, který krok byl předán, a měl by provést akci.
STO je příznak STOP nastavený v režimu Master. Jakmile je detekována podmínka STOP, STO se automaticky vymaže hardwarem.
Další bit je bit STA. Pokud je tento příznak nastaven, pak I2C generuje podmínku START, pokud je sběrnice volná. Pokud je sběrnice zaneprázdněna, I2C čeká na podmínku STOP a generuje následující podmínku START. Pokud je nastavena STA, zatímco I2C je již v režimu Master a byl vyslán nebo přijat jeden nebo více bytů, I2C generuje podmínku opakovaného START. Software STA musí být ručně vymazán.
Poslední z nich, I2CEN, je bit pro povolení nebo zakázání sběrnice I2C.
EEPROM 24C02:
Nyní přichází na 24C02. Balíček podpory desky N76E003 má I2C kód pro 24LC64 a lze jej snadno upravit. K pochopení funkce I2C však použijeme jednoduchou metodu.
Pokud někdo chce použít podrobné rozhraní s EEPROM 24C02, může být použit program EEPROM v BSP.
Připojíme pouze 24C02 v I2C, kde N76E003 bude hlavní a EEPROM bude podřízená. Zapíšeme tedy všechna data na adresu EEPROM a přečteme je.
Níže je zobrazen vývod 24C02 EEPROM
A0, A1 a A2 jsou tři piny pro výběr adresy. Piny WP jsou piny chránící proti zápisu a pro povolení zápisu do EEPROM je třeba je připojit k VSS.
Funkce Byte Write je zobrazena na následujícím obrázku -
Celý cyklus zápisu probíhá s počátečním bitem. Poté je třeba odeslat kontrolní bajt. V řídicím bajtu jsou vyžadovány následující věci -
Po startovacím bitu se skládá z adresy slave. 1010 je statická a A0, A1 a A2 jsou adresy založené na hardwarovém připojení. Pokud jsou tři piny připojeny k napájení GND nebo VSS, bude se číst jako 0. V opačném případě se při připojení k VCC bude číst jako 1. V našem případě jsou všechny A0, A1 a A2 připojeny k VSS. Tedy všechny tyto budou 0.
Výdaje na podmínku čtení nebo zápisu. Hodnota adresy s bitem pro čtení nebo zápis bude - 0xA0 pro zápis a 0xA1 pro čtení. Další je bit Acknowledge a poté bude vyslána 8bitová adresa, kde je třeba data uložit, a nakonec data, která budou uložena v příslušném umístění. Tyto věci se provádějí krok za krokem ve formátu hlavní funkce.
Hlavní funkce a smyčka While:
void main (void) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Důležité, použití funkce tisku musí nastavit TI = 1; I2C_init (); while (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n Načtená hodnota je% x", c & 0xff); }; }
Hlavní funkce je jednoduchá, nepřetržitě zapisuje hodnoty do EEPROM na adresu 1 a čte data. Data se poté tisknou pomocí funkce printf. Printf tiskne hodnotu v hexadecimálním formátu.
Funkce zápisu do EEPROM se skládá z následujících věcí, které byly popsány v části EEPROM -
void EEPROM_write (nepodepsaná char adresa, nepodepsaná char hodnota) {I2C_start (); I2C_write (0xA0); I2C_write (adresa); I2C_write (hodnota); I2C_stop (); }
Startovací funkce I2C se skládá z následujících věcí -
void I2C_start (void) {signed int time = timeout; set_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
V této funkci se kontroluje stav SI spolu s předdefinovaným časovým limitem (definovaným v I2C.h, kde je předdefinovaný čas nastaven na 1000). Funkce spuštění začíná nastavením STA a vymazáním SI.
void I2C_stop (void) {signed int time = timeout; clr_SI; set_STO; while ((STO == 1) && (čas> 0)) {čas--; }; }
Stejné jako u funkce Start, stop. Funkce zastavení se inicializuje nastavením STO a následným vymazáním SI. Níže je funkce čtení I2C -
unsigned char I2C_read (unsigned char ack_mode) {signed int time = timeout; hodnota bez znaménka = 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 , jak jsou definovány v záhlaví souboru I2C jako 0 a 1, v daném pořadí.
Podobně je vytvořena funkce zápisu -
void I2C_write (hodnota znaku bez znaménka) {signed int time = timeout; I2DAT = hodnota; clr_STA; clr_SI; while ((SI == 0) && (time> 0)) {time--; }; }
Blikající kód a výstup
Kód vrátil 0 varování a 0 chyb a byl blikán pomocí výchozí metody blikání Keilem. Pokud jste noví, podívejte se na úvodní výukový program nuvoton, abyste pochopili, jak nahrát kód. Informace o kompilaci kódu naleznete níže.
Sestavte cíl 'I2C_EEPROM' kompilace I2C_EEPROM.c… kompilace I2C.c… propojení… Velikost programu: data = 59,2 xdata = 0 kód = 2409 vytváření hexadecimálního souboru z ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 Chyba (y), 0 Varování (y). Uplynulý čas sestavení: 00:00:04 Souhrn dávkového sestavení: 1 úspěšné, 0 neúspěšné, 0 přeskočené - uplynulý čas: 00:00:04
Hardware se nastavuje na prkénku a pracuje podle očekávání. Jak vidíte na obrázku níže, byli jsme schopni napsat hodnotu na EEPROM a přečíst ji zpět z paměti a zobrazit ji na sériovém monitoru.
Podívejte se na níže uvedené video, kde najdete kompletní ukázku fungování desky pro tento kód. Doufám, že se vám výukový program líbil a naučili se něco užitečného, pokud máte nějaké dotazy, a nechte je v sekci komentářů níže. Můžete také použít naše fóra k odeslání dalších technických otázek.