- Mikä on I2C Communication Protocol?
- Kuinka I2C-viestintä toimii?
- Missä käyttää I2C-viestintää?
- I2C ja PIC16F877a XC8-kääntäjällä
- Ohjelmointi I2C-otsikkotiedostoilla:
- Proteus-simulointi:
PIC-mikrokontrollerit ovat mikrosirun tarjoama tehokas alusta upotetuille projekteille, sen monipuolinen luonne on tehnyt siitä mahdollisuuden löytää tapoja moniin sovelluksiin ja vaihe on edelleen käynnissä. Jos olet seurannut PIC-opetusohjelmiamme, olisit huomannut, että olemme jo käsittäneet laajan valikoiman PIC-mikrokontrollerioppaita alusta alkaen. Tästä lähtien olemme käsitelleet perusasiat, joista voimme päästä mielenkiintoisempiin juttuihin, kuten viestintäportaaliin.
Suuressa sulautettujen sovellusten järjestelmässä mikään mikro-ohjain ei voi suorittaa kaikkia toimintoja itse. Jossain vaiheessa sen on kommunikoitava muiden laitteiden kanssa tietojen jakamiseksi, näiden tietojen jakamiseksi on olemassa monia erityyppisiä yhteyskäytäntöjä, mutta eniten käytetyt ovat USART, IIC, SPI ja CAN. Jokaisella tiedonsiirtoprotokollalla on omat etunsa ja haittansa. Keskitymme nyt IIC-osaan, koska sen opimme tässä opetusohjelmassa.
Mikä on I2C Communication Protocol?
Termi IIC tarkoittaa ” integroituja piirejä ”. Sitä kutsutaan yleensä I2C: ksi tai I-neliöksi C tai jopa 2-johdinliitäntäprotokollaksi (TWI) joissakin paikoissa, mutta se kaikki tarkoittaa samaa. I2C on synkroninen tietoliikenneprotokolla, mikä tarkoittaa, että molemmilla laitteilla, jotka jakavat tietoa, on oltava yhteinen kellosignaali. Siinä on vain kaksi johtoa tietojen jakamiseksi, joista toista käytetään kukkosignaaliin ja toista datan lähettämiseen ja vastaanottamiseen.
Kuinka I2C-viestintä toimii?
I2C-viestinnän otti ensimmäisen kerran käyttöön Phillips. Kuten aiemmin mainittiin, sillä on kaksi johtoa, nämä kaksi johtoa kytketään kahden laitteen yli. Tällöin yhtä laitetta kutsutaan isännäksi ja toista laitetta orjaksi. Viestinnän tulisi tapahtua ja tapahtuu aina kahden isännän ja orjan välillä. I2C-tiedonsiirron etuna on, että Masteriin voidaan liittää useampi kuin yksi orja.
Täydellinen tiedonsiirto tapahtuu näiden kahden johdon, nimittäin sarjakellon (SCL) ja sarjatietojen (SDA), kautta.
Sarjakello (SCL): Jakaa isännän tuottaman kellosignaalin orjan kanssa
Sarjatiedot (SDA): Lähettää tietoja isännälle ja orjalle.
Milloin tahansa vain päällikkö voi aloittaa viestinnän. Koska väylässä on useampi kuin yksi orja, isännän on viitattava kuhunkin orjaan eri osoitteella. Kun sitä käsitellään, vain kyseisellä osoitteella oleva salve vastaa takaisin tietoihin, kun taas muut pitävät lopettaa. Tällä tavalla voimme käyttää samaa väylää kommunikoimaan useiden laitteiden kanssa.
Missä käyttää I2C-viestintää?
I2C-viestintää käytetään vain lyhyen matkan viestintään. Se on varmasti jossain määrin luotettava, koska sillä on synkronoitu kellopulssi, joka tekee siitä älykkään. Tätä protokollaa käytetään pääasiassa kommunikoimaan anturin tai muiden laitteiden kanssa, joiden on lähetettävä tietoja päällikölle. On erittäin kätevää, kun mikro-ohjaimen on oltava yhteydessä moniin muihin orjamoduuleihin käyttämällä vähintään vain johtoja. Jos etsit pitkän kantaman tiedonsiirtoa, kokeile RS232: ta ja jos etsit luotettavampaa tiedonsiirtoa, kokeile SPI-protokollaa.
I2C ja PIC16F877a XC8-kääntäjällä
Tarpeeksi esittelyjä, päästään siihen ja opitaan, kuinka voimme käyttää mikro-ohjainta I2C-viestinnän suorittamiseen. Ennen kuin aloitamme, tehdään selväksi, että tämä opetusohjelma puhuu vain I2C: stä PIC16F877a: ssa XC8-kääntäjää käyttäen, prosessi on sama muille mikro- ohjaimille, mutta pieniä muutoksia saatetaan tarvita. Muista myös, että edistyneille mikrokontrollereille, kuten PIC18F-sarja, kääntäjällä voi itse olla jokin kirjasto sisäänrakennettuna I2C-ominaisuuksien käyttämiseen, mutta PIC16F877A: lle mitään sellaista ei ole, joten rakennetaan yksi omasta. Tässä selitetty kirjasto annetaan otsikkotiedostona ladattavaksi alareunassa, jota voidaan käyttää PIC16F877A: n kommunikointiin muiden I2C-laitteiden kanssa.
Kuten aina, paras paikka aloittaa on tietolomakkeemme. Etsi lisätietoja I2C: stä lomakkeesta ja tarkista, mitkä rekisterit on määritettävä. En aio selittää yksityiskohtaisesti, koska tietolomake on jo tehnyt sen sinulle. Seuraavassa selitän otsikkotiedostossa olevat eri toiminnot ja niiden vastuun ohjelmassa.
void I2C_Initialize ()
Alustusfunktiota käytetään kertomaan mikrokontrollerille, että aiomme käyttää I2C-protokollaa. Tämä voidaan tehdä asettamalla vaaditut bitit SSPCON- ja SSPCON2-rekisteriin. Ensimmäinen askel olisi julistaa IIC-nastat tuloliittimiksi, tässä nastoja RC3 ja RC4 tulisi käyttää I2C-viestintään, joten julistamme ne tuloliittimiksi. Seuraavaksi meidän pitäisi asettaa SSPCON ja SSPCON2, joka on MSSP-ohjausrekisterit. Käytämme PIC: tä IIC-master-tilassa kellotaajuudella FOSC / (4 * (SSPADD + 1)). Katso alla olevissa kommenttiriveissä mainitun tietolomakkeen sivunumerot ymmärtääksesi, miksi kyseinen rekisteri asetetaan tällä tavalla.
Joten seuraavaksi meidän on asetettava kellotaajuus, eri sovellusten kellotaajuus voi vaihdella, joten saamme käyttäjän valinnan muuttujan feq_k kautta ja käytämme sitä kaavoissamme SSPADD-rekisterin asettamiseen.
void I2C_Initialize (const unsigned long feq_K) // Aloita IIC masterina { TRISC3 = 1; TRISC4 = 1; // Aseta SDA- ja SCL-nastat tulonastoiksi SSPCON = 0b00101000; // pg84 / 234 SSPCON2 = 0b00000000; // pg85 / 234 SSPADD = (_XTAL_FREQ / (4 * feq_K * 100)) - 1; // Kellonopeuden asettaminen pg99 / 234 SSPSTAT = 0b00000000; // s.83 / 234 }
Void I2C_Hold ()
Seuraava tärkeä toiminto on I2C_hold- toiminto, jota käytetään pitämään laitteen suoritusta, kunnes nykyinen I2C-toiminto on valmis. Meidän on tarkistettava, onko I2C-operaatiot pidettävä ennen uuden toiminnan aloittamista. Tämä voidaan tehdä tarkistamalla rekisteri SSPSTAT ja SSPCON2. SSPSTAT sisältää tietoja I2C-väylän tilasta.
Ohjelma saattaa tuntua hieman monimutkaiselta, koska siihen liittyy “ja” ja “tai” operaattori. Kun rikkot sen
SSPSTAT & 0b00000100 SSPCON2 ja 0b00011111
A
Se tarkoittaa, että varmistamme, että SSPSTAT: n toinen bitti on nolla ja vastaavasti bitit 0: sta 4: een ovat nollia SSPCON2: lla. Sitten yhdistämme kaikki nämä tarkistaaksemme, että tulos on nolla. Jos tulos on nolla, ohjelma etenee, jos ei, se pysyy siellä, kunnes se saa nollan, koska sitä käytetään hetken silmukassa.
void I2C_Hold () { while ((SSPCON2 & 0b00011111) - (SSPSTAT & 0b00000100)); // tarkista tämä rekisteristä varmistaaksesi, että IIC ei ole käynnissä }
Void I2C_Begin () ja mitätöi I2C_End ()
Aina kun kirjoitamme tai luemme tietoja I2C-väylän avulla, meidän on aloitettava ja lopetettava I2C-yhteys. I2C-viestinnän aloittamiseksi meidän on asetettava SEN-bitti ja lopetettava tiedonsiirto on asetettava PEN-tilabitti. Ennen kuin vaihdat mitään näistä biteistä, meidän on myös tarkistettava, onko I2C-väylä varattu, käyttämällä toimintoa I2C_Hold, kuten yllä on kuvattu.
void I2C_Begin () { I2C_Hold (); // Pidä ohjelmaa, kun I2C on varattu SEN = 1; // Aloita IIC pg85 / 234 } mitätöi I2C_End () { I2C_Hold (); // Pidä ohjelmaa, kun I2C on varattu PEN = 1; // End IIC s. 85/234 }
Void I2C_Write ()
Kirjoitustoimintoa käytetään tietojen lähettämiseen päämoduulista salve-moduuliin. Tätä toimintoa käytetään normaalisti I2C-aloitustoiminnon jälkeen, ja sitä seuraa I2C End -toiminto. Tiedot, jotka on kirjoitettava IIC-väylään, välitetään muuttujatietojen kautta. Tämä data ladataan sitten SSPBUF-puskurirekisteriin sen lähettämiseksi I2C-väylän kautta.
Normaalisti ennen tietojen kirjoittamista osoite kirjoitetaan, joten joudut käyttämään kirjoitustoimintoa kahdesti, kerran osoitteen asettamiseen ja toisen kerran todellisten tietojen lähettämiseen.
void I2C_Write (allekirjoittamaton data) { I2C_Hold (); // Pidä ohjelmaa, kun I2C on varattu SSPBUF = data; // pg82 / 234 }
allekirjoittamaton lyhyt I2C_Read ()
Viimeinen toiminto, josta meidän on tiedettävä, on I2C_Read- funktio. Tätä toimintoa käytetään I2C-väylällä tällä hetkellä olevien tietojen lukemiseen. Sitä käytetään pyydettyään orjaa kirjoittamaan väylälle jonkin verran arvoa. Vastaanotettu arvo on SSPBUF: ssä, voimme siirtää arvon mihin tahansa muuttujaan toiminnallemme.
I2C-tiedonsiirron aikana orja lähettää isännän pyytämän datan toisen bitin, joka on kuittausbitti, isännän on myös tarkistettava tämä bitti varmistaakseen, että tiedonsiirto onnistui. Kun olet tarkistanut ACKDT-bitin vahvistuksen, sen pitäisi olla mahdollista asettamalla ACKEN-bitti.
unsigned short I2C_Read (unsigned short ack) { allekirjoittamaton lyhyt saapuva; I2C_Hold (); RCEN = 1; I2C_Hold (); saapuva = SSPBUF; // hanki SSPBUF I2C_Hold () -sovellukseen tallennetut tiedot ; ACKDT = (ack) a 0: 1; // tarkista saiko ack-bitti ACKEN = 1; // ss 85/234 palauttaa saapuvan; }
Eli, näiden toimintojen pitäisi olla riittäviä perustamaan I2C-tiedonsiirto ja kirjoittamaan tai lukemaan tietoja laitteesta. Huomaa myös, että I2C-viestintä voi suorittaa monia muita toimintoja, mutta yksinkertaisuuden vuoksi emme keskustele niistä täällä. Voit aina viitata tietolomakkeeseen, jotta tiedät
Koko koodi ja otsikkotiedosto PIC16F877A I2C -yhteydelle voidaan ladata linkistä.
Ohjelmointi I2C-otsikkotiedostoilla:
Nyt kun olemme oppineet, kuinka I2C-viestintä toimii ja kuinka voimme käyttää sille luotua otsikkotiedostoa, tehkäämme yksinkertainen ohjelma, jossa käytämme otsikkotiedostoa ja kirjoitamme joitain arvoja I2C-riveille. Simuloidaan sitten tätä ohjelmaa ja tarkistetaan, kirjoitetaanko nämä arvot väylälle.
Kuten aina, ohjelma alkaa määritysbittien asettamisella ja kellotaajuuden asettamisella 20 MHz: lle alla olevan kuvan mukaisesti
#pragma config FOSC = HS // Oskillaattorin valintabitit (HS-oskillaattori) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT pois käytöstä) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT käytössä) # pragma-konfiguraatio BOREN = PÄÄLLE // Ruskea-nollaus Nollaa bitti (BOR käytössä) #pragma-konfiguraatio LVP = POIS // Pienjännitekerroin (yksisyöttö) Piirin sisäinen sarjaohjelmointi Aktivointibitti (RB3 on digitaalinen I / O, HV päällä MCLR: ää on käytettävä ohjelmointiin) #pragma config CPD = OFF // Data EEPROM -muistikoodisuojabitti (Data EEPROM- koodisuojaus pois päältä) #pragma config WRT = OFF // Flash-ohjelmamuistin kirjoitus Salli bitit (kirjoitussuoja pois; kaikki ohjelmamuistit voidaan kirjoittaa EECON-valvonnalla) #pragma config CP = OFF // Flash-ohjelman muistikoodin suojausbitti (koodisuojaus pois päältä) #define _XTAL_FREQ 20000000
Seuraava askel olisi lisätä otsikkotiedosto, josta juuri keskustelimme. Otsikkotiedoston nimi on PIC16F877a_I2C.h, ja se voidaan ladata yllä käsittelemästämme linkistä. Varmista, että otsikkotiedosto on lisätty projektiluettelon otsikkotiedostoon. Projektitiedostorakenteen tulisi näyttää tältä
Kun olet varmistanut, että otsikkotiedosto on lisätty projektitiedostoon, sisällytä otsikkotiedosto C-päätiedostoon
#sisältää
Aloitamme while- silmukan sisällä I2C-viestinnän, kirjoitamme muutamia satunnaisia arvoja I2C-väylälle ja lopetamme sitten I2C-tiedonsiirron. Satunnaiset arvot, jotka olen valinnut, ovat D0, 88 ja FF. Voit syöttää haluamasi arvot. Mutta muista nämä arvot, kun tarkistamme ne simulaatiossamme.
kun (1) { I2C_Begin (); I2C_Write (0xD0); I2C_Write (0x88); I2C_Write (0xFF); I2C_End (); __viive_ms (1000); }
Täydellinen ohjelma löytyy alareunassa sivun, voit käyttää sitä tai ladata koko zip-tiedosto ohjelman täältä. Saatuasi ohjelman koota se ja valmistaudu simulointiin.
Proteus-simulointi:
Proteuksella on mukava I2C-virheenkorjauslaite, jota voidaan käyttää I2C-väylän tietojen lukemiseen, joten rakentakaamme piiri käyttämällä sitä ja tarkista, kirjoitetaanko tietoja onnistuneesti. Koko piirikaavio on esitetty alla
Lataa ohjelmasi luoma hex-tiedosto kaksoisnapsauttamalla mikro-ohjainta. Simuloi sitten ohjelmaa. Huomaat, että ponnahdusikkuna avautuu, joka näyttää kaikki I2C-väylän tiedot. Ohjelmaamme ikkuna näkyy alla.
Jos tarkastelet tarkkaan kirjoitettavia tietoja, huomaat, että ne ovat samat kuin kirjoitimme ohjelmassa. Arvot ovat D0, 88 ja FF. Arvot kirjoitetaan 1 sekunnin välein, joten myös aika päivittyy alla olevan kuvan mukaisesti. Sininen nuoli osoittaa, että isännältä orjalle on kirjoitettu, että se osoittaisi vastakkaiseen suuntaan, ellei toisin. Lähetetty data on esitetty tarkemmin alla.
Tämä on vain vilkaisu I2C: n toimintaan, se voi myös lukea ja kirjoittaa tietoja useille laitteille. Käsittelemme lisää I2C: stä tulevissa opetusohjelmissamme liittämällä yhteen erilaisia moduuleja, jotka toimivat I2C-protokollan kanssa.
Toivottavasti ymmärrät projektin ja opit siitä jotain hyödyllistä. Jos sinulla on epäilyksiä, lähetä ne alla olevaan kommenttiosioon tai käytä foorumeita tekniseen apuun.
Täydellinen koodi on annettu alla; voit ladata otsikkotiedostot kaikilla koodeilla täältä.