- Co je komunikační protokol I2C?
- Jak funguje komunikace I2C?
- Kde použít komunikaci I2C?
- I2C s PIC16F877a pomocí kompilátoru XC8
- Programování pomocí hlavičkových souborů I2C:
- Simulace Proteus:
Mikrokontroléry PIC jsou výkonnou platformou poskytovanou mikročipem pro vestavěné projekty, díky své univerzální povaze je možné najít cesty do mnoha aplikací a fáze stále pokračuje. Pokud jste sledovali naše výukové programy PIC, pak byste si všimli, že jsme již pokryli širokou škálu výukových programů pro mikrokontrolér PIC, počínaje samotnými základy. Od té doby jsme se zabývali základy, které můžeme dostat do zajímavějších věcí, jako je komunikační portál.
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é době musí komunikovat s jinými zařízeními za účelem sdílení informací, existuje mnoho různých typů komunikačních protokolů pro 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.
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 kohoutkový 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á hlavní a druhé zařízení se nazývá 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 zpět s informacemi, zatímco ostatní budou pokračovat. 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 velkou vzdálenost, měli byste zkusit RS232 a pokud hledáte spolehlivější komunikaci, zkuste použít protokol SPI.
I2C s PIC16F877a pomocí kompilátoru XC8
Dost představování, pojďme se do toho pustit a naučit se, jak můžeme použít mikrokontrolér pro provádění komunikace I2C. Než začneme, ujasněte si, že tento výukový program hovoří pouze o I2C v PIC16F877a pomocí kompilátoru XC8, proces bude stejný pro ostatní mikrokontroléry, ale mohou být vyžadovány drobné změny. Pamatujte také, že pro pokročilé mikrokontroléry, jako je řada PIC18F, může mít kompilátor vlastní vestavěnou knihovnu pro použití funkcí I2C, ale pro PIC16F877A nic podobného neexistuje, takže si ji vytvořme sami. Zde vysvětlená knihovna bude uvedena jako soubor záhlaví ke stažení ve spodní části, který lze použít pro PIC16F877A ke komunikaci s jinými zařízeními I2C.
Nejlepším místem k zahájení čehokoli je vždy náš datový list. Podívejte se na podrobnosti o I2C v datovém listu a zkontrolujte, které registry je třeba nakonfigurovat. Nebudu podrobně vysvětlovat, protože datový list to pro vás již udělal. Dále níže vysvětlím různé funkce přítomné v hlavičkovém souboru a jejich odpovědnost v programu.
void I2C_Initialize ()
Funkce initialize slouží k tomu, aby mikrokontrolér řekl, že použijeme protokol I2C. Toho lze dosáhnout nastavením požadovaných bitů v registru SSPCON a SSPCON2. Prvním krokem by bylo deklarovat piny IIC jako vstupní piny, zde by se pro komunikaci I2C měly používat piny RC3 a RC4, takže je deklarujeme jako vstupní piny. Dále bychom měli nastavit SSPCON a SSPCON2, což jsou kontrolní registry MSSP. PIC provozujeme v režimu IIC master s taktovací frekvencí FOSC / (4 * (SSPADD + 1)). Chcete-li pochopit, proč je daný registr nastaven tímto způsobem, přečtěte si čísla stránek v datovém listu uvedená v řádcích komentářů níže.
Takže dále musíme nastavit taktovací frekvenci, taktovací frekvence pro různé aplikace se může lišit, proto dostaneme volbu od uživatele prostřednictvím proměnné feq_k a použijeme ji v našich vzorcích k nastavení registru SSPADD.
void I2C_Initialize (const unsigned long feq_K) // Začněte IIC jako master { TRISC3 = 1; TRISC4 = 1; // Nastavit piny SDA a SCL jako vstupní piny SSPCON = 0b00101000; // pg84 / 234 SSPCON2 = 0b00000000; // pg85 / 234 SSPADD = (_XTAL_FREQ / (4 * feq_K * 100)) - 1; // Nastavení rychlosti hodin pg99 / 234 SSPSTAT = 0b00000000; // pg83 / 234 }
Zrušit I2C_Hold ()
Další důležitou funkcí je funkce I2C_hold, která slouží k pozastavení provádění zařízení, dokud není dokončena aktuální operace I2C. Před zahájením jakékoli nové operace bychom museli zkontrolovat, zda musí být operace I2C zadrženy. Toho lze dosáhnout kontrolou registrů SSPSTAT a SSPCON2. SSPSTAT obsahuje informace o stavu sběrnice I2C.
Program se může zdát trochu komplikovaný, protože zahrnuje operátory „a“ a „nebo“. Když to rozbiješ jako
SSPSTAT a 0b00000100 SSPCON2 a 0b00011111
Zloženie: 100% bavlna.
To znamená, že se ujistíme , že 2. bit na SSPSTAT je nula a podobně bity od 0 do 4 jsou na SSPCON2 nulové. Potom vše spojíme, abychom zkontrolovali, že výsledek je nula. Pokud je výsledek nula, program bude pokračovat, pokud ne, bude tam držet, dokud nezíská nulu, protože se používá ve smyčce while .
void I2C_Hold () { while ((SSPCON2 & 0b00011111) - (SSPSTAT & 0b00000100)); // zkontrolujte toto v registrech a ujistěte se, že IIC neprobíhá }
Zrušit I2C_Begin () a zrušit I2C_End ()
Pokaždé, když zapisujeme nebo čteme libovolná data pomocí sběrnice I2C, měli bychom začít a ukončit připojení I2C. Pro zahájení komunikace I2C musíme nastavit bit SEN a pro ukončení komunikace musíme nastavit stavový bit PEN. Před přepnutím kteréhokoli z těchto bitů bychom měli také zkontrolovat, zda je sběrnice I2C zaneprázdněna pomocí funkce I2C_Hold, jak je popsáno výše.
void I2C_Begin () { I2C_Hold (); // Přidržet program je I2C zaneprázdněn SEN = 1; // Begin IIC pg85 / 234 } void I2C_End () { I2C_Hold (); // Přidržet program je I2C je zaneprázdněn PEN = 1; // Konec IIC pg85 / 234 }
Zrušit I2C_Write ()
Funkce zápisu se používá k odesílání jakýchkoli dat z hlavního modulu do salve modulu. Tato funkce se obvykle používá po zahájení funkce I2C a je následována funkcí ukončení I2C. Data, která je třeba zapsat na sběrnici IIC, jsou předávána proměnnými daty. Tato data se poté načtou do vyrovnávací paměti SSPBUF a odešlou se po sběrnici I2C.
Normálně před zápisem dat bude zapsána adresa, takže budete muset použít funkci zápisu dvakrát, jednou pro nastavení adresy a druhou pro zaslání skutečných dat.
void I2C_Write (nepodepsaná data) { I2C_Hold (); // Hold the program is I2C is busy SSPBUF = data; // pg82 / 234 }
nepodepsaný krátký I2C_Read ()
Poslední funkcí, o které musíme vědět, je funkce I2C_Read . Tato funkce se používá ke čtení dat, která jsou aktuálně na sběrnici I2C. Používá se po požadavku, aby slave zapisoval nějakou hodnotu na sběrnici. Hodnota, která je přijata, bude v SSPBUF, kterou můžeme převést na jakoukoli proměnnou pro naši operaci.
Během komunikace I2C pošle slave po odeslání dat požadovaných Masterem další bit, kterým je potvrzovací bit, tento bit by měl také zkontrolovat Master, aby se ujistil, že komunikace byla úspěšná. Po kontrole potvrzení bitu ACKDT by mělo být povoleno nastavením bitu ACKEN.
unsigned short I2C_Read (unsigned short ack) { unsigned short incoming; I2C_Hold (); RCEN = 1; I2C_Hold (); příchozí = SSPBUF; // načíst data uložená v SSPBUF I2C_Hold (); ACKDT = (ack)? 0: 1; // zkontrolovat, zda ack bit přijal ACKEN = 1; // str. 85/234 návrat příchozí; }
To je vše, tyto funkce by měly stačit k nastavení komunikace I2C a zápisu nebo čtení dat ze zařízení. Všimněte si také, že existuje mnoho dalších funkcí, které může komunikace I2C provádět, ale kvůli jednoduchosti o nich zde nebudeme diskutovat. Vždy se můžete obrátit na datový list, abyste věděli o úplném fungování souboru
Celý kód se souborem záhlaví pro komunikaci PIC16F877A I2C lze stáhnout z odkazu.
Programování pomocí hlavičkových souborů I2C:
Nyní, když jsme se naučili, jak funguje komunikace I2C a jak můžeme použít pro ni vytvořený hlavičkový soubor, vytvořme si jednoduchý program, ve kterém použijeme hlavičkový soubor a zapíšeme některé hodnoty na řádky I2C. Poté tento program simulujeme a zkontrolujeme, zda se tyto hodnoty zapisují na sběrnici.
Program jako vždy začíná nastavením konfiguračních bitů a nastavením taktovací frekvence na 20 MHz, jak je uvedeno níže
#pragma config FOSC = HS // Oscilátory pro výběr bitů (HS oscilátor) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT deaktivován) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR povoleno) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 je digitální I / O, HV zapnuto K programování je nutné použít MCLR) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code Protection off) #pragma config WRT = OFF // Flash Program Memory Write Povolení bitů (ochrana proti zápisu vypnuta; veškerá paměť programu) lze zapsat do kontroly EECON) #pragma config CP = OFF // Bit kódu ochrany kódu paměti programu (ochrana kódu vypnuta) #define _XTAL_FREQ 20000000
Dalším krokem by bylo přidání souboru záhlaví, o kterém jsme právě hovořili. Soubor záhlaví je pojmenován jako PIC16F877a_I2C.h a lze jej stáhnout z odkazu, o kterém jsme diskutovali výše. Ujistěte se, že je soubor záhlaví přidán do souboru záhlaví vašeho seznamu projektů, struktura souboru projektu by měla vypadat takto
Poté, co se ujistíte, že je soubor záhlaví přidán do souboru projektu, zahrňte soubor záhlaví do hlavního souboru C.
#zahrnout
Uvnitř smyčky while začneme I2C komunikaci zapisovat několik náhodných hodnot na sběrnici I2C a poté ukončit I2C komunikaci. Náhodné hodnoty, které jsem vybral, jsou D0, 88 a FF. Můžete zadat libovolné požadované hodnoty. Ale pamatujte na tyto hodnoty, protože je budeme ověřovat v naší simulaci.
while (1) { I2C_Begin (); I2C_Write (0xD0); I2C_Write (0x88); I2C_Write (0xFF); I2C_End (); __delay_ms (1000); }
Kompletní program lze nalézt v dolní části stránky, můžete použít to, nebo si stáhnout kompletní soubor ZIP programu odtud. Po získání programu jej zkompilujte a připravte se na simulaci.
Simulace Proteus:
Proteus má pěkný nástroj s názvem I2C debugger, který lze použít ke čtení dat na sběrnici I2C, tak si pomocí něj vytvořme obvod a zkontrolujte, zda se data úspěšně zapisují. Kompletní schéma zapojení je uvedeno níže
Načtěte hexadecimální soubor, který byl vygenerován naším programem, dvojitým kliknutím na mikrokontrolér. Poté simulujte program. Všimnete si vyskakovacího okna, které zobrazí všechny informace o sběrnici I2C. Okno pro náš program je uvedeno níže.
Pokud se podrobně podíváte na zapisovaná data, můžete si všimnout, že jsou stejná jako ta, která jsme napsali v našem programu. Hodnoty jsou D0, 88 a FF. Hodnoty se zapisují každou 1 s, takže čas se také aktualizuje, jak je znázorněno níže. Modrá šipka označuje, že je zapsán od pána k otrokovi, pokud by jinak, směřoval opačným směrem. Bližší pohled na odesílaná data je uveden níže.
Toto je jen letmý pohled na to, co I2C dokáže, dokáže také číst a zapisovat data na více zařízení. Více o I2C pojednáme v našich nadcházejících cvičeních propojením různých modulů, které fungují s protokolem I2C.
Doufám, že jste projektu porozuměli a naučili se z něj něco užitečného. Máte-li jakékoli pochybnosti, pošlete je do sekce komentářů níže nebo použijte technickou podporu ve fórech.
Kompletní kód byl uveden níže; odtud si můžete stáhnout hlavičkové soubory se všemi kódy.