- Mi az I2C kommunikációs protokoll?
- Hogyan működik az I2C Communication?
- Hol használható az I2C kommunikáció?
- I2C és PIC16F877a az XC8 fordító segítségével
- Programozás az I2C fejlécfájlok használatával:
- Proteus szimuláció:
A PIC mikrokontrollerek a mikrochip által biztosított hatékony platformok a beágyazott projektek számára. Sokoldalú jellege miatt számos alkalmazás megtalálható, és a fázis még mindig tart. Ha követte a PIC oktatóprogramjainkat, akkor észrevette volna, hogy a PIC mikrovezérlő oktatóinak széles skáláját már lefedtük, az alapoktól kezdve. Azóta áttekintettük azokat az alapokat, amelyekkel még érdekesebb dolgokba keveredhetünk, például a kommunikációs portálba.
A beágyazott alkalmazások hatalmas rendszerében egyetlen mikrokontroller sem képes az összes tevékenységet egyedül végrehajtani. Bizonyos időszakokban kommunikálnia kell más eszközökkel az információk megosztása érdekében, sokféle kommunikációs protokoll létezik ezeknek az információknak a megosztására, de a leggyakrabban használtak az USART, IIC, SPI és CAN. Minden kommunikációs protokollnak megvan a maga előnye és hátránya. Koncentráljunk most az IIC részre, mivel ezt fogjuk megtanulni ebben az oktatóanyagban.
Mi az I2C kommunikációs protokoll?
Az IIC kifejezés az „ Inter integrált áramköröket ” jelenti. Általában I2C vagy I négyzetként jelöljük, vagy helyenként 2 vezetékes interfész protokollként (TWI) jelöljük, de mindez ugyanazt jelenti. Az I2C egy szinkron kommunikációs protokoll, vagyis mindkét információt megosztó eszköznek közös órajelet kell használnia. Csak két vezetékkel rendelkezik az információk megosztásához, amelyek közül az egyik a kakasjelre, a másik az adatok küldésére és fogadására szolgál.
Hogyan működik az I2C Communication?
Az I2C kommunikációt először Phillips vezette be. Mint korábban említettük, két huzallal rendelkezik, ezt a két vezetéket két eszközön fogják összekötni. Itt az egyik eszközt masternek, a másikat pedig slave-nek hívják. A kommunikációnak mindig két mester és egy rabszolga között kell történnie és meg kell történnie. Az I2C kommunikáció előnye, hogy egy masterhez több slave is csatlakoztatható.
A teljes kommunikáció ezen a két vezetéken, nevezetesen a soros órán (SCL) és a soros adaton (SDA) keresztül zajlik.
Soros óra (SCL): Megosztja a master által generált órajelet a slave-lel
Soros adatok (SDA): Az adatokat elküldi a Master és a Slave között és között.
A kommunikációt bármikor csak a mester kezdeményezheti. Mivel egynél több slave van a buszon, a masternek minden egyes slave-re külön címet kell használnia. Ha megcímezik, csak az adott címmel rendelkező salve válaszol vissza az információval, míg a többiek folyamatosan kilépnek. Így ugyanazt a buszt használhatjuk több eszközzel való kommunikációhoz.
Hol használható az I2C kommunikáció?
Az I2C kommunikációt csak rövid távú kommunikációra használják. Bizonyos mértékben megbízható, mivel szinkronizált impulzusokkal rendelkezik, hogy okos legyen. Ezt a protokollt főleg szenzorokkal vagy más eszközökkel való kommunikációra használják, amelyeknek információkat kell eljuttatniuk a masterhez. Nagyon hasznos, ha a mikrovezérlőnek sok más szolga modullal kell kommunikálnia, minimum csak vezetékeket használva. Ha nagy hatótávolságú kommunikációra vágyik, próbálja ki az RS232-et, és ha megbízhatóbb kommunikációt szeretne, akkor próbálja ki az SPI protokollt.
I2C és PIC16F877a az XC8 fordító segítségével
Elég a bevezetésekből, engedjünk bele, és megtanuljuk, hogyan használhatunk mikrokontrollert az I2C kommunikáció végrehajtására. Mielőtt elkezdenénk tisztázni, hogy ez az oktatóanyag csak az I2C- ről beszél a PIC16F877a-ban az XC8 fordító segítségével, a folyamat ugyanaz lesz a többi mikrovezérlő esetében is, de szükség lehet némi változtatásokra. Ne felejtsük el, hogy az olyan fejlett mikrovezérlőknél, mint a PIC18F sorozat, maga a fordító is beépíthet valamilyen könyvtárat az I2C funkcióinak használatához, de a PIC16F877A esetében semmi hasonló nem létezik, ezért készítsünk egyet magunkról. Az itt ismertetett könyvtár fejlécfájlként lesz letöltve alul, amelyet a PIC16F877A használhat más I2C eszközökkel való kommunikációhoz.
Mint mindig, a legjobb hely a kezdéshez az adatlapunk. Keresse meg az I2C részleteit az adatlapon, és ellenőrizze, hogy mely regisztereket kell konfigurálni. Nem részletezem részletesen, mivel az adatlap már megtette ezt az Ön számára. Az alábbiakban elmagyarázom a fejlécfájlban található különféle funkciókat és azok felelősségét a programban.
void I2C_Initialize ()
Az inicializáló funkció segítségével elmondható a mikrovezérlőnek, hogy az I2C protokollt fogjuk használni. Ez úgy érhető el, hogy beállítja a szükséges biteket az SSPCON és SSPCON2 regiszterbe. Az első lépés az IIC csapok deklarálása bemeneti csapokká, itt az RC3 és RC4 érintkezőket kell használni az I2C kommunikációhoz, így ezeket bemeneti csapoknak deklaráljuk. Ezután be kell állítanunk az SSPCON-ot és az SSPCON2-t, amely egy MSSP vezérlő regiszter. A PIC-et IIC master módban működtetjük FOSC / (4 * (SSPADD + 1)) órajel-frekvenciával. Olvassa el az alábbi megjegyzési sorokban említett adatlap oldalszámait annak megértéséhez, hogy az adott regiszter miért van így beállítva.
Tehát ezután be kell állítanunk az órajel frekvenciáját, a különféle alkalmazások órajelének frekvenciája változhat, ezért a felhasználótól a feq_k változón keresztül választunk, és a képleteinkben használjuk az SSPADD regiszter beállításához.
void I2C_Initialize (const unsigned long feq_K) // Kezdje a IIC-t mint master { TRISC3 = 1; TRISC4 = 1; // SDA és SCL csapok beállítása bemeneti csapokként SSPCON = 0b00101000; // pg84 / 234 SSPCON2 = 0b00000000; // pg85 / 234 SSPADD = (_XTAL_FREQ / (4 * feq_K * 100)) - 1; // Az óra sebességének beállítása pg99 / 234 SSPSTAT = 0b00000000; // pg83 / 234 }
Érvénytelen I2C_Hold ()
A következő fontos funkció az I2C_hold függvény, amely az eszköz végrehajtásának megtartására szolgál az aktuális I2C művelet befejezéséig. Minden új művelet megkezdése előtt ellenőriznünk kell, hogy az I2C műveleteket meg kell-e tartani. Ezt az SSPSTAT és az SSPCON2 regiszter ellenőrzésével lehet megtenni. Az SSPSTAT tartalmazza az I2C busz állapotáról szóló információkat.
A program kissé bonyolultnak tűnhet, mivel magában foglal egy „és” és egy „vagy” operátort. Amikor úgy törik össze
SSPSTAT és 0b00000100 SSPCON2 és 0b00011111
A
Ez azt jelenti, hogy megbizonyosodunk arról, hogy az SSPSTAT második bitje nulla, és hasonlóan a 0 és 4 közötti bit nulla az SSPCON2-n. Ezután ezeket összesítve ellenőrizzük, hogy az eredmény nulla. Ha az eredmény nulla a program folytatódik, ha nem akkor tartsa ott, amíg nem lesz nulla, mert használják a közben hurok.
void I2C_Hold () { while ((SSPCON2 & 0b00011111) - (SSPSTAT & 0b00000100)); // ellenőrizze ezt a regisztereken, hogy megbizonyosodjon arról, hogy az IIC nincs folyamatban }
Érvénytelen I2C_Begin () és érvénytelen I2C_End ()
Minden alkalommal, amikor bármilyen adatot írunk vagy olvasunk az I2C busz segítségével, el kell kezdeni és le kell állítani az I2C kapcsolatot. Az I2C kommunikáció megkezdéséhez be kell állítanunk a SEN bitet, és a kommunikáció befejezéséhez be kell állítanunk a PEN állapotbitet. Ezen bitek bármelyikének átváltása előtt azt is ellenőriznünk kell, hogy az I2C busz foglalt-e, az I2C_Hold függvény használatával, a fentiek szerint.
érvénytelen I2C_Begin () { I2C_Hold (); // Tartsa a programot, amikor az I2C foglalt SEN = 1; // Begin IIC pg85 / 234 } void I2C_End () { I2C_Hold (); // Tartsa a programot, amikor az I2C foglalt PEN = 1; // IIC vége pg85 / 234 }
Érvénytelen I2C_Write ()
Az írási funkcióval bármilyen adat elküldhető a master modulból a salve modulba. Ezt a funkciót általában az I2C start funkció után használják, majd egy I2C End funkció követi. A IIC buszra írandó adatokat a változó adatokon keresztül továbbítják. Ezeket az adatokat ezután betölti az SSPBUF pufferregiszterbe, hogy elküldje azokat az I2C buszon.
Általában az adatok megírása előtt egy címet írnak, így kétszer kell használni az írási funkciót, egyszer a cím beállításához, a másik alkalommal pedig a tényleges adatok küldéséhez.
void I2C_Write (aláíratlan adatok) { I2C_Hold (); // Tartsa a programot, az I2C foglalt SSPBUF = adatok; // pg82 / 234 }
aláíratlan rövid I2C_Read ()
Az utolsó függvény, amelyről tudnunk kell, az I2C_Read függvény. Ezzel a funkcióval leolvashatók az I2C buszon lévő adatok. Azután használják, hogy rabszolgát kérjen valamilyen érték írására a buszra. A kapott érték az SSPBUF- ben lesz, ezt az értéket bármelyik változóba átvihetjük a működésünk érdekében.
I2C kommunikáció során a rabszolga a mester által kért adatok elküldése után küld egy másik bitet, amely a nyugtázási bit, ezt a bitet is ellenőriznie kell a masternek, hogy megbizonyosodjon a kommunikáció sikeresről. Miután ellenőrizte az ACKDT bit nyugtázását, engedélyezni kell az ACKEN bit beállításával.
unsigned short I2C_Read (unsigned short ack) { aláíratlan rövid bejövő; I2C_Hold (); RCEN = 1; I2C_Hold (); bejövő = SSPBUF; // az SSPBUF I2C_Hold () fájlba mentett adatok lekérése; ACKDT = (ack) a 0: 1; // ellenőrizze, hogy kapott-e ack bit ACKEN = 1; // 85/234. oldal visszatérő bejövő; }
Ez az, hogy ezeknek a funkcióknak elegendőnek kell lenniük egy I2C kommunikáció felállításához és az adatok írásához vagy olvasásához egy eszközről. Vegye figyelembe azt is, hogy az I2C kommunikáció számos más funkciót is képes végrehajtani, de az egyszerűség kedvéért itt nem tárgyaljuk ezeket. Az adatlap teljes működéséhez mindig hivatkozhat
A PIC16F877A I2C kommunikáció fejlécfájljával ellátott teljes kód letölthető a linkről.
Programozás az I2C fejlécfájlok használatával:
Most, hogy megtanultuk az I2C kommunikáció működését és a hozzá létrehozott fejlécfájl használatát, készítsünk egy egyszerű programot, amelyben a fejléc fájlt fogjuk használni, és írunk néhány értéket az I2C sorokra. Ezután szimuláljuk ezt a programot, és ellenőrizzük, hogy ezeket az értékeket írják-e a buszra.
Mint mindig, a program a konfigurációs bitek beállításával és az órajel frekvenciájának 20 MHz-re állításával kezdődik az alábbiak szerint
#pragma config FOSC = HS // Oszcillátor választóbitek (HS oszcillátor) #pragma config WDTE = KI // Watchdog Timer Engedélyezés bit (WDT letiltva) #pragma config PWRTE = BE // Bekapcsolási időzítő bit engedélyezése (PWRT engedélyezve) # pragma config BOREN = BE // Brown-out Reset bit engedélyezése (BOR engedélyezve) #pragma config LVP = OFF // Kisfeszültségű (egyszeres tápellátás) Áramkörben soros programozás Engedélyező bit (RB3 digitális I / O, HV be MCLR-t kell használni a programozáshoz) #pragma config CPD = OFF // Data EEPROM memóriakód védelmi bit (Data EEPROM kód védelem ki van kapcsolva) #pragma config WRT = OFF // Flash program memória írása Bitek engedélyezése (Írásvédelem kikapcsolva; az összes program memória az EECON ellenőrzése alapján írhatunk) #pragma config CP = KI // Flash program memória kód védelmi bit (a kód védelme ki van kapcsolva) #define _XTAL_FREQ 20000000
A következő lépés az a fejlécfájl hozzáadása, amelyről most tárgyaltunk. A fejlécfájl neve PIC16F877a_I2C.h, és letölthető a fent tárgyalt linkről. Győződjön meg arról, hogy a fejlécfájlt hozzáadta a projektlista fejlécfájljához. A projektfájl-struktúrának így kell kinéznie
Miután ellenőrizte, hogy a fejlécfájlt hozzáadta- e a projektfájljához, a fejlécfájlt is belefoglalja a fő C fájlba
#include
A while cikluson belül megkezdjük az I2C kommunikációt, és néhány véletlen értéket írunk az I2C buszra, majd befejezzük az I2C kommunikációt. A véletlenszerű értékek, amelyeket kiválasztottam, D0, 88 és FF. Bármelyik értéket megadhatja. De ne feledje ezeket az értékeket, amikor a szimulációnk során ellenőrizni fogjuk őket.
míg (1) { I2C_Begin (); I2C_Write (0xD0); I2C_Write (0x88); I2C_Write (0xFF); I2C_End (); __késleltesms (1000); }
A teljes program az oldal alján található, ezt használhatja, vagy innen töltheti le a program teljes zip fájlját. Miután megszerezte a programot, fordítsa le és készüljön fel a szimulációra.
Proteus szimuláció:
A Proteus rendelkezik egy szép I2C debugger nevű eszközzel, amellyel le lehet olvasni az adatokat egy I2C buszon, ezért építsünk fel egy áramkört annak felhasználásával, és ellenőrizzük, hogy az adatok sikeresen íródnak-e. A teljes kapcsolási rajz az alábbiakban látható
Töltse be a programunk által létrehozott hex fájlt duplán kattintva a mikrovezérlőre. Ezután szimulálja a programot. Észre fog venni egy felugró ablakot, amely az I2C busz összes információját megjeleníti. A programunk ablaka alább látható.
Ha alaposan szemügyre veszi az írandó adatokat, észreveheti, hogy azok megegyeznek a programunkban leírtakkal. Az értékek D0, 88 és FF. Az értékeket 1 másodpercenként írják, így az idő is frissül, az alábbiak szerint. A kék nyíl azt jelzi, hogy mesterről rabszolgára van írva, ha ellenkező esetben ellenkező irányba mutat. Az elküldött adatok részletesebb áttekintését az alábbiakban mutatjuk be.
Ez csak egy pillantás az I2C képességeire, több eszközre is képes adatokat olvasni és írni. Az I2C-ről bővebben a leendő oktatóprogramjainkban foglalkozunk az I2C protokollal működő különböző modulok összekapcsolásával.
Remélem, megértette a projektet, és valami hasznosat tanult belőle. Ha kétségei vannak, tegye közzé az alábbi megjegyzés részben, vagy használja a fórumot technikai segítségért.
A teljes kódot alább adtuk meg; innen töltheti le az összes kóddal ellátott fejlécfájlokat.