- Mikä on I2C Communication Protocol?
- Kuinka I2C-viestintä toimii?
- Missä käyttää I2C-viestintää?
- I2C Nuvoton N76E003: lla - laitteistovaatimus
- Liitäntä AT24LC64: n ja Nuvoton N76E003: n välillä - piirikaavio
- I2C-nastat Nuvoton N76E003 -laitteessa
- I2C-tiedonsiirto N76E003: ssa
- N76E003: n ohjelmointi I2C-tiedonsiirtoa varten
- Koodin ja lähdön vilkkuminen
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. Jos olet uusi täällä, tutustu Nuvoton-oppaisiin, joissa olemme keskustelleet N76E003-mikrokontrollerin jokaisesta oheislaitteesta aloitusoppaasta. Jos haluat oppia käyttämään I2C: tä muiden mikrokontrollerien kanssa, voit tarkistaa alla olevat linkit.
- I2C: n käyttö Arduinossa: Kahden Arduino-levyn välinen tiedonsiirto
- I2C-tiedonsiirto PIC-mikrokontrollerin PIC16F877 kanssa
- 16X2 LCD: n ja ESP32: n liitäntä I2C: tä käyttäen
- I2C-tiedonsiirto MSP430 Launchpadin kanssa
- LCD-näytön ja NodeMCU: n yhdistäminen ilman I2C: tä
- Kuinka käsitellä moniviestintää (I2C SPI UART) yhdessä Arduinon ohjelmassa
I2C on tärkeä kommunikaatioprotokolla, jonka on kehittänyt Philips (nyt NXP). Tämän I2C-protokollan avulla MCU voidaan yhdistää useisiin laitteisiin ja aloittaa tiedonsiirto. I2C toimii vain kahdella johtimella, nimittäin SDA: lla ja SCL: llä. Missä SDA tarkoittaa sarjatietoja ja SCL tarkoittaa sarjakelloa. Nämä kaksi nastaa vaativat kuitenkin vetovastukset VCC-jännitetasolle ja riittävän vetovastuksen avulla väylä voisi tukea 127 laitetta, joilla on yksilöllinen osoite.
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 kellosignaaliin ja toista tietojen lähettämiseen ja vastaanottamiseen.
Kuinka I2C-viestintä toimii?
I2C-viestinnän otti ensimmäisen kerran käyttöön Phillips. Kuten aiemmin mainittiin, siinä on kaksi johtoa, nämä kaksi johtoa kytketään kahden laitteen yli. Täällä 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 puhutaan vain salvesta, jolla on kyseinen osoite, vastaamme takaisin, kun taas muut pysyvät hiljaa. 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 tiedonsiirtoon 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 viestintää, kokeile RS232: ta ja jos etsit luotettavampaa viestintää, kokeile SPI-protokollaa.
I2C Nuvoton N76E003: lla - laitteistovaatimus
Koska tämän projektin vaatimus on oppia I2C-viestintä N76E003: n avulla, käytämme EEPROMia, joka liitetään I2C- tietolinjaan. Tallennamme joitain tietoja EEPROMiin ja luemme myös ne ja näytämme ne UART-näytöllä.
Koska tallennettu arvo tulostetaan UART: iin, tarvitaan kaikenlainen USB - UART -muunnin. Voit myös tutustua UART: n opetusohjelmaan Nuvotonilla, jos olet uusi UART-viestinnässä N76E003: ssa. Sovelluksessamme käytämme CP2102 UART - USB-muunninta. Edellä mainittujen lisäksi tarvitsemme myös seuraavat komponentit -
- EEPROM 24C02
- 2kpl 4.7k vastukset
Puhumattakaan siitä, että edellä mainittuja komponentteja lukuun ottamatta tarvitsemme N76E003-mikrokontrolleripohjaisen kehityskortin sekä Nu-Link-ohjelmoijan. Lisäksi kaikkien komponenttien liittämiseen tarvitaan leipälauta- ja kytkentäjohtoja.
Liitäntä AT24LC64: n ja Nuvoton N76E003: n välillä - piirikaavio
Kuten alla olevasta kaaviosta voidaan nähdä, EEPROM on kytketty I2C-linjaan yhdessä kahden ylösvetovastuksen kanssa. Vasemmassa reunassa näkyy ohjelmointirajapinnan yhteys.
Käytin AT24LC64 IC: n leipälevyä ja liitin IC: n nuvoton-ohjelmointikorttiin hyppyjohtimilla. Laitteistoasetukset yhdessä nu-ink-ohjelmoijan kanssa ovat alla.
I2C-nastat Nuvoton N76E003 -laitteessa
N76E003: n tappi-kaavio näkyy alla olevassa
Kuten näemme, jokaisella tapilla on erilaiset tekniset tiedot ja kutakin tapia voidaan käyttää useisiin tarkoituksiin. Kuitenkin tappi 1.4 käytetään I2C SDA tappi, se menettää PWM ja muita toimintoja. Mutta se ei ole ongelma, koska toista toimintoa ei vaadita tässä projektissa. Sama tapahtuu P1.3: lle on I2C: n SCL-tappi.
Koska I2C-nastat toimivat GPIO: na, se on määritettävä. Kaikki GPIO-nastat voidaan määrittää alla kuvatussa tilassa.
Kuten kohti tekninen, PxM1.n ja PxM2. n on kaksi rekisteriä, joita käytetään määrittämään I / O-portin ohjaustoiminto. Datalehdessä todetaan, että I2C-toiminnallisuuden käyttämiseksi I / O-moodeja on käytettävä avoimen tyhjennyksenä I2C: hen liittyvässä viestinnässä.
I2C-tiedonsiirto N76E003: ssa
I2C-oheislaite on tärkeä asia kaikille mikro-ohjainyksiköille, jotka tukevat I2C-ominaisuuksia. Monissa erityyppisissä mikrokontrollereissa on sisäänrakennettu I2C-oheislaite. Joissakin tapauksissa I2C voidaan kuitenkin määrittää manuaalisesti ohjelmisto-ohjauksella, kun I2C: hen liittyvä laitteistotuki ei ole käytettävissä (esimerkiksi monet 8051-mikrokontrollerit). Nuvoton N76E003: ssa on kuitenkin I2C-oheislaitteiden tuki.
M76E003 tukee neljää toimintatyyppiä I2C-tiloissa - päälähetin, päävastaanotin, orjalähetin ja orjavastaanotin. Se tukee myös I2C-linjan vakio- (100 kbps) ja nopeita (jopa 400 kbps) nopeuksia. I2C toimii muutaman yleisen säännön kanssa SCL- ja SDA-signaalilinjoissa.
Käynnistys- ja lopetusolosuhteet:
Se on tärkeä asia I2C-viestinnässä. Kun data siirretään I2C-linjalle, se alkaa alkuehdoista ja päättyy pysäytysolosuhteisiin.
Aloitusolosuhde on korkea-matala-siirtymä SDA: ssa, kun SCL-linja on korkea, ja pysäytysolosuhde on matalasta korkeaan-siirtymä SDA: lla, kun SCL-linja on korkea. Nämä kaksi ehtoa luodaan isäntälaitteella (MCU tai mikä tahansa muu orjalaitetta ohjaava laite). Bussilinja pysyy varattu tässä tilassa, kun aloitusolosuhteet aloitetaan, ja pysyy taas vapaina, kun pysäytysolosuhteet aloitetaan.
Käynnistys- ja lopetusolosuhteet näkyvät erinomaisesti signaaliperspektiivissä N76E003-tietolomakkeessa -
7-bittinen osoite tietomuodolla:
N76E003 tukee 7-bittistä osoitetta ja datamuotoa. Kun alkuehto on aloitettu, päälaitteen on lähetettävä tiedot I2C-linjalle. Ensimmäiset tiedot ovat tärkeitä. Jos näitä tietoja ei ole luotu tai lähetetty oikein, yhdistettyä laitetta ei tunnisteta eikä yhteydenpitoa voida jatkaa.
Tiedot koostuvat 7-bittisestä orjaosoitteesta, jota kutsutaan SLA: ksi. Tämän 7-bittisen osoitteen on oltava yksilöllinen jokaiselle laitteelle, jos väylään on kytketty useita laitteita. 7-bittisen osoitteen jälkeen kahdeksas bitti on datasuunnan bitti. Tämä tarkoittaa, että 8. bitistä riippuen isäntä lähettää orjalaitteelle tiedot siitä, kirjoitetaanko tietoja orjalaitteeseen vai luetaanko tietoja orjalaitteelta. Kahdeksas bitti on R / W-bitti, jota kutsutaan luku- tai kirjoitusilmoittajaksi. Kuten me kaikki tiedämme, 8-bittinen tieto voi olla 128 tyyppiä, mikä tukee 128 laitetta, mutta I2C tukee 127 tyyppistä laitetta samalla väylällä, mutta ei 128. Koska 0x00-osoite on varattu osoite, jota kutsutaan yleiseksi puheluosoitteeksi. Jos päällikkö haluaa lähettää tietoja kaikkiin laitteisiin,se osoittaa 0x00 ja kukin laite toistaa samalla tavalla kuin yksittäisten ohjelmistokokoonpanojen mukaan.
Siten tiedonsiirto näyttää alla olevalta
Tunnustaa:
Yllä olevassa dataosoitekuvassa 9. bittiä, jota seuraa R / W-bitti, kutsutaan kuittausbitiksi. Se on tärkeä, koska tätä bittiä käytettäessä isäntä tai orja reagoi datalähettimeen vetämällä SDA-linjan matalaksi. Saadakseen kuittausbitin lähettimen on vapautettava SDA-linja.
N76E003: n ohjelmointi I2C-tiedonsiirtoa varten
Tässä opetusohjelmassa käytetty koko ohjelma löytyy tämän sivun alaosasta. Tärkeät segmentit selitetään koodissa seuraavasti:
Aseta nastat avoimeksi tyhjennykseksi ja määritä ne I2C: tä varten:
Aloitetaan ensin I2C-nastaosasta. Kuten aiemmin on kuvattu, I2C SCL- ja SDA-portit on määritettävä ja asetettava avoimen tyhjennyksen kokoonpanoksi. Tätä varten käytämme I2C.h-otsikkotiedostoa yhdessä I2C.c-lähdetiedoston kanssa . Koodinpätkä näyttää tältä -
tee {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} kun (0)
Yllä oleva koodi asettaa P13: n ja P14: n avoimen tyhjennystapiksi ja clr_I2CPX: tä käytetään valitsemaan P13 ja P14 SCL- nastana P1.3: lla ja SDA-nastana P1.4: llä.
Tämä I2CPX on I2C-ohjausrekisterin I2CON 0. bitti. Jos tämä I2C_PX on asetettu arvoksi 1, nastat muutetaan arvoksi P0.2 SCL: ksi ja P1.6 SDA: ksi. Käytämme kuitenkin P13 ja P14. Vaihtoehtoisia nastoja ei käytetä tässä.
I2C-ohjausrekisteri I2CON:
I2C-ohjausrekisteri I2CON-protokollaa käytetään I2C-toimintojen ohjaamiseen. Ensimmäinen bitti on I2C-nastan valintabitti. Kun asetat sen 0, I2C-nasta konfiguroidaan P13: ksi ja P14: ksi.
AA-bitti on kuittausvahvistuslippu, jos AA-lippu on asetettu, ACK palautetaan SCL-linjan kuittauskellopulssin aikana. Jos se tyhjennetään, NACK (korkea taso SDA: lla) palautetaan SCL-linjan kuitatun kellopulssin aikana.
Seuraava bitti on SI, joka on I2C-tilan keskeytys. Jos I2C-tilan keskeytys on käytössä, käyttäjän tulee tarkistaa I2STAT-rekisteristä, mikä vaihe on suoritettu, ja ryhtyä toimenpiteeseen.
STO on STOP-lippu, joka asetetaan master-tilaan. Laitteisto tyhjentää STO: n automaattisesti, kun STOP- tila on havaittu.
Seuraava bitti on STA-bitti. Jos tämä lippu on asetettu, I2C luo START-ehdon, jos väylä on vapaa. Jos väylä on varattu, I2C odottaa STOP-tilaa ja luo START-ehdon. Jos STA on asetettu, kun I2C on jo master-tilassa ja yksi tai useampi tavu on lähetetty tai vastaanotettu, I2C tuottaa toistuvan START-ehdon. Ohjelmiston on tyhjennettävä STA manuaalisesti.
Viimeinen, I2CEN, on I2C-väylän käyttöönotto- tai käytöstäpoistobitti.
EEPROM 24C02:
Nyt tulossa 24C02. N76E003: n piirilevyn tukipaketissa on I2C-koodi 24LC64: lle ja sitä voidaan helposti muokata. Käytämme kuitenkin yksinkertaista menetelmää ymmärtääksemme I2C-toiminnon.
Jos joku haluaa käyttää yksityiskohtaista rajapintaa EEPROM 24C02: n kanssa, voidaan käyttää tukiaseman EEPROM-ohjelmaa.
Yhdistämme 24C02: n vain I2C: ssä, jossa N76E003 on isäntä ja EEPROM on orja. Siksi kirjoitamme kaikki tiedot EEPROM-osoitteeseen ja luemme ne.
24C02 EEPROM-liitäntä on esitetty alla-
A0, A1 ja A2 ovat kolme osoitteenvalintanastaa. WP-nastat ovat kirjoitussuojatappeja, ja ne on liitettävä VSS: ään, jotta EEPROM-tiedostoon voi kirjoittaa.
Tavu kirjoitus -toiminto näkyy alla olevassa
Koko kirjoitusjakso tapahtuu aloitusbitin kanssa. Sen jälkeen Control-tavu on lähetettävä. Ohjaustavussa vaaditaan seuraavia asioita -
Aloitusbitin jälkeen koostuu orjaosoitteesta. 1010 on staattinen ja A0, A1 ja A2 ovat laitteistoyhteyspohjainen osoite. Jos nämä kolme nastaa on kytketty GND- tai VSS-syöttöön, se luetaan 0. Muuten, jos se on kytketty VCC: hen, se luetaan 1. Tapauksessamme kaikki A0, A1 ja A2 on kytketty VSS: ään. Täten kaikki nämä ovat 0.
Kulutus luku- tai kirjoitusehtoon. Osoitteen arvo luku- tai kirjoitusbitillä on - 0xA0 kirjoitettaessa ja 0xA1 lukemista varten. Seuraava on kuittausbitti ja sen jälkeen lähetetään 8-bittinen osoite, johon tiedot on tallennettava, ja lopuksi tiedot, jotka tallennetaan kyseiseen sijaintiin. Nämä asiat tehdään askel askeleelta -muodossa päätoiminnossa.
Päätoiminto ja silmukka:
void main (void) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Tärkeää, käytä prinft-funktiota on asetettava TI = 1; I2C_init (); kun (1) {EEPROM_write (1,0x55); c = EEPROM_luku (1); printf ("\ n Luettu arvo on% x", c & 0xff); }; }
Päätoiminto on yksinkertainen, se kirjoittaa arvoja jatkuvasti EEPROM: lle osoitteeseen 1 ja lukee tietoja. Tiedot tulostetaan sitten käyttämällä printf-toimintoa. Printf tulostaa arvon heksadesimaalina.
EEPROM-kirjoitustoiminto koostuu seuraavista asioista, jotka on kuvattu EEPROM-osiossa:
void EEPROM_write (allekirjoittamaton char-osoite, allekirjoittamaton char-arvo) {I2C_start (); I2C_write (0xA0); I2C_write (osoite); I2C_write (arvo); I2C_stop (); }
I2C-käynnistystoiminto koostuu seuraavista asioista:
void I2C_start (void) {allekirjoitettu int aika = aikakatkaisu; set_STA; clr_SI; while ((SI == 0) && (aika> 0)) {aika--; }; }
Tässä toiminnossa SI-tilaa tarkistetaan yhdessä ennalta määritetyn aikakatkaisujakson kanssa (määritelty I2C.h: ssä, jossa ennalta määritetty aika on asetettu 1000: ksi). Käynnistystoiminto alkaa asettamalla STA ja tyhjentämällä SI.
void I2C_stop (void) {allekirjoitettu int aika = aikakatkaisu; clr_SI; set_STO; while ((STO == 1) && (aika> 0)) {aika--; }; }
Sama kuin Käynnistä, pysäytä -toimintoa käytetään. Stop- toiminto aloitetaan asettamalla STO jälkeen tyhjentämällä SI. Alla oleva toiminto on I2C-lukutoiminto-
unsigned char I2C_read (unsigned char ack_mode) {allekirjoitettu int aika = aikakatkaisu; allekirjoittamaton char-arvo = 0x00; set_AA; clr_SI; while ((SI == 0) && (t> 0)) {aika--; }; arvo = I2DAT; if (ack_mode == I2C_NACK) {t = aikakatkaisun_määrä; clr_AA; clr_SI; while ((SI == 0) && (t> 0)) {aika--; }; } palautusarvo; }
Sekä ack_mode että I2C_NACK on määritelty I2C-otsikkotiedostossa vastaavasti 0 ja 1.
Vastaavasti kirjoitustoiminto luodaan-
void I2C_write (allekirjoittamaton char-arvo) {signeerattu int aika = aikakatkaisu; I2DAT = arvo; clr_STA; clr_SI; while ((SI == 0) && (aika> 0)) {aika--; }; }
Koodin ja lähdön vilkkuminen
Koodi palautti 0 varoituksen ja 0 virhettä, ja Keil vilkasti sitä oletusarvoisella vilkkumismenetelmällä. Jos olet uusi, tutustu nuvoton-opetusohjelman käytön aloittamiseen ymmärtääksesi, kuinka koodi lähetetään. Koodin kokoavat tiedot löytyvät alla.
Rakenna kohde 'I2C_EEPROM', joka kääntää I2C_EEPROM.c… kääntää I2C.c… linkittää… Ohjelman koko: data = 59,2 xdata = 0 koodi = 2409 luodaan heksatiedosto tiedostosta ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 virhettä, 0 varoitusta. Kokoonpanon aika kulunut: 00:00:04 Erä-koontiversio: 1 onnistunut, 0 epäonnistunut, 0 ohitettu - kulunut aika: 00:00:04
Laitteistoa asennetaan leipälaudalle ja se toimii odotetulla tavalla. Kuten alla olevasta kuvasta näet, pystyimme kirjoittamaan arvon EEPROM-muistiin ja lukemaan sen takaisin muistista ja näyttämään sen sarjamonitorilla.
Katso alla olevasta videosta täydellinen esitys siitä, miten taulu toimii tällä koodilla. Toivottavasti pidit opetusohjelmasta ja opit jotain hyödyllistä, jos sinulla on kysyttävää, jätä ne alla olevaan kommenttiosioon. Voit käyttää foorumeitamme myös muiden teknisten kysymysten lähettämiseen.