Sisällysluettelo:

I2C -väylä ATtiny- ja ATmega -laitteille: 8 vaihetta
I2C -väylä ATtiny- ja ATmega -laitteille: 8 vaihetta

Video: I2C -väylä ATtiny- ja ATmega -laitteille: 8 vaihetta

Video: I2C -väylä ATtiny- ja ATmega -laitteille: 8 vaihetta
Video: LDmicro 3: PIC16F628A & Arduino Nano (Microcontroller PLC Ladder Logic Programming with LDmicro) 2024, Heinäkuu
Anonim
I2C -väylä ATtiny- ja ATmega -laitteille
I2C -väylä ATtiny- ja ATmega -laitteille

Rakastan Atmel AVR -mikro -ohjaimia! Koska olen rakentanut tässä ohjeessa kuvatun Ghetto Development Systemin, minulla ei ole ollut hauskaa kokeilla AVR ATtiny2313: n ja erityisesti ATmega168: n kanssa. Menin jopa niin pitkälle, että kirjoitin Instructable -sovelluksen kytkimien käyttämisestä tuloina ja laajensin Ghetto Development System -konseptin CPLD -laitteisiin. AVR -laitteissa ei ollut tarpeeksi I/O -nastoja, joten minun piti keksiä jotain. Olisin voinut kokeilla monimutkaista syöttöjärjestelmää näppäimistöllä ja näytöllä, mutta ATtiny2313: n resurssit olisivat loppuneet. Onneksi Atmel on kiertänyt tämän ongelman sisällyttämällä käyttöliittymän, joka voi linkittää lisäpiireihin (kuten muisti- tai I/O -portit) yksinkertaisella kaksijohtimisella liittymällä. Aivan oikein, käyttämällä vain kahta I/O -nastaa AVR: ssä voimme käyttää monia muita I/O -nastoja ja muita resursseja. Tämä kaksijohtiminen liitäntä tunnetaan virallisesti nimellä Integroitu piiri -väylä tai vain I2C-väylä, ja NXP keksi sen vielä Philips Semiconductorsina. Jos luet tätä Instructable -ohjetta, olet luultavasti kuullut I2C -väylästä ja olet ehkä jopa käyttänyt sitä PIC: llä tai muulla mikro -ohjaimella. Vaikka ohjelmisto -ohjaimet ovat käsitteellisesti hyvin yksinkertaisia ja niitä tukevat AVR -laitteiden resurssit, ne ovat silti välttämättömiä I2C -väylän käyttämiseksi. Atmel tarjoaa sovellushuomautuksia (katso Resurssit myöhemmin tässä oppaassa), mutta ne ovat epätäydellisiä eivätkä näytä muita esimerkkejä kuin kommunikointi toisen AVR -laitteen kanssa. Tämän ohjeen tarkoituksena ei ole opettaa kenellekään I2C -ohjainten luomista AVR: t. Pikemminkin annan laajennetut versiot Atmel -ohjaimista ATtiny2313- ja ATmega168 -laitteille, selitän näitä käyttäviä vaatimuksia ja rajoituksia ja näytän sinulle toimivia esimerkkejä I2C -laitteista. Kun olet tutkinut tämän Instructable -ohjelman, voit käyttää I2C -väylää onnistuneesti AVR -projekteissasi. On selvää, että voit jättää huomiotta joko pienen tai MEGA -ajurit, jos olet kiinnostunut vain yhdestä niistä. Niille, jotka ovat kiinnostuneita oppimaan lisää I2C -väylästä, annan linkkejä sopivaan materiaaliin.

Vaihe 1: Mitä kaikkea tämä I2C -juttu muuten on?

Mitä kaikkea tämä I2C -juttu muuten on?
Mitä kaikkea tämä I2C -juttu muuten on?
Mitä kaikkea tämä I2C -juttu muuten on?
Mitä kaikkea tämä I2C -juttu muuten on?
Mitä kaikkea tämä I2C -juttu muuten on?
Mitä kaikkea tämä I2C -juttu muuten on?
Mitä kaikkea tämä I2C -juttu muuten on?
Mitä kaikkea tämä I2C -juttu muuten on?

