- Čo je komunikačný protokol I2C?
- Ako funguje komunikácia I2C?
- Kde využiť komunikáciu I2C?
- I2C s PIC16F877a pomocou kompilátora XC8
- Programovanie pomocou hlavičkových súborov I2C:
- Simulácia proteínu:
Mikrokontroléry PIC sú výkonnou platformou poskytovanou mikročipom pre vložené projekty. Vďaka svojej všestrannej povahe bolo možné nájsť cesty k mnohým aplikáciám a fáza stále pokračuje. Ak ste sledovali naše výukové programy PIC, určite by ste si všimli, že sme už prebrali široké spektrum výukových programov o mikrokontroléri PIC, počnúc od úplných základov. Od tejto chvíle sme prebrali základné informácie, ktoré môžeme dostať k zaujímavejším veciam, ako je komunikačný portál.
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 na zdieľanie informácií, existuje mnoho 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.
Č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 na signál kohútika a druhý 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 vždy bude prebiehať 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í zostanú stáť. Týmto spôsobom môžeme použiť rovnakú zbernicu na komunikáciu s viacerými zariadeniami.
Kde využiť 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 veľké vzdialenosti, mali by ste vyskúšať RS232 a ak hľadáte spoľahlivejšiu komunikáciu, vyskúšajte protokol SPI.
I2C s PIC16F877a pomocou kompilátora XC8
Dosť bolo úvodov, poďme do toho a naučme sa, ako môžeme použiť mikrokontrolér na vykonávanie komunikácie I2C. Než začneme objasňovať, že tento tutoriál hovorí iba o I2C v PIC16F877a pomocou kompilátora XC8, bude proces rovnaký pre ostatné mikrokontroléry, ale môžu byť potrebné mierne zmeny. Pamätajte tiež, že pre pokročilé mikrokontroléry, ako je séria PIC18F, môže mať kompilátor vlastnú knižnicu zabudovanú do funkcií I2C, ale pre PIC16F877A nič také neexistuje, takže si ju postavme sami. Tu vysvetlená knižnica bude uvedená ako hlavičkový súbor na stiahnutie v spodnej časti, ktorý je možné použiť pre PIC16F877A na komunikáciu s inými zariadeniami I2C.
Najlepším miestom na začatie všetkého je vždy náš technický list. Vyhľadajte podrobnosti o I2C v údajovom liste a skontrolujte, ktoré registre je potrebné nakonfigurovať. Nebudem podrobne vysvetľovať, pretože údajový list to už urobil za vás. Ďalej v texte vysvetlím rôzne funkcie v hlavičkovom súbore a ich zodpovednosť v programe.
void I2C_Initialize ()
Inicializačná funkcia slúži na to, aby sme mikrokontroléru povedali, že použijeme protokol I2C. To je možné vykonať nastavením požadovaných bitov v registri SSPCON a SSPCON2. Prvým krokom by bolo deklarovať piny IIC ako vstupné piny, tu by sa mali pre komunikáciu I2C použiť piny RC3 a RC4, takže ich deklarujeme ako vstupné piny. Ďalej by sme mali nastaviť SSPCON a SSPCON2, čo sú riadiace registre MSSP. Prevádzkujeme PIC v hlavnom režime IIC s frekvenciou hodín FOSC / (4 * (SSPADD + 1)). Ak chcete pochopiť, prečo je konkrétny register nastavený týmto spôsobom, pozrite si čísla strán v údajovom hárku uvedené v riadkoch komentárov nižšie.
Ďalej teda musíme nastaviť frekvenciu hodín, frekvencia hodín pre rôzne aplikácie sa môže líšiť, preto dostaneme výber od používateľa prostredníctvom premennej feq_k a použijeme ju v našich vzorcoch na nastavenie registra SSPADD.
void I2C_Initialize (const unsigned long feq_K) // Začať IIC ako hlavný { TRISC3 = 1; TRISC4 = 1; // Nastaviť piny SDA a SCL ako vstupné piny SSPCON = 0b00101000; // pg84 / 234 SSPCON2 = 0b00000000; // pg85 / 234 SSPADD = (_XTAL_FREQ / (4 * feq_K * 100)) - 1; // Nastavenie rýchlosti hodín pg99 / 234 SSPSTAT = 0b00000000; // str.83 / 234 }
Zrušiť I2C_Hold ()
Ďalšou dôležitou funkciou je funkcia I2C_hold, ktorá slúži na zadržanie vykonania zariadenia, kým nie je dokončená aktuálna operácia I2C. Pred začatím akejkoľvek novej operácie by sme museli skontrolovať, či sa operácie I2C musia zadržať. To je možné vykonať kontrolou registrov SSPSTAT a SSPCON2. SSPSTAT obsahuje informácie o stave zbernice I2C.
Program sa môže zdať trochu komplikovaný, pretože obsahuje operátory „a“ a „alebo“. Keď to rozbiješ ako
SSPSTAT a 0b00000100 SSPCON2 a 0b00011111
Zloženie: 100% bavlna.
To znamená, že sa ubezpečujeme , že 2. bit na SSPSTAT je nula a podobne bity od 0 do 4 sú na SSPCON2 nulové. Potom všetky tieto hodnoty skombinujeme a skontrolujeme, či je výsledok nulový. V prípade, že výsledok je nula, program bude pokračovať, ak nie, bude tam držať až sa dostane na nulu, pretože sa používa vo chvíli slučky.
void I2C_Hold () { while ((SSPCON2 & 0b00011111) - (SSPSTAT & 0b00000100)); // skontrolujte toto v registroch a uistite sa, že IIC neprebieha }
Zrušiť I2C_Begin () a zrušiť I2C_End ()
Zakaždým, keď zapisujeme alebo čítame akékoľvek údaje pomocou zbernice I2C, mali by sme začať a ukončiť pripojenie I2C. Na začatie I2C komunikácie musíme nastaviť bit SEN a na ukončenie komunikácie musíme nastaviť stavový bit PEN. Pred prepnutím niektorého z týchto bitov by sme tiež mali skontrolovať, či je zbernica I2C zaneprázdnená pomocou funkcie I2C_Hold, ako je uvedené vyššie.
void I2C_Begin () { I2C_Hold (); // Hold program is I2C is busy SEN = 1; // Begin IIC pg85 / 234 } void I2C_End () { I2C_Hold (); // Hold program is I2C is busy PEN = 1; // Koniec IIC str. 85/234 }
Zrušiť I2C_Write ()
Funkcia zápisu sa používa na zasielanie akýchkoľvek údajov z hlavného modulu do salve modulu. Táto funkcia sa zvyčajne používa po funkcii začiatku I2C a za ňou nasleduje funkcia konca I2C. Dáta, ktoré sa musia zapísať na zbernicu IIC, prechádzajú cez premenné údaje. Tieto údaje sa potom načítajú do registra vyrovnávacej pamäte SSPBUF, aby sa poslali cez zbernicu I2C.
Normálne pred zápisom údajov bude napísaná adresa, takže budete musieť použiť funkciu zápisu dvakrát, raz pre nastavenie adresy a druhýkrát pre odoslanie skutočných údajov.
void I2C_Write (nepodpísané údaje) { I2C_Hold (); // Hold program is I2C is busy SSPBUF = data; // str82 / 234 }
nepodpísaný krátky I2C_Read ()
Poslednou funkciou, o ktorej musíme vedieť, je funkcia I2C_Read . Táto funkcia sa používa na načítanie údajov, ktoré sa práve nachádzajú na zbernici I2C. Používa sa po požiadaní otroka, aby do zbernice zapísal určitú hodnotu. Prijatá hodnota bude v SSPBUF, ktorý môžeme previesť do akejkoľvek premennej pre našu operáciu.
Počas komunikácie I2C pošle podriadený po odoslaní údajov požadovaných nadriadeným ďalší bit, ktorým je potvrdzovací bit. Tento bit by mal skontrolovať aj nadriadený, aby sa ubezpečil, že komunikácia bola úspešná. Po skontrolovaní potvrdenia bitu ACKDT by sa malo povoliť nastavením bitu ACKEN.
unsigned short I2C_Read (unsigned short ack) { unsigned short incoming; I2C_Hold (); RCEN = 1; I2C_Hold (); prichádzajúce = SSPBUF; // získa dáta uložené v SSPBUF I2C_Hold (); ACKDT = (ack)? 0: 1; // skontroluje, či bol prijatý ack bit ACKEN = 1; // str. 85/234 návrat prichádzajúci; }
To znamená, že tieto funkcie by mali stačiť na nastavenie komunikácie I2C a zápis alebo čítanie údajov zo zariadenia. Upozorňujeme tiež, že existuje veľa ďalších funkcií, ktoré môže komunikácia I2C vykonávať, ale kvôli zjednodušeniu ich tu nebudeme rozoberať. Môžete sa kedykoľvek obrátiť na list s údajmi, aby ste zistili úplné fungovanie súboru
Celý kód so súborom hlavičky pre komunikáciu PIC16F877A I2C je možné stiahnuť z odkazu.
Programovanie pomocou hlavičkových súborov I2C:
Teraz, keď sme sa naučili, ako funguje komunikácia I2C a ako môžeme použiť pre ňu vytvorený hlavičkový súbor, urobme si jednoduchý program, v ktorom použijeme hlavičkový súbor a zapíšeme nejaké hodnoty do riadkov I2C. Tento program potom simulujeme a skontrolujeme, či sa tieto hodnoty zapisujú na zbernicu.
Ako vždy program začína nastavením konfiguračných bitov a nastavením taktovacej frekvencie na 20 MHz, ako je uvedené nižšie
#pragma config FOSC = HS // Bity výberu oscilátora (HS oscilátor) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT deaktivovaný) #pragma config PWRTE = ON // Power Timer Enable bit (PWRT enabled) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 je digitálny I / O, HV zapnutý Na programovanie je potrebné použiť MCLR) #pragma config CPD = OFF // bit ochrany kódu pamäte EEPROM dát (ochrana kódu EEPROM dát vypnutá) #pragma config WRT = OFF // zapisovanie do pamäte Flash programu Povolenie bitov (ochrana proti zápisu vypnutá; všetka pamäť programu) možno zapísať do kontroly EECON) #pragma config CP = OFF // Bit kódu ochrany kódu pamäte programu (ochrana kódu vypnutá) #define _XTAL_FREQ 20000000
Ďalším krokom by bolo pridanie hlavičkového súboru, o ktorom sme práve hovorili. Hlavičkový súbor má názov PIC16F877a_I2C.h a je možné ho stiahnuť z odkazu, o ktorom sme hovorili vyššie. Uistite sa, že je súbor hlavičky pridaný do súboru hlavičky vášho zoznamu projektov, štruktúra vášho súboru projektu by mala vyzerať takto
Po skontrolovaní, či je súbor hlavičky pridaný do súboru projektu, vložte súbor hlavičky do hlavného súboru C.
#include
Vo vnútri while cyklu začneme I2C komunikáciu zapisovať niekoľko náhodných hodnôt na I2C zbernicu a potom ukončiť I2C komunikáciu. Náhodné hodnoty, ktoré som vybral, sú D0, 88 a FF. Môžete zadať ľubovoľné požadované hodnoty. Pamätajte však na tieto hodnoty, keď ich budeme overovať v našej simulácii.
while (1) { I2C_Begin (); I2C_Write (0xD0); I2C_Write (0x88); I2C_Write (0xFF); I2C_End (); __delay_ms (1000); }
Kompletný program možno nájsť v dolnej časti stránky, môžete použiť to, alebo si stiahnuť kompletný súbor ZIP programu odtiaľ. Po získaní programu ho skompilujte a pripravte sa na simuláciu.
Simulácia proteínu:
Proteus má pekný nástroj s názvom I2C debugger, ktorý je možné použiť na čítanie údajov na zbernici I2C. Vytvorme teda pomocou neho obvod a skontrolujte, či sa údaje úspešne zapisujú. Kompletná schéma zapojenia je uvedená nižšie
Načítajte hexadecimálny súbor, ktorý vygeneroval náš program, dvojitým kliknutím na mikrokontrolér. Potom simulujte program. Všimnete si vyskakovacie okno, ktoré by zobrazovalo všetky informácie o zbernici I2C. Okno pre náš program je zobrazené nižšie.
Ak sa podrobne pozriete na zapisované údaje, môžete si všimnúť, že sú rovnaké, ako sme ich napísali v našom programe. Hodnoty sú D0, 88 a FF. Hodnoty sa zapisujú každú 1 sekundu, takže čas sa tiež aktualizuje, ako je uvedené nižšie. Modrá šípka označuje, že je napísaný od pána k otrokovi, ktorý by smeroval opačným smerom, ak by to bolo inak. Bližší pohľad na odosielané údaje je uvedený nižšie.
Toto je iba letmý pohľad na to, čo dokáže I2C, dokáže tiež čítať a zapisovať údaje do viacerých zariadení. Viac o I2C si priblížime v našich pripravovaných tutoriáloch prepojením rôznych modulov, ktoré pracujú s protokolom I2C.
Dúfam, že ste projektu porozumeli a dozvedeli ste sa z neho niečo užitočné. Ak máte pochybnosti, pošlite ich do sekcie komentárov nižšie alebo použite technickú pomoc na fórach.
Celý kód je uvedený nižšie; odtiaľto si môžete stiahnuť hlavičkové súbory so všetkým kódom.