I2C-väylä on yksinkertainen, kaksijohtiminen liitäntä, joka voi yhdistää useita laitteita yhteen ja antaa niille mahdollisuuden vaihtaa tietoja. Yksinkertaisimmassa muodossaan on yksi päälaite, joka kommunikoi useiden orjalaitteiden kanssa. Kaikki laitteet on kytketty rinnakkain I2C -väylän kahden johdon kanssa. Kaksi johtoa tunnetaan nimellä SCL ja SDA. SCL on kellolinja ja sitä ohjaa päälaite. SDA on kaksisuuntainen datalinja. Tietojen siirtämiseksi isäntä lähettää orjaosoitteen ja yhden bitin luku/kirjoitus -lipun. Jos kirjoitus halutaan, isäntä jatkaa datan lähettämistä osoitetulle orjalle. Jos luettavaa pyydetään, orja vastaa tiedoilla. Tapahtumien koordinoimiseksi isäntä ja orja manipuloivat SCL- ja SDA -linjoja useiden ehtojen ilmoittamiseksi. Näitä ovat START, STOP, ACK (kuittaa) ja NAK (ei kuittausta). Kuljettajat käsittelevät näiden ehtojen yksityiskohdat. Todelliset nörtit keskuudessasi voivat oppia kaikki yksityiskohdat tämän ohjeen lopussa olevista linkeistä. Sähkövaatimukset ovat melko yksinkertaisia. Päällikön ja orjien on käytettävä samaa tasoa Vcc: lle, maadoitukset on liitettävä ja SCL- ja SDA -linjat on vedettävä Vcc: hen. Vedävastuksien arvo määritetään tarkasti laskennalla, joka perustuu väylän kokonaiskapasitanssiin, mutta voi käytännössä olla melkein mikä tahansa arvo välillä 1,8K-10K. Aloitan 5.1K: lla ja käytän pienempiä arvoja, kunnes se toimii. Tämä ei yleensä ole ongelma, ellei laitteiden välillä ole paljon laitteita tai pitkiä johtoja. I2C -väylän nimellinen tiedonsiirtonopeus on 100 kt/s. Myös nopeudet 400 kt/s, 1 Mb/s ja yli ovat mahdollisia, mutta tämän käyttöohjeen ohjaimet eivät tue niitä. Kaikki I2C -laitteet toimivat nopeudella 100 kt/s. ATtiny2313 ja ATmega168 toteuttavat I2C -väylän eri tavalla. ATtiny2313 käyttää USI (Universal Serial Interface) -laitteistoa - jota voidaan käyttää myös SPI -väylään. ATmega168: ssa on oma laitteisto I2C -väylälle, joka tunnetaan nimellä TWI (Two Wire Interface). Kun ohjaimet on kirjoitettu, nämä erot ovat useimmiten läpinäkyviä käyttäjälle. Yksi merkittävä ero on ohjelmistossa: ATmega168 I2C -ohjain on keskeytyskäyttöinen, kun taas ATtiny2313 -ohjain ei. Tämä tarkoittaa, että ATmega168 -ohjelman ei tarvitse odottaa I2C -tiedonsiirtoa, vaan sen on odotettava ennen uuden siirron aloittamista tai kunnes tiedot saapuvat lukutoiminnosta. Seuraavien esimerkkien ja keskustelun pitäisi tehdä tämä selväksi. IC -osoitteet ovat 7 bittiä pitkiä, joten väylällä voi olla jopa 127 laitetta, jos jokaisella on yksilöllinen osoite. Kuten kuviosta näkyy, tätä 7 -bittistä osoitetta siirretään vasemmalle yksi bitti ja vähiten merkittävää bittiä käytetään osoittamaan laitteen luku- tai kirjoitusosoite. Täydellinen orjaosoite on siten 8 -bittinen tavu. Todellinen osoite määritetään osittain laitteen sisäisesti, eikä sitä voi muuttaa (4 merkittävintä bittiä), ja se määritetään osittain biteillä, jotka voidaan liittää laitteen nastoihin (3 vähiten merkittävää bittiä), jotka voidaan sitoa korkealle tai matalalle asettaakseen tietty osoite. Kuulostaa sekavalta, mutta esimerkki tekee tämän selväksi. PCA8574A -tietolomake osoittaa, että I2C -osoitteen neljä merkittävintä bittiä ovat aina 0111. Seuraavat kolme bittiä määräytyvät nastojen AD0, AD1 ja AD2 asetusten mukaan. Nämä nastat voidaan sitoa maahan tai positiiviseen jännitelähteeseen (5 volttia) edustamaan 0 tai 1. Mahdollisten osoitteiden alue on siis 38 - 3 F heksadesimaali, kuten toisessa kuvassa PCA8574 -tietolomakkeesta näkyy. Joten muuttamalla osoitebittiasetuksia, jopa 8 PCA8574A: ta voi olla I2C -väylällä samanaikaisesti. Jokainen vastaa vain omaan orjaosoitteeseensa. Jos tarvitaan vielä enemmän I/O -portteja, voidaan käyttää PCA8574 -laitetta. Ainoa ero PCA8574: n ja PCA8574A: n välillä on se, että PCA8574: n I2C -orjaosoitealue on 20 - 27 heksadesimaali. osoite. Lue tietolomake huolellisesti ja muista, että orjaosoite on 7 bittiä pitkä. Luku-/kirjoitusbittiä on käsiteltävä erikseen. Jälleen esimerkki auttaa. Kokeiltavan 24C16 EEPROM: n tietolomake sanoo, että orjaosoitteen ensimmäiset (merkittävimmät) neljä bittiä ovat 1010. Seuraavat kolme bittiä voidaan määrittää A0, A1 ja A2; mutta huomaa, että tietolomake kattaa myös 24C01 - 24C08, jotka ovat pienempiä EEPROM -levyjä. Tietolomakkeen kuva osoittaa, että näiden osoitebittien asetukset jätetään huomiotta koon kasvaessa ja ne jätetään kokonaan huomiotta 24C16: ssa. Eli kolmella viimeisellä bitillä ei ole väliä ja 24C16 käyttää todella kaikkia I2C -orjaosoitteita 50-57 heksadesimaalilla. Orjaosoitteiden alue käsittelee itse asiassa 24C16: n eri osia. Ensimmäiset 256 tavua ovat osoitteessa 50h, seuraavat 256 tavua 51h ja niin edelleen viimeisiin 256 tavuun 57h - yhteensä 2K tavua. Koska PCF8570 RAM -muistin osoite, jota myös kokeilimme, on tällä alueella, 24C16 ja PCF8570 eivät voi käyttää yhdessä.

Vaihe 2: Tilaa joitain I2C -laitteita

Nyt kun tiedät vähän I2C -väylästä ja haluat käyttää sitä, miksi et tilaa joitain I2C -laitteita kokeilemaan nyt, jotta ne voivat olla matkalla luoksesi, kun valmistat ohjelmistoa? O Interface Expander (suosikkini), staattinen ram ja EEPROM. On paljon muutakin, mutta nämä ovat hyvä alku. Käytämme AVR -prosessoreita ATtiny2313 ja Atmega168 (käytetään Arduinossa). Jos olet uusi näissä, tutustu tähän mahtavaan Instructable -oppaaseen oppiaksesi niistä ja rakentaaksesi Ghetto -kehitysjärjestelmäsi. ATmega168: n kaavio esillä olevassa Instructable -ohjelmassa näyttää, kuinka toteuttaa Ghetto Development System tälle prosessorille. Rinnakkaisporttikaapeli on sama kuin ATtiny2313. (En ole kokeillut Ghetto Development Systemin USB -versiota, joten en ole varma, miten I2C -väylää käytetään sillä. Sama koskee Arduinoa.) Tässä on Digikeyn osanumerot. EXPANDER 568-4236-5-NDRam: IC SRAM 256X8 W/I2C 568-1071-5-NDEEPROM: IC EEPROM SERIAL 16K CAT24C16LI-G-ND

Vaihe 3: I2C -ohjaimet

Tässä on I2C -väylän ohjaintoimintojen kuvaukset. Nämä on kehitetty käyttämällä Atmel Apps Notes -aloitetta. En olisi voinut tehdä tätä ilman heitä tukikohtana. Kehitys tehtiin WinAVR: n ja gcc C -kääntäjän avulla. Kellotaajuusrajoitukset on kuvattu alla kullekin prosessorille. Koska en pysty testaamaan kaikkia mahdollisia suorittimen maku / kellotaajuusyhdistelmiä, pidän kiinni siitä, mitä voin todella testata, ja yritän osoittaa rajoitukset ja rajoitukset. Katso esimerkit saadaksesi lisätietoja ja nähdäksesi käytössä olevat toiminnot täydellisissä ohjelmissa. ATtiny2313: Kellovaatimus: Ajurit on suunniteltu 1 MHz: n (oletusnopeus) taajuudelle ATtiny2313: lle. Jos haluat ajaa muilla nopeuksilla, sinun on säädettävä ohjainten vakioita. Lähetä minulle sähköpostia, jos tarvitset apua tämän tekemisessä. Voit myös saada vinkkejä Atmel -sovellusten muistiinpanoista resurssivaiheen linkkien kautta. USI_TWI_Master_Initialise () Tämä toiminto alustaa USI -laitteiston I2C -tilan käyttöä varten. Soita se kerran ohjelman alussa. USI_TWI_Get_State_Info () Tämä toiminto palauttaa I2C -virhetiedot ja sitä käytetään, jos I2C -tapahtuman aikana tapahtui virhe. Koska tämä toiminto palauttaa vain virhekoodin, käytän TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) -toimintoa virhevalon vilkkumiseen. Virhekoodit määritellään kohdassa USI_TWI_Master.h. Voit kutsua sitä seuraavasti: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () Tätä toimintoa käytetään yksittäisten tavujen lukemiseen ja kirjoittamiseen I2C -laitteisiin. Sitä käytetään myös useiden tavujen kirjoittamiseen. Tämän toiminnon käyttämiseen on 6 vaihetta.1) Ilmoita ohjelmasi viestipuskuri, joka pitää orjaosoitteen ja lähetettävän tai vastaanotettavan datatavun. unsigned char messageBuf (MESSAGEBUF_SIZE); 2) Laita orjaosoite puskurin ensimmäiseksi tavuksi. Siirrä sitä yksi bitti vasemmalle ja TAI luku-/kirjoitusbitissä. Huomaa, että luku-/kirjoitusbitti on 1 luku- ja 0 kirjoitusta varten. Tämä esimerkki on tarkoitettu lukemiseen. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (TOSI << TWI_READ_BIT); 3) Kun kirjoitat, laita kirjoitettava tavu puskurin seuraavaan paikkaan. 4) Kutsu USI_TWI_Start_Read_Write -funktio sanomapuskurilla ja viestin koolla argumentteina.temp = USI_TWI_Start_Read_Write (messageBuf, 2); 5) palautettua arvoa (tässä tapauksessa lämpötila) voidaan testata, onko tapahtunut virhe. Jos näin on, se käsitellään edellä kuvatulla tavalla. Katso esimerkkejä ohjelmista. 6) Jos lukua pyydettiin, tavun lukeminen on puskurin toisessa paikassa. Puskurin asettaminen ja rutiinin kutsuminen ovat hieman erilaisia. Puskurin toinen tavu on muistin aloitusosoite, johon kirjoitetaan. Kirjoitettavat tiedot ovat seuraavissa tavuissa. Viestin koko on koko, joka sisältää kaikki kelvolliset tiedot. Jos siis kirjoitetaan 6 tavua, viestin koko on 8 (orjaosoite + muistiosoite + 6 tavua dataa). jonkinlainen muisto. Tämän rutiinin käyttäminen on hyvin samanlaista kuin edellinen rutiini, kahdella poikkeuksella luku- ja kirjoitusbitin asetuksella ei ole väliä. Tämän rutiinin kutsuminen aiheuttaa aina lukutoiminnon. Viestin koon tulee olla 2 plus luettavien tavujen lukumäärä. Jos mitään virheitä ei ole, tiedot ovat puskurissa alkaen toisesta sijainnista. ATmega168: Kellovaatimus: Ajurit on suunniteltu 4 MHz: n kellotaajuudelle ATmega168: lle. Esimerkkikoodi näyttää, kuinka tämä kellotaajuus asetetaan. Jos haluat ajaa muilla nopeuksilla, sinun on säädettävä ohjainten vakioita. TWI_Master_Initialise () Tämä toiminto alustaa TWI -laitteiston I2C -tilan käyttöä varten. Soita se kerran ohjelman alussa. Se palauttaa mitätön ja ei ole argumentteja. Muista ottaa keskeytykset käyttöön soittamalla swi () alustamisen jälkeen. TWI_Get_State_Info () Tämä toiminto palauttaa I2C -virhetiedot ja sitä käytetään, jos I2C -tapahtuman aikana tapahtui virhe. Koska tämä toiminto palauttaa vain virhekoodin, käytän TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) -toimintoa virhevalon vilkkumiseen. Virhekoodit on määritelty TWI_Master.h -tiedostossa, mutta niitä on muokattu ilmoittamaan virhe -LED -valolla. Katso lisätietoja esimerkkikoodista. Voit kutsua sitä seuraavasti: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) Huomaa, että virheentarkistus tehdään varmistamalla, että I2C -tapahtuma on valmis (alla kuvattu toiminto) ja testaamalla sitten vähän yleisessä tilasanassa. TWI_Start_Read_Write () TWI_Start_ kaksi toimintoa toimivat samalla tavalla kuin edellä kuvatut vastaavat toiminnot, mutta muutamaa poikkeusta lukuun ottamatta. Ne eivät palauta virhearvoja. Kun soitat TWI_Start_Random_Read, viestin koon tulee olla pyydettyjen datatavujen määrä plus yksi, ei kaksi. ATmega168: n I2C -ohjain on keskeytyskäyttöinen. Toisin sanoen I2C -tapahtumat käynnistetään ja suoritetaan sitten itsenäisesti, kun päärutiini jatkuu. Kun päärutiini haluaa tietoja sen aloittamasta I2C -tapahtumasta, sen on tarkistettava, onko tiedot saatavilla. Tilanne on sama virheiden tarkistuksessa. Päärutiinin on oltava varma, että I2C -tapahtuma on valmis ennen virheiden tarkistamista. Kaksi seuraavaa toimintoa käytetään näihin tarkoituksiin. TWI_Transceiver_Busy () Kutsu tämä toiminto nähdäksesi, onko I2C -tapahtuma valmis, ennen kuin tarkistat virheet. Esimerkkiohjelmat osoittavat, miten sitä käytetään. TWI_Read_Data_From_Buffer () Kutsu tämä toiminto siirtääksesi tietoja I2C -ohjaimen vastaanottopuskurista sanomapuskuriin. Tämä toiminto varmistaa, että I2C -tapahtuma on valmis ennen tietojen siirtämistä. Vaikka tämä toiminto palauttaa arvon, mielestäni luotettavampi on tarkistaa virhebitti suoraan. Näin voit kutsua sitä. Viestin koon tulee olla yksi suurempi kuin haluttu databitti. Tiedot ovat viestissäBuf alkaen toisesta sijainnista.temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

Vaihe 4: Rakennetaan

Rakennetaan!
Rakennetaan!
Rakennetaan!
Rakennetaan!
Rakennetaan!
Rakennetaan!
Rakennetaan!
Rakennetaan!

Aloita lataamalla tiedosto I2C Schematics.zip. Haluat ehkä luoda työalueellesi I2C -kansion kaavioiden ja esimerkkitiedostojen säilyttämiseksi. Pura kaaviot tähän hakemistoon. Löydät kansion nimeltä I2C Schematics. Avaa tiedosto nimeltä tiny I2C.pdf. Tässä kaaviossa näkyy ATtiny2313 Ghetto Development System ja PCA8574A I/O Port Expander (sen ympärillä on suuri katkoviiva). Port Expander -piiri on rakennettu leipälevylle. Katso valokuvia nähdäksesi miltä nämä piirit näyttävät. Ne ovat todella yksinkertaisia. Kaavion ATtiny2313 -osa on vain Ghetto Development System, jossa on kolme vilkkua (LED1, 2 ja 3 sekä R4, 5 ja 6) ja siihen kiinnitetty painike (S1) sekä yksi lisätietoja. Tämä yksityiskohta on lisäys hyppyjohtimiin (JP4, 5 ja 6), jotka voidaan poistaa, jotta I2C -väylän SCL- ja SDA -linjat voidaan yhdistää. Hyppyjohtimien on oltava ohjelmointia varten ja poistettava, jotta SCL ja SDA voidaan kytkeä. Valokuvat osoittavat puserot paikallaan ja poistettuina. Näiden puseroiden sijoittaminen on sinun tehtäväsi, sinun on vain asetettava ne Ghetto Development System -järjestelmään, jos haluat käyttää I2C -väylää. I2C -väylä on irrotettava ja hyppyjohdot asetettava paikoilleen ohjelmointia varten. Huomaa, että sinun on todella huolehdittava vain JP4: stä ja JP6: sta I2C -väylälle. Laita JP5 sisään, jos luulet koskaan haluavasi käyttää SPI -väylää. Liitä Vcc (+5 volttia) ja Gnd (maa) ja liitä AD0, 1 ja 2 maahan (tekee I2C -orjaosoitteesta 38 heksadesimaalia). Liitä sitten 4 vilkkua ja 4 DIP -kytkintä. (Jos sinulla ei ole DIP-kytkimiä, voit käyttää vain johtoja. Kiinnitä maahan tai jätä kelluva signaaliksi päälle tai pois päältä.) Lopuksi kytke vetovastus (R11 ja 12) SDA: sta ja SCL: stä Vcc: hen. Nämä näytetään 3.3K, mutta minkä tahansa arvon 1.8K - 5.1K pitäisi toimia (ehkä jopa 10K, mutta en ole kokeillut sitä). Kun olet ohjelmoinut ATtiny2313: n, voit poistaa hyppyjohdot ja kytkeä SDA: n ja SCL: n testausta varten. Nyt ATmega168: lle. Ainoa ryppy tässä on se, että et ehkä ole rakentanut Ghetto -kehitysjärjestelmää tälle prosessorille. Jos näin on, tarjoamani kaavio (MEGA I2C.pdf) näyttää kuinka. Tämä on vain permutaatio ATtiny2313 -versiosta. Jos suunnittelet etukäteen, voit varmistaa, että ohjelmointikaapeli sopii molempiin järjestelmiin. Suurin ero on C2: n ja C3: n lisääminen. Katso näiden sijoittelusta kuvat, niiden tulisi olla hyvin lähellä sirua; yksi niistä on sirun alla. Nämä auttavat pitämään melun poissa erityisesti analogisesta digitaalimuuntimeen. Sinun ei tarvitse laittaa puseroita, ellet aio käyttää SPI -väylää, koska niitä ei tarvita tämän sirun I2C -väylälle. Huomaa, että PCA8754A -leipälevy ei muutu. Yhdistät vain SDA: n ja SCL: n ja lähdet! Helppoa, vai?

Vaihe 5: Koodataan ja testataan

Koodataan ja testataan!
Koodataan ja testataan!
Koodataan ja testataan!
Koodataan ja testataan!
Koodataan ja testataan!
Koodataan ja testataan!

On aika rakentaa ohjaimet ja esimerkkiohjelmat. Aloitamme ATtiny2313: sta ja juuri rakentamastamme PCA8574A -leipälevystä. Lataa tiedosto I2C.zip I2C -työhakemistoosi ja pura se. Sinulla on uusi kansio nimeltä I2C. Siinä on USI I2C (ATtiny2313) ja TWI I2C (ATmega168). USI I2C: stä löydät I_O Port -kansion. Tämä kansio sisältää ensimmäisen esimerkkiohjelmamme koodin ja USI I2C -ohjaimet. WinAVR: n avulla koota ja lataa koodi ATtiny2313: een. Hengitä syvään ja kytke virta päälle. Tässä on mitä odottaa: Kun virta kytketään päälle, ATtiny2313 -portin PD6 -merkkivalo 1 vilkkuu kahdesti, eikä mitään muuta tapahdu ennen kuin painat painiketta (S1). Joka kerta, kun painiketta painetaan, kytkimet luetaan ja niiden asetukset näkyvät PCA8574A -laitteeseen kytketyissä LED -valoissa. Muuta kytkimien arvoa, paina painiketta ja LED -merkkivalot vaihtuvat. Jatka tätä, kunnes pääset yli jännityksestä nähdä sen toimivan. Jos (Jumala varjelkoon!) Asiat eivät toimi odotetulla tavalla, tarkista johdotus huolellisesti. I2C -virheet ilmaistaan LED3: n (PD4) vilkkumalla ja tarkoittavat todennäköisesti, että sinun on tarkistettava, että SDA ja SCL on kytketty oikeisiin nastoihin ja että ne on vedetty oikein. Jos asiat eivät vieläkään toimi, lue loput tästä osiosta saadaksesi lisätietoja virheenkorjauksesta. Palaa nyt ja katsotaan koodia. Avaa tiedosto USI_I2C_Port.c. Tämä on esimerkkiohjelman koodi. (USI_TWI_Master.c ja USI_TWI_Master.h sisältävät ohjaimet - voit jättää ne huomiotta, ellet ole utelias.) Käytä tätä esimerkkiä omien I2C -sovellusten ohjaamiseen. ylös orjaosoite ja loput sanomapuskurista ja datan poistaminen siitä. Näet myös, kuinka poistan painikkeen ja asetan while -silmukan. Ohjelmassa on muutamia mainitsemisen arvoisia yksityiskohtia. Huomaa, että kytkinten tiedot käännetään ennen kuin ne kirjoitetaan portin laajennuksen LED -valoihin. Huomaa myös, että Port Expanderin tuloportit on kirjoitettava korkeiksi, jotta ne toimivat oikein. Nämä tiedot on kuvattu PCA8574A -tietolomakkeessa. Lue aina tietolomakkeet huolellisesti! Ehdollisen virheenkorjauksen käyttö kiinnostaa enemmän. Lähellä ohjelmatiedoston alkua on lause // #define DEBUG ja koko koodin päälle sirotellaan #ifdef DEBUG -lausekkeita. Niin kauan kuin DEBUG ei ole määritelty (kaksi viivaa tekevät rivistä kommentin ja estävät sen määrittelyn), lausekkeiden #ifdef - #endif koodia ei koota. Mutta jos asiat eivät toimi odotetulla tavalla, käännä ja lataa koodi uudelleen #define DEBUG -komponentilla. Saat paljon enemmän välähdyksiä LEDeissä, jotka voit purkaa seurataksesi ohjelman suorittamista ja auttaa sinua löytämään tarkalleen missä asiat menevät pieleen. Itse asiassa suosittelen kokeilemaan tätä vain nähdäksesi mitä tapahtuu. Näet, että LED 2 (PD5: ssä) vilkkuu, kun suoritus etenee ohjelman aikana. Kytkimistä luettu arvo vilkkuu LED 1: ssä (PD6), ennen kuin se näkyy portin laajennuksen LED -valoissa. Sinun pitäisi pystyä seuraamaan ohjelmaa sen toimiessa käyttämällä näitä LED -valoja. ohita tämä osio, jos olet kiinnostunut vain ATtiny2313: sta. Yhä kanssani? Hyvä. Siirry TWI_I2C -kansioon, muuta työhakemistoksi IO_Port ja käännä ja lataa TWI_I2C_Port.c ATmega168: een. Irrota SDA- ja SCL -linjat ATtiny2313: sta ja liitä ne ATmega168: een. Kytke virta ja maadoitus ja kytke virta. Operaation pitäisi olla sama! Pelaa, kunnes jännitys lakkaa ja katsotaan sitten koodia. Avaa TWI_I2C_Port.c. Koodi on lähes identtinen lukuun ottamatta virheiden käsittelyä ja keskeytyksellä ajettujen kuljettajien ottamista huomioon. Tässä on erot: Huomaa, että kello on asetettava 4 MHz: iin, jotta I2C -väylä toimii oikein. Sei (); lausunto kytkee keskeytykset päälle I2C -ohjainten alustamisen jälkeen. Virheiden tarkistamiseksi testataan tietty tilabitti. Lukemisen aikana TWI_Read_Data_From_Buffer -toiminto on kutsuttava, jotta luetut tiedot voidaan siirtää viestipuskuriin. Kirjoituksen aikana (TWI_Transceiver_Busy ()) on käytettävä varmistaaksesi, että siirto on valmis ennen virheiden tarkistamista. Nämä kaksi viimeistä toimintoa on kuvattu edellä ohjainten kuvauksessa. Muuten koodi on suunnilleen sama kuin ATtiny2313. DEBUG toimii samalla tavalla, jos haluat kokeilla sitä.

Vaihe 6: I2C -muistin käyttäminen

I2C -muistin käyttö
I2C -muistin käyttö
I2C -muistin käyttö
I2C -muistin käyttö
I2C -muistin käyttö
I2C -muistin käyttö
I2C -muistin käyttö
I2C -muistin käyttö

Nyt kun olemme oppineet käyttämään I2C -väylää I/O -portin laajentimen lukemiseen ja kirjoittamiseen, siirrytään käyttämään I2C -muistia, sekä RAM -muistia että EEPROM -muistia. Suurin ero on, että useita tavuja voidaan lukea muistiin tai kirjoittaa muistista yhdellä I2C -komennolla. Jotta voimme valmistautua näihin kokeisiin, meidän on muutettava laitteistoa hieman ja rakennettava pari uutta piiriä leipälevylle. Säilytä Port Expander -piiri, koska käytämme sitä joidenkin muistiarvojen näyttämiseen. Irrota DIP -kytkimet PCA8574A -laitteesta ja aseta vilkkuvalot näihin nastoihin. Jos sinulla ei ole tarpeeksi vilkkua, siirrä P4: stä P7: een olevat valot P0: sta P3: een. (Näytettävät arvot ovat riittävän pieniä.) Katso nyt kaaviomaista I2C Ram.pdf -tiedostoa ja kytke PCF8570 leipälevylle. Katsokaa myös kuvaa. Muista sitoa nasta 7 Vcc: hen. Käytä PCA8574A: n johtoja SDA: lle ja SCL: lle. Jos olet kiinnostunut myös EEPROMista, rakenna piiri käyttämällä myös I2C EEPROM.pdf -versiota 24C16-laitteelle, mutta varoitan, että esimerkki käyttää ATmega168: ta. Tämä piiri on todella yksinkertainen. Kuten edellä keskusteltiin, osoitebitit tulisi jättää huomiotta. Kytke vain virta ja maadoitus. Älä vielä yhdistä SDA: ta ja SCL: ää, koska emme ole lopettaneet Ramin kokeilua. Aloitamme muistikokeemme ATtiny2313: lla, joka on kytketty PCA8574A Port Expanderiin ja PCF8570 Ramiin. Ohjelma kirjoittaa joitain numeroita Ramiin, lukee ne sitten ja näyttää ne Port Expanderissa. Käytä make -tiedostoa USI_I2C_RAM.c: n kokoamiseen ja lataamiseen. Huomaa, että I2C -ohjaintiedostot ovat identtisiä aiemmin käyttämiemme tiedostojen kanssa. Kytke virta ja LED -valon 1 (PD6) pitäisi vilkkua vain kerran. Tiedot kirjoitetaan muistin neljään ensimmäiseen tavuun. Paina painiketta ja kaksi tavua luetaan takaisin ja näytetään. Sinun pitäisi nähdä yksi LED -valo portin laajentimessa (P0), kahden sekunnin tauko ja sitten kaksi LEDiä (P0 ja P1). Toinen kahden sekunnin tauko ja merkkivalojen pitäisi sammua. Aloita sarja painamalla painiketta uudelleen. Virheenkorjaus on samanlainen kuin edellä kuvattu menetelmä, katsotaanpa koodia. Avaa USI_I2C_RAM.c. Sen pitäisi näyttää aika samalta kuin edellinen koodi. Suurimmat erot ovat luku- ja kirjoitusmuistin yksityiskohdat. Katso, miten viestipuskuri ladataan ennen puhelua, joka todella kirjoittaa. Ensimmäinen tavu on orjaosoite, jossa luku-/kirjoitusbitti on asetettu asianmukaisesti. Mutta seuraava tavu on muistiosoite, josta tietojen kirjoittaminen aloitetaan. Sitten tulee todelliset datatavut, jotka ladataan peräkkäin muistiin määrittämästämme osoitteesta alkaen. Määritämme viestin koon 6. Joten aloitamme kirjoittamisen osoitteesta 00 ja kirjoitamme arvot 01, 03, 02 ja 06 muistipaikkoihin 00-03. Jotta voimme lukea tiedot takaisin muistista, meidän on käytettävä USI_TWI_Start_Random_Read -funktiota. Sanomapuskuri saa orjaosoitteen ensimmäiseen tavuun ja aloitusosoitteen toiseen tavuun. Soita sitten toimintoon, jossa viestin koko on asetettu luettavien tavujen määrään plus 2. Huomaa, että luku-/kirjoitusbitillä ei ole väliä, koska luku suoritetaan riippumatta. Palautetut tiedot alkavat sanomapuskurin toisesta sijainnista. Kun tiedot on luettu, ne käännetään Port Expanderin näytettäväksi ja kirjoitetaan yksi tavu kerrallaan, ja arvojen välissä on tauko. Lopuksi Port Expander -merkkivalot sammuvat. Kirjoitukset Port Expanderille ovat samat kuin edellisissä esimerkeissä. Hauskanpitoon voit poistaa kommentin #define DEBUG -lauseesta kuten yllä ja nähdä paljon vilkkuvia LED -valoja. Jännittyneenä toisen onnistuneen kokeen jälkeen siirrymme ATmega168: een ja EEPROMiin. Vaihda työhakemistoksi EEPROM TWI I2C -tilassa. Käytä make -tiedostoa TWI_I2C_EEPROM.c -tiedoston kääntämiseen ja lataamiseen. Huomaa, että I2C -ohjaintiedostot ovat samat kuin ne, joita käytimme aiemmin PCA8574A: ssa. Testaa ohjelmaa irrottamalla ATtiny2313 ja kytkemällä ATmega168. Jätä I2C -väylä koukkuun Ramiin ja kytke virta. Tulokset ovat erilaisia, koska nyt kirjoitamme ja luemme enemmän dataa. PD7: n LED 1: n pitäisi vilkkua alustamisen yhteydessä. Paina painiketta, jolloin tiedot luetaan muistista ja näytetään. PCA8574: n merkkivalojen pitäisi vilkkua seuraavassa järjestyksessä: P1, P0 & P2, (kaikki pois päältä), P0 & P1, P1 & P2. Lopuksi portin merkkivalot sammuvat. Toista tämä painamalla painiketta uudelleen. Voi, mutta odota. Eikö tämä ohjelma ole EEPROMille? Koska käytämme muistilaitetta samalla I2C -osoitteella, sama ohjelma toimii sekä Ramissa että EEPROMissa. Sammuta ja siirrä SDA ja SCL Ramista EEPROMiin ja suorita ohjelma uudelleen. Sen pitäisi toimia täsmälleen samalla tavalla. Huomaa, että EEPROM ja Ram eivät voi olla yhteydessä I2C -väylään samanaikaisesti, koska niillä on sama osoite. (Älykkäät teistä saattavat harkita Ramin ohjelmoitavien osoitebittien muuttamista, mutta se ei silti toimi. 24C16 käyttää koko Ramille ohjelmoitavaa osoitelohkoa.) OK, katsotaan tätä viimeistä ohjelmaa. Avaa TWI_I2C_EEPROM.c. Ensimmäinen asia on huomata, että olen ilmoittanut, kuinka käsitellä koko 24C16 EEPROM. Siihen pääsee 256 tavuina 8 eri I2C -orjaosoitteessa. Katso, miten MEMORY_ADDR määritetään aloitusosoitteeksi 50 heksadesimaalissa; siksi Ram toimi. Jos haluat käyttää muita 24C16 -lohkoja, käytä muita osoitteita, kuten olen ilmoittanut. Katsokaa, miten päädyin kirjoittamaan muistiin. Ensin puskuriin laitetaan orjaosoite luku-/kirjoitusbittijoukolla, sitten aloitusosoite 00 ja sitten 16 tavua dataa. Funktiota TWI_Start_Read_Write kutsutaan kirjoittamaan dataa (kuten ennenkin), kun viestin koko on 18. Kun painiketta painetaan, käytämme TWI_Start_Random_Read- ja TWI_Read_Data_From_Buffer -ohjelmia tietojen palauttamiseen. Portin laajennuksen LED -valot näyttävät joka kolmas tavu. Lopuksi LEDit sammuvat odottamaan seuraavaa painikkeen painallusta. Saatat ihmetellä, miksi päätin kirjoittaa 16 tavua. Jos luet tietolomakkeen huolellisesti, huomaat, että 24C16 tekee kirjoitussyklin aina, kun se vastaanottaa 16 tavua, vaikka lähetettäisiin enemmän tavuja. Joten se tuntui mukavalta numerolta käyttää. Jos päätät lisätä tätä, sinun on muutettava MESSAGEBUF_SIZE -kokoa. Sinun on myös muutettava arvoa TWI_BUFFER_SIZE kohdassa TWI_Master.h. Tämä johtuu siitä, että ohjain kopioi tiedot sanomapuskurista keskeytyspalvelurutiinin käyttöön. Onnittelut! Olet nyt valmis käyttämään I2C -väylää omissa projekteissasi!

Vaihe 7: Web -resurssit

Tässä on linkit kokeisiin käytettyjen osien tietolomakkeisiin. Sinun pitäisi ehdottomasti hankkia nämä, jos et saa mitään muuta. (He haluavat käyttää hakasulkeita URL -osoitteissaan, joten en voi sisällyttää niitä oikein tänne. Anteeksi.] Pääset I2C -alueelle valitsemalla Tuotteet -luettelosta Liitäntä. Pääset heidän I2C -sivustoonsa ja pääsy kaikkiin tarjoamiinsa tietolomakkeisiin ja sovelluksiin. I2C -väylän kuvaus ja tekniset tiedot ovat täällä. Hanki ATtiny2313- ja ATmega168 -tietolomakkeet (datakirjat?) Atmelilta. Atmel -sovelluksen huomautukset ovat täällä. Katso AVR310 ja AVR315. Nappaa koodi myös. Katso täältä paljon muuta I2C -tavaraa.

Vaihe 8: Huomautuksia Geeksille

Todelliselle nörtille, joka haluaa tietää yksityiskohdista, tässä on muutamia asioita, jotka on pidettävä mielessä, jos katsot Atmel Apps -muistiinpanoja ja ohjainkoodia:- I2C-laitteen osoittamis- ja komentomenetelmä ei ole osa teknistä tietoa! Muita kuin orjaosoite ja luku-/kirjoitusbitti, komentoja, tiloja jne. Ei ole määritetty ja ne ovat ominaisia tietylle laitteelle. Jotta tämä olisi hyvin selvää, huomaa, että Atmel-esimerkissä käytetty kaava koskee vain kyseistä esimerkkiä ja on melko epätyypillinen.- USI-toteutus eroaa TWI-toteutuksesta muutamalla tärkeällä tavalla. + USI: n avulla kellon tarjoaa ohjelmisto; TWI: n avulla sen tarjoaa bittinopeusgeneraattori. + USI -menetelmä ei käytä keskeytyksiä; TWI tekee. Tämä on tietysti järkevää, koska Mega -perhe (joka käyttää TWI: tä) voisi tehdä paljon muuta, eikä sitä pitäisi hukuttaa I2C -siirroilla. Keskeytyskäyttöinen versio USI: lle on varmasti mahdollista, sitä ei vain ole toteutettu tässä ohjeessa. + USI -laitteistoa ei ole optimoitu I2C: lle, ja se pystyy käsittelemään vain 8 -bittisiä siirtoja. Tämä tarkoittaa, että yhdeksännen bitin lähettämiseen tarvitaan kaksi siirtoa (joko NACK tai ACK). TWI -laitteisto käsittelee tämän automaattisesti. Tämä tekee USI -ohjaimen toteutuksesta hieman monimutkaisemman. + TWI: n virheentunnistus hoidetaan laitteistossa. USI edellyttää ohjelmistojen käsittelyä, mikä vaikeuttaa asioita jonkin verran. + TWI -laitteisto ohjaa portin asetuksia suoraan. USI -laitteisto edellyttää, että porttibitit on määritettävä ennen portin käyttöä. Näet tämän USI: n Master_Initialize-rutiinissa.-Atmel väittää, että on mahdollista käyttää AVR-portin vetoja I2C-väylän vetämiseen. En ole keksinyt keinoa saada tätä lähestymistapaa toimimaan. Kahden ulkoisen vastuksen käyttäminen vaikuttaa melko yksinkertaiselta järjestelmältä, joten en viettänyt paljon aikaa tähän.

Suositeltava: