Sisukord:

I2C buss ATtiny ja ATmega jaoks: 8 sammu
I2C buss ATtiny ja ATmega jaoks: 8 sammu

Video: I2C buss ATtiny ja ATmega jaoks: 8 sammu

Video: I2C buss ATtiny ja ATmega jaoks: 8 sammu
Video: LDmicro 14: ЖК-дисплей I2C и часы реального времени DS3231 (программирование лестничной схемы ПЛК микроконтроллера с помощью LDmicro) 2024, Juuli
Anonim
I2C buss ATtiny ja ATmega jaoks
I2C buss ATtiny ja ATmega jaoks

Ma armastan Atmel AVR mikrokontrollereid! Pärast käesolevas juhendis kirjeldatud Ghetto arendussüsteemi ehitamist ei ole mul olnud lõbu katsetada AVR ATtiny2313 ja eriti ATmega168. Ma läksin isegi nii kaugele, et kirjutasin Instructable'i lülitite kasutamiseks sisendina ja laiendasin Ghetto Development System kontseptsiooni CPLD -dele. Hiljutise projekti käigus vajasin kontrollväärtuste määramiseks mitut lülitit. AVR -idel ei olnud piisavalt sisend-/väljundpistikuid, nii et pidin midagi välja mõtlema. Oleksin võinud proovida keerulist klaviatuuri ja ekraaniga sisendsüsteemi, kuid ATtiny2313 oleks ressursid otsas. Õnneks on Atmel selle probleemi lahendanud, lisades liidese, mis saab lihtsa kahe juhtmega liidesega linkida täiendavate kiipidega (nt mälu või I/O pordid). See on õige, kasutades AVR -is vaid kahte I/O -kontakti, pääseme juurde paljudele täiendavatele I/O -pistikutele ja ka muudele ressurssidele. See kahe juhtmega liides on ametlikult tuntud kui integraallülituse siin või lihtsalt I2C siin ja selle leiutas NXP, kui see oli veel Philips Semiconductors. Kui loete seda juhendit, siis olete ilmselt kuulnud I2C siinist ja isegi kasutanud seda PIC -il või muul mikrokontrolleril. Ehkki I2C -siini kasutamiseks on tarkvaradraiverid kontseptuaalselt väga lihtsad ja neid toetavad riistvararessursid AVR -idel, on need siiski vajalikud. Atmel pakub rakenduse märkmeid (vt selle juhendi ressursse hiljem), kuid need on puudulikud ega näita ühtegi näidet peale teise AVR -seadmega suhtlemise. Selle juhendi eesmärk ei ole õpetada kellelegi, kuidas luua I2C draivereid AVR -id. Pigem pakun ATtiny2313 ja ATmega168 seadmete jaoks Atmeli draiverite laiendatud versioone, selgitan nende kasutamisel kehtivaid nõudeid ja piiranguid ning näitan teile I2C seadmete näiteid. Kui olete selle juhendi läbi töötanud, saate oma AVR -i projektides I2C -bussi edukalt kasutada. Ilmselgelt võite pisikeste või MEGA draivereid ignoreerida, kui olete huvitatud ainult ühest neist. Neile, kes on huvitatud I2C bussi kohta rohkem teada saama, annan lingid sobivale materjalile.

Samm: mis see I2C kraam ikkagi on?

Mis see I2C kraam ikkagi on?
Mis see I2C kraam ikkagi on?
Mis see I2C kraam ikkagi on?
Mis see I2C kraam ikkagi on?
Mis see I2C kraam ikkagi on?
Mis see I2C kraam ikkagi on?
Mis see I2C kraam ikkagi on?
Mis see I2C kraam ikkagi on?

I2C siin on lihtne kahejuhtmeline ühendus, mis võib ühendada mitu seadet ja võimaldada neil andmeid vahetada. Lihtsamal kujul on üks põhiseade, mis suhtleb mitme alamseadmega. Kõik seadmed on ühendatud paralleelselt I2C siini kahe juhtmega. Kaks juhet on tuntud kui SCL ja SDA. SCL on kellajoon ja seda juhib põhiseade. SDA on kahesuunaline andmerea. Andmete edastamiseks saadab kapten alam -aadressi koos ühebitise lugemis-/kirjutamislipuga. Kui soovitakse kirjutada, jätkab kapten andmete saatmist adresseeritud alamseadmele. Kui nõutakse lugemist, vastab ori andmetega. Tehingute koordineerimiseks manipuleerivad kapten ja alluv SCL ja SDA liinidega, et anda märku mitmetest tingimustest. Nende hulka kuuluvad START, STOP, ACK (kinnita) ja NAK (ei kinnita). Nende tingimuste üksikasju käsitlevad autojuhid. Tõelised geekid teie seas saate õppida kõiki üksikasju selle juhendi lõpus toodud linkidel. Elektrinõuded on üsna lihtsad. Ülem ja orjad peavad Vcc jaoks kasutama sama taset, maandused peavad olema ühendatud ning SCL ja SDA liinid tuleb tõmmata kuni Vcc. Tõmbetakistite väärtus määratakse täpselt arvutusega, mis põhineb bussi kogumahtuvusel, kuid praktiliselt võib see olla peaaegu iga väärtus vahemikus 1,8K kuni 10K. Alustan 5.1K -st ja kasutan madalamaid väärtusi, kuni see töötab. Tavaliselt pole see probleem, kui teil pole seadmete vahel palju seadmeid või pikk traat. I2C siinil on nominaalne andmeedastuskiirus 100 kbit/s. Võimalikud on ka kiirused 400 kb/s, 1 MB/s ja kaugemal, kuid selle juhendi juhid neid ei toeta. Kõik I2C -seadmed töötavad kiirusega 100 kbit/s. ATtiny2313 ja ATmega168 rakendavad I2C -bussi erinevalt. ATtiny2313 kasutab universaalse jadaliidese (USI) riistvara - seda saab kasutada ka SPI -siini jaoks. ATmega168 -l on spetsiaalne riistvara I2C siinile, mida tuntakse kahe juhtme liidesena (TWI). Kui draiverid on kirjutatud, on need erinevused kasutajale enamasti läbipaistvad. Üks oluline erinevus on tarkvaras: ATmega168 I2C draiver on katkestatud, ATtiny2313 puhul aga mitte. See tähendab, et programm ATmega168 ei pea ootama I2C andmeedastuse toimumist, vaid peab ootama ainult enne teise ülekande alustamist või kuni lugemisoperatsiooni andmete saabumiseni. Järgnevad näited ja arutelu peaksid selle selgeks tegema. I2C -aadressid on 7 -bitised, seega võib bussis olla kuni 127 seadet, kui neil on ainulaadne aadress. Nagu on näidatud joonisel, nihutatakse seda 7 -bitist aadressi ühe bitti vasakule ja kõige vähem olulist bitti kasutatakse seadme lugemise või kirjutamise märkimiseks aadressil. Seega on orja täielik aadress 8 -bitine bait. Tegelik aadress on osaliselt seadme sisemiselt määratud ja seda ei saa muuta (4 kõige olulisemat bitti) ning osaliselt määravad bitid, mis võivad olla ühendatud seadme tihvtidega (3 kõige vähem olulist bitti), mida saab seadistada kõrgeks või madalaks konkreetne aadress. Kõlab segaselt, kuid näide teeb selle selgeks. PCA8574A andmeleht näitab, et I2C aadressi neli kõige olulisemat bitti on alati 0111. Järgmised kolm bitti määratakse tihvtide AD0, AD1 ja AD2 seadete järgi. Need tihvtid saab siduda maapinnaga või positiivse pingega (5 volti), et tähistada vastavalt 0 või 1. Seega on võimalike aadresside vahemik 38–3 F kuueteistkümnendarv, nagu on näidatud PCA8574 andmelehe teisel joonisel. Nii et aadressibittide seadeid muutes võib I2C siinil olla korraga kuni 8 PCA8574A -d. Igaüks vastab ainult oma konkreetsele orja aadressile. Kui on vaja veelgi rohkem I/O porte, saab kasutada PCA8574. Ainus erinevus PCA8574 ja PCA8574A vahel on see, et PCA8574 I2C alam -aadressivahemik on 20–27 kuueteistkümnendarv. Antud seadme aadressi määramine võib olla segane, kuna mõned andmelehed peavad lugemis-/kirjutamisbitti osaks aadress. Lugege hoolikalt andmelehte ja pidage meeles, et alam -aadress on 7 bitti pikk. Lugemis-/kirjutamisbitti tuleks käsitleda eraldi. Jällegi aitab näide. 24C16 EEPROMi andmeleht, millega me katsetame, ütleb, et alam -aadressi esimesed (kõige olulisemad) neli bitti on 1010. Järgmised kolm bitti saab määrata A0, A1 ja A2 abil; kuid pange tähele, et andmeleht hõlmab ka 24C01 kuni 24C08, mis on väiksema suurusega EEPROM -id. Andmelehe joonis näitab, et nende aadressibittide seadeid ignoreeritakse suuruse kasvades ja neid eiratakse 24C16 puhul täielikult. See tähendab, et viimased kolm bitti pole olulised ja 24C16 kasutab tõesti kõiki I2C alam -aadresse 50 kuni 57 kuueteistkümnendikku. Alam -aadresside vahemik käsitleb tegelikult 24C16 erinevaid sektsioone. Esimesed 256 baiti on aadressil 50h, järgmised 256 kell 51h ja nii edasi kuni viimase 256 baiti kell 57h - kokku 2K baiti. Kuna meie katsetatud PCF8570 RAM -i aadress on selles vahemikus, ei saa 24C16 ja PCF8570 koos kasutada.

Samm: tellige mõned I2C -seadmed

Nüüd, kui teate natuke I2C siinist ja soovite seda kasutada, siis miks mitte tellida mõned I2C -seadmed kohe katsetamiseks, et need saaksid teie poole teele, kui olete tarkvara valmis? Asjakohased seadmed sisaldavad I/ O Interface Expander (minu lemmik), staatiline mälu ja EEPROM. Neid on veel palju, kuid see on suurepärane algus. Meie kasutatavad AVR -protsessorid on ATtiny2313 ja Atmega168 (kasutatakse Arduinos). Kui te pole nendega uus, vaadake seda suurepärast juhendit, et nende kohta teada saada ja oma Ghetto arendussüsteemi üles ehitada. ATmega168 skeem käesolevas juhendis näitab, kuidas selle protsessori jaoks Ghetto arendussüsteemi rakendada. Paralleelpordi kaabel on sama mis ATtiny2313. (Ma ei ole proovinud Ghetto arendussüsteemi USB -versiooni, nii et ma pole kindel, kuidas I2C siinile juurde pääseb. Sama kehtib ka Arduino kohta.) Siin on Digikey osade numbrid. Port Expander: IC I2C I/O EXPANDER 568-4236-5-NDRam: IC SRAM 256X8 W/I2C 568-1071-5-NDEEPROM: IC EEPROM SERIAL 16K CAT24C16LI-G-ND

Samm: I2C draiverid

Siin on I2C bussi juhi funktsioonide kirjeldused. Need töötati välja Atmel Apps Notes jaoks. Ma ei oleks saanud seda teha ilma nendeta alusena, millele tugineda. Arendamiseks kasutati WinAVR -i ja gcc C kompilaatorit. Kellakiiruse piiranguid kirjeldatakse allpool iga protsessori kohta. Kuna ma ei saa testida kõiki võimalikke protsessori maitse- ja taktsageduse kombinatsioone, jään lihtsalt selle juurde, mida ma tegelikult saan katsetada, ja püüan märkida piirangud ja piirangud. Siin on draiveri funktsioonid ja nende kasutamine. Palun vaadake näiteid, et saada lisateavet ja näha funktsioone, mida kasutatakse täielikes programmides. ATtiny2313: Kella nõue: draiverid on ette nähtud ATtiny2313 taktsageduseks 1MHz (vaikimisi). Kui soovite töötada teiste kiirustega, peate draiverites konstandeid kohandama. Saatke mulle meil, kui vajate selle tegemisel abi. Näpunäiteid saate ka Atmeli rakenduste märkmetest ressursside sammu linkidel. USI_TWI_Master_Initialise () See funktsioon lähtestab USI riistvara I2C -režiimi jaoks. Helistage sellele korra programmi alguses. See tagastab tühja ja argumente pole. USI_TWI_Get_State_Info () See funktsioon tagastab I2C veateabe ja seda kasutatakse juhul, kui I2C tehingu ajal ilmnes tõrge. Kuna see funktsioon tagastab ainult veakoodi, kasutan vea LED -i vilkumiseks funktsiooni TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg). Veakoodid on määratletud jaotises USI_TWI_Master.h. Kuidas seda nimetada: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () Seda funktsiooni kasutatakse üksikute baitide lugemiseks ja kirjutamiseks I2C seadmetesse. Seda kasutatakse ka mitme baidi kirjutamiseks. Selle funktsiooni kasutamiseks on kuus sammu.1) Kuulutage oma programmis sõnumipuhver, et hoida alluv aadress ja saadetav või vastuvõetav andmebait. unsigned char messageBuf (MESSAGEBUF_SIZE); 2) Pange alam -aadress puhvrisse esimese baidina. Liigutage seda natuke vasakule ja VÕI lugemis-/kirjutamisbittis. Pange tähele, et lugemis-/kirjutamisbitt on lugemiseks 1 ja kirjutamiseks 0. See näide on mõeldud lugemiseks. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (TRUE << TWI_READ_BIT); 3) Kirjutamise ajal pange kirjutatav bait puhvrisse järgmisesse kohta. 4) Helistage USI_TWI_Start_Read_Write funktsioonile koos sõnumipuhvri ja sõnumi suurusega argumentidena.temp = USI_TWI_Start_Read_Write (messageBuf, 2); 5) tagastatud väärtust (antud juhul temp) saab testida, et näha, kas tekkis viga. Kui jah, siis käsitletakse seda ülalkirjeldatud viisil. Vaadake näiteid programmides. 6) Kui taotleti lugemist, on baitide lugemine puhvri teises kohas. Kui kirjutada mitu baiti (näiteks mäluseadmesse), saab sama rutiini kasutada. Puhvri seadistamine ja rutiini kutsumine on veidi erinevad. Puhvri teine bait on lähtemälu aadress, kuhu kirjutada. Kirjutatavad andmed on järgmistes baitides. Sõnumi suurus on suurus, mis sisaldab kõiki kehtivaid andmeid. Seega, kui kirjutada 6 baiti, on sõnumi suurus 8 (alam -aadress + mäluaadress + 6 baiti andmeid). USI_TWI_Start_Random_Read () Seda funktsiooni kasutatakse mitme baidi lugemiseks I2C -seadmest, tavaliselt on see oluline ainult mingi mälestus. Selle rutiini kasutamine on väga sarnane eelmise rutiiniga, välja arvatud kaks erandit. Loe/kirjuta bitti säte pole oluline. Selle rutiini kutsumine põhjustab alati lugemisoperatsiooni. Sõnumi suurus peaks olema 2 pluss loetavate baitide arv. Kui vigu ei esinenud, on andmed puhvris alates teisest asukohast. ATmega168 puhul: Kella nõue: draiverid on ette nähtud ATmega168 taktsageduseks 4 MHz. Näidiskood näitab, kuidas seda taktsagedust määrata. Kui soovite töötada teiste kiirustega, peate draiverites konstandeid reguleerima. Kui teil on vaja seda teha, saatke mulle e -kiri. TWI_Master_Initialise () See funktsioon lähtestab TWI riistvara I2C -režiimi jaoks. Helistage sellele korra programmi alguses. See tagastab tühimiku ja argumente pole. Kindlasti lubage katkestused, helistades pärast lähtestamist swi (). TWI_Get_State_Info () See funktsioon tagastab I2C veateabe ja seda kasutatakse juhul, kui I2C tehingu ajal ilmnes tõrge. Kuna see funktsioon tagastab ainult veakoodi, kasutan vea LED -i vilkumiseks funktsiooni TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg). Veakoodid on määratletud rakenduses TWI_Master.h, kuid neid on muudetud vea LED -il signaalimiseks. Üksikasju leiate näidiskoodist. Seda saab nimetada järgmiselt: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) Pange tähele, et veakontrolli tehakse veendumaks, et I2C -tehing on lõpule viidud (allpool kirjeldatud funktsioon) ja seejärel katsetatakse natuke globaalses olekusõnas. TWI_Start_Read_Write () TWI_Start_and kaks funktsiooni toimivad samamoodi nagu vastavad ülalkirjeldatud funktsioonid, kuid mõne erandiga. Need ei tagasta ühtegi veaväärtust. Loetud andmeid ei edastata puhvrisse. Seda tehakse järgnevalt kirjeldatud funktsiooni abil. Kui helistate TWI_Start_Random_Read, peaks sõnumSize olema taotletud andmebaitide arv pluss üks, mitte kaks. ATmega168 I2C draiver on katkestatud. See tähendab, et I2C tehingud käivitatakse ja seejärel käivitatakse iseseisvalt, samal ajal kui põhirutiin jätkub. Kui põhirutiin soovib andmeid alustatud I2C tehingust, peab ta kontrollima, kas andmed on saadaval. Vigade kontrollimisel on olukord sama. Peamine rutiin peab enne vigade kontrollimist olema kindel, et I2C tehing on lõpule viidud. Nendel eesmärkidel kasutatakse kahte järgmist funktsiooni. TWI_Transceiver_Busy () Helistage sellele funktsioonile, et näha enne vigade kontrollimist, kas I2C -tehing on lõpule viidud. Näidisprogrammid näitavad, kuidas seda kasutada. TWI_Read_Data_From_Buffer () Helistage sellele funktsioonile, et edastada andmed I2C draiveri vastuvõtupuhvrist sõnumipuhvrisse. See funktsioon tagab enne andmete edastamist, et I2C -tehing on lõpule viidud. Kuigi see funktsioon tagastab väärtuse, leian, et veabiti kontrollimine otse on usaldusväärsem. Siin on, kuidas seda nimetada. Sõnumi suurus peaks olema soovitud andmebittide arvust üks kord suurem. Andmed on sõnumisBuf alates teisest asukohast.temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

4. samm: ehitame

Ehitame!
Ehitame!
Ehitame!
Ehitame!
Ehitame!
Ehitame!
Ehitame!
Ehitame!

Alustuseks laadige alla fail I2C Schematics.zip. Võimalik, et soovite oma tööpiirkonda luua I2C kausta, kus on skemaatika ja programmi näidisfailid. Pakkige skeemid sellesse kataloogi lahti. Leiate kausta nimega I2C Schematics. Avage fail nimega tilluke I2C.pdf. See skemaatika näitab ATtiny2313 Ghetto arendussüsteemi ja PCA8574A I/O pordi laiendit (selle ümber on suur katkendlik kast). Port Expander ahel on ehitatud leivaplaadile. Vaadake fotosid, et näha, millised need vooluringid välja näevad. Need on tõesti üsna lihtsad. Skeemi ATtiny2313 osa on lihtsalt Ghetto arendussüsteem, millel on kolm vilkurit (LED1, 2 ja 3, pluss R4, 5 ja 6) ja selle külge kinnitatud nupp (S1), pluss üks täiendav detail. See detail on džemprite (JP4, 5 ja 6) lisamine, mida saab eemaldada, et võimaldada I2C siinide SCL- ja SDA -liinide ühendamist. Džemprid peavad olema programmeerimiseks paigas ja seejärel eemaldatud, et saaks ühendada SCL ja SDA. Fotodel on džemprid paigas ja eemaldatud. Nende džemprite paigutamine on teie otsustada, kui soovite kasutada I2C bussi, peate need lihtsalt oma Ghetto arendussüsteemi panema. I2C siin tuleb lahti ühendada ja džemprid programmeerimiseks paika panna. Pange tähele, et I2C -siini puhul peate tegelema ainult JP4 ja JP6 -ga. Sisestage JP5, kui arvate, et soovite kunagi SPI -bussi kasutada. PCA8574A I/O pordilaiendi leivaplaat on väga lihtne. Andke Vcc (+5 volti) ja Gnd (maandus) ühendused ning ühendage AD0, 1 ja 2 maaga (muudab I2C alam aadressi 38 hex). Seejärel ühendage 4 vilkurit ja 4 DIP -lülitit. (Kui teil pole DIP-lülitit, võite lihtsalt kasutada juhtmeid. Siduge maa külge või jätke vedelema, et signaal vastavalt sisse või välja lülitada.) Lõpuks ühendage tõmbetakistid (R11 ja 12) SDA-st ja SCL-st Vcc-ga. Neid näidatakse 3.3K -na, kuid kõik väärtused 1.8K kuni 5.1K peaksid töötama (võib -olla kuni 10K, kuid ma pole seda proovinud). Kui olete ATtiny2313 programmeerinud, saate džemprid eemaldada ja testimiseks SDA ja SCL ühendada. Nüüd ATmega168 jaoks. Ainus korts on see, et te ei pruugi selle protsessori jaoks Ghetto arendussüsteemi ehitada. Kui see nii on, siis minu esitatud skeem (MEGA I2C.pdf) näitab teile, kuidas seda teha. See on vaid ATtiny2313 versiooni permutatsioon. Kui plaanite ette, saate veenduda, et teie programmeerimiskaabel sobib mõlemale süsteemile. Peamine erinevus on C2 ja C3 lisamine. Nende paigutamiseks vaadake pilte, need peaksid olema kiibile väga lähedal; üks neist on tegelikult kiibi all. Need aitavad vältida müra eriti analoog -digitaalmuundurist. Te ei pea džemprid sisse panema, kui te ei kavatse kasutada SPI -bussi, kuna neid pole sellel kiibil I2C -siini jaoks vaja. Pange tähele, et PCA8754A leivaplaati ei muudeta. Ühendage lihtsalt SDA ja SCL ning minge minema! Lihtne, ah?

Samm: kodeerime ja katsetame

Kodeerime ja katsetame!
Kodeerime ja katsetame!
Kodeerime ja katsetame!
Kodeerime ja katsetame!
Kodeerime ja katsetame!
Kodeerime ja katsetame!

On aeg draivereid ja näidisprogramme koostada. Alustame ATtiny2313 ja äsja ehitatud leivaplaadiga PCA8574A. Laadige fail I2C.zip oma I2C töökataloogi alla ja pakkige see lahti. Teil on uus kaust nimega I2C. Selles leiate USI I2C (ATtiny2313 jaoks) ja TWI I2C (ATmega168 jaoks). USI I2C -st leiate kausta I_O Port. See kaust sisaldab meie esimese näidisprogrammi koodi ja USI I2C draivereid. WinAVR -i abil kompileerige ja laadige kood ATtiny2313 -sse. Hinga sügavalt sisse ja lülita toide sisse. Siin on, mida oodata: sisselülitamisel vilgub ATtiny2313 pordi PD6 LED 1 kaks korda. Midagi muud ei juhtu enne, kui vajutate nuppu (S1). Iga kord, kui nuppu vajutatakse, loetakse lüliteid ja nende seaded kuvatakse PCA8574A -ga ühendatud LED -idel. Muutke lülitite väärtust, vajutage nuppu ja LED -id peaksid muutuma. Tehke seda seni, kuni saate üle põnevusest, kui näete selle toimimist. Kui (jumal hoidku!) Asjad ei tööta ootuspäraselt, kontrollige oma juhtmestikku hoolikalt. I2C tõrgetest annab märku LED3 (PD4) vilkumine ja see tähendab tõenäoliselt, et peate kontrollima, kas SDA ja SCL on ühendatud õigete tihvtidega ja kas need on õigesti üles tõmmatud. Kui asjad ikka ei tööta, lugege silumise kohta lisateavet sellest lõigust. Nüüd minge tagasi ja vaatame koodi. Avage fail USI_I2C_Port.c. See on näidisprogrammi kood. (USI_TWI_Master.c ja USI_TWI_Master.h sisaldavad draivereid - võite neid ignoreerida, kui te pole uudishimulik.) Kasutage seda näidet oma I2C -rakenduste juhendamiseks. Enamasti näitab programm teile, kuidas lähtestada ja kasutada I2C draivereid, sealhulgas seadeid alam -aadressi ja ülejäänud sõnumipuhvri üleslaadimine ning andmete sealt eemaldamine. Näete ka seda, kuidas ma nupu tühistan ja samal ajal loopi seadistan. Programmist on mõned üksikasjad, mida tasub mainida. Pange tähele, et lülitite andmed pööratakse ümber, enne kui need pordilaiendi LED -idele kirjutatakse. Pange tähele ka seda, et pordi laiendi sisendpordid peavad olema korralikult kirjutatud kui kõrged. Neid üksikasju on kirjeldatud PCA8574A andmelehel. Lugege alati hoolikalt andmelehti. Huvitavam on tingimusliku silumise kasutamine. Programmifaili alguses on lause // #define DEBUG ja kogu koodi peale puistatakse #ifdef DEBUG laused. Kuni DEBUG pole määratletud (kaks kaldkriipsu muudavad rea kommentaariks ja hoiavad seda määratlemata), ei koostata lausetes #ifdef kuni #endif olevat koodi. Aga kui asjad ei tööta ootuspäraselt, kompileerige ja laadige kood uuesti, kasutades #define DEBUG märkimata. LED -idel vilgub palju rohkem, mida saate dekodeerida, et jälgida oma programmi täitmist ja aidata teil leida täpselt, kus asjad valesti lähevad. Tegelikult soovitan teil seda proovida, et näha, mis juhtub. Näete, et LED 2 (PD5 -l) vilgub programmi täitmise ajal. Lülititelt loetud väärtus vilgub LED 1 -l (PD6), enne kui seda Port Expander LED -idel kuvatakse. Nende LED -ide abil peaksite programmi jälgima, kui see töötab. Järgmisena töötame koos ATmega168 -ga; jätke see jaotis vahele, kui olete huvitatud ainult ATtiny2313 -st. Ikka koos minuga? Hea. Liikuge kausta TWI_I2C, muutke oma töökataloogiks IO_Port ning kompileerige ja laadige TWI_I2C_Port.c ATmega168 -sse. Ühendage SDt ja SCL liinid ATtiny2313 küljest lahti ja ühendage need ATmega168 -ga. Ühendage toide ja maandus ning lülitage sisse. Operatsioon peaks olema sama! Mängige, kuni põnevus vaibub, siis vaatame koodi. Avage TWI_I2C_Port.c. Kood on peaaegu identne, välja arvatud vigade käsitlemine ja katkestatud juhid. Siin on erinevused. Pange tähele, et I2C -siini korrektseks töötamiseks peab kell olema seadistatud 4MHz. Sei (); avaldus lülitab katkestused sisse pärast I2C draiverite lähtestamist. Vigade kontrollimiseks testitakse konkreetset olekubitti. Lugemise ajal tuleb kutsutud funktsioon TWI_Read_Data_From_Buffer edastada loetud andmed sõnumipuhvrisse. Kirjutamise ajal peab (TWI_Transceiver_Busy ()) kasutama, et veenduda, et ülekanne on enne vigade kontrollimist lõpule viidud. Neid kahte viimast funktsiooni kirjeldatakse eespool draiverite kirjelduses. Peale selle on kood peaaegu sama kui ATtiny2313. DEBUG töötab samamoodi ka siis, kui soovite sellega katsetada.

6. samm: I2C mälu kasutamine

I2C mälu kasutamine
I2C mälu kasutamine
I2C mälu kasutamine
I2C mälu kasutamine
I2C mälu kasutamine
I2C mälu kasutamine
I2C mälu kasutamine
I2C mälu kasutamine

Nüüd, kui oleme õppinud I2C -bussi kasutama I/O -pordi laiendi lugemiseks ja kirjutamiseks, liigume edasi I2C -mälu, nii RAM -i kui ka EEPROM -i, kasutamisele. Peamine erinevus seisneb selles, et ühe baaskäskluse I2C abil saab mälestustesse lugeda või nendest kirjutada mitu baiti. Nende katsete ettevalmistamiseks peame riistvara veidi muutma ja ehitama leivaplaadile paar uut vooluringi. Hoidke pordilaiendi ahel alles, kuna kasutame seda mõne mälu väärtuse kuvamiseks. Eemaldage PCA8574A DIP -lülitid ja pange nendele tihvtidele vilkurid. Kui teil pole piisavalt vilkureid, liigutage P4 -lt P7 -le need, mis on P0 -st P3 -ni. (Kuvatavad väärtused on piisavalt väikesed.) Vaadake nüüd skemaatilist I2C Ram.pdf faili ja ühendage PCF8570 leivaplaadile. Vaata pilti ka. Siduge kindlasti tihvt 7 Vcc külge. Käivitage PCA8574A juhtmed SDA ja SCL jaoks. Täiendavaid tõmbetakistusi pole vaja. Kui olete huvitatud ka EEPROMist, ehitage see vooluring 24C16 jaoks ka I2C EEPROM.pdf abil, kuid hoiatan, et näites kasutatakse ATmega168. See skeem on tõesti lihtne. Nagu eespool arutatud, tuleks aadressibitte ignoreerida. Ühendage lihtsalt vool ja maandus. Ärge ühendage veel SDA -d ja SCL -i, kuna me pole Ramiga katsetamist lõpetanud. Alustame oma mälukatsetusi ATtiny2313 -ga, mis on ühendatud PCA8574A pordilaiendiga ja PCF8570 Ramiga. Programm kirjutab Ramile mõned numbrid, loeb need siis tagasi ja kuvab need pordilaiendil. Muutke oma töökataloogi mäluks USI I2C. Kasutage faili USI_I2C_RAM.c kompileerimiseks ja allalaadimiseks. Pange tähele, et I2C draiverifailid on identsed nendega, mida kasutasime varem. Ühendage toide ja LED -il 1 (PD6) peaksite nägema ühte vilkumist. Andmed kirjutatakse esimese 4 baidi mällu. Vajutage nuppu ja kaks baiti loetakse tagasi ja kuvatakse. Portide laiendajal (P0) peaksite nägema ühte LED -valgust, kahe sekundi pausi, seejärel kahte LED -indikaatorit (P0 ja P1). Veel kaks sekundit pausi ja valgusdioodid peaksid välja lülituma. Järjestuse uuesti alustamiseks vajutage uuesti nuppu. Silumine on sarnane ülalkirjeldatud meetodiga. Vaatame koodi. Avage USI_I2C_RAM.c. See peaks välja nägema üsna sarnane eelmise koodiga. Peamised erinevused on mälu lugemise ja kirjutamise üksikasjad. Vaadake, kuidas sõnumipuhvrit enne kõne kirjutamist laaditakse. Esimene bait on alam -aadress, mille lugemis-/kirjutamisbitt on õigesti seatud. Kuid järgmine bait on mäluaadress, kust andmeid kirjutama hakata. Seejärel tulevad tegelikud andmebaidid, mis laaditakse järjestikku mällu, alustades meie määratud aadressist. Me määrame sõnumi suuruseks 6. Seega hakkame kirjutama aadressil 00 ja kirjutame väärtused 01, 03, 02 ja 06 mälukohtadesse 00 kuni 03. Andmete mälust tagasi lugemiseks peame kasutama funktsiooni USI_TWI_Start_Random_Read. Sõnumipuhver saab alam -aadressi esimese baidi ja algusaadressi teise baidi. Seejärel helistage funktsioonile, mille sõnumi suurus on seatud loetud baitide arvule pluss 2. Pange tähele, et lugemis-/kirjutamisbitt pole oluline, kuna lugemine toimub sõltumata. Tagastatud andmed algavad sõnumipuhvri teisest asukohast. Kui andmed on sisse loetud, teisendatakse need Port Expanderis kuvamiseks ümber ja kirjutatakse sellele üks bait korraga, pausiga väärtuste vahel. Lõpuks lülitatakse pordi laiendi LED -id välja. Port Expanderile kirjutatud tekstid on identsed eelnevates näidetes tehtuga. Lõbutsemiseks võite tühistada #define DEBUG avalduse, nagu eespool, ja näha palju vilkuvaid LED -e. Pärast järjekordset edukat katset põnevusest loputatud liigume ATmega168 ja EEPROM -i juurde. Muutke TWI I2C all oma töökataloogiks EEPROM. TWI_I2C_EEPROM.c kompileerimiseks ja allalaadimiseks kasutage make -faili. Pange tähele, et I2C draiverifailid on identsed nendega, mida kasutasime varem PCA8574A jaoks. Programmi testimiseks ühendage ATtiny2313 lahti ja ühendage ATmega168. Jätke I2C buss rammi külge haakituks ja lülitage see sisse. Tulemused on erinevad, kuna kirjutame ja loeme rohkem andmeid. PD7 LED 1 peaks initsialiseerimisel vilkuma. Vajutage nuppu ja andmed loetakse mälust tagasi ning kuvatakse. PCA8574 LED -id peaksid vilkuma järgmises järjestuses: P1, P0 & P2, (kõik välja lülitatud), P0 & P1, P1 & P2. Lõpuks peaksid pordi LED -id kõik kustuma. Selle kordamiseks vajutage uuesti nuppu. Oh, aga oodake, ütlete. Kas see programm pole EEPROMi jaoks? Kuna me kasutame mäluseadet samal I2C -aadressil, töötab sama programm nii Ram kui ka EEPROM -i jaoks. Lülitage toide välja ja liigutage SDA ja SCL ramilt EEPROM -i ning käivitage programm uuesti. See peaks toimima täpselt samamoodi. Pange tähele, et EEPROM -i ja Ram -i ei saa I2C -bussiga korraga ühendada, kuna neil on sama aadress. (Nutikad teie hulgast võivad kaaluda RAM -i programmeeritavate aadressibittide muutmist, kuid see ei tööta ikkagi. 24C16 kasutab kogu aadressi plokki, mida saab rammi jaoks programmeerida.) OK, vaatame seda viimast programmi. Avage TWI_I2C_EEPROM.c. Esimene asi, mida tuleb tähele panna, on see, et olen märkinud, kuidas lahendada täielik 24C16 EEPROM. Sellele pääseb juurde 256 baitidena 8 erineval I2C orja aadressil. Vaadake, kuidas MEMORY_ADDR määratletakse lähteaadressina 50 kuueteistkümnendsüsteemis; sellepärast Ram töötaski. Kui soovite juurde pääseda teistele 24C16 plokkidele, siis kasutage teisi märkeid. Vaadake, kuidas ma mällu kirjutama seadsin. Esmalt pannakse puhverisse alam -aadress koos lugemis-/kirjutamisbittide komplektiga, seejärel lähteaadress 00, seejärel 16 baiti andmeid. Funktsiooni TWI_Start_Read_Write kutsutakse andmete kirjutamiseks (nagu varem), kui sõnumi suurus on seatud 18. Kui nuppu vajutatakse, kasutame andmete tagasi lugemiseks TWI_Start_Random_Read ja TWI_Read_Data_From_Buffer. Iga kolmas bait kuvatakse pordi laiendi LED -idel. Lõpuks lülitatakse LED -id välja, et oodata järgmist nupuvajutust. Võite küsida, miks otsustasin kirjutada 16 baiti. Kui loete andmelehte hoolikalt, näete, et 24C16 teeb kirjutustsükli alati, kui see saab 16 baiti, isegi kui saadetakse rohkem baite. Nii et see tundus kena number kasutamiseks. Kui otsustate seda suurendada, peate muutma suurust MESSAGEBUF_SIZE. Samuti peate muutma väärtust TWI_BUFFER_SIZE jaotises TWI_Master.h. Selle põhjuseks on asjaolu, et draiver kopeerib andmed sõnumipuhvrist katkestusteenuse kasutamiseks. Palju õnne! Nüüd olete valmis I2C bussi oma projektides kasutama!

Samm 7: Veebiressursid

Siin on lingid katsetes kasutatud osade andmelehtedele. Kui te midagi muud ei saa, peaksite need kindlasti hankima. Port ExpanderRamEEPROM I2C loojana on NXP -l (Philips) palju häid asju. (Neile meeldib oma URL -ides kasutada nurksulge, nii et ma ei saa neid siia korralikult lisada. Vabandust.] I2C alale pääsemiseks valige toodete loendist liides. Saate pääseda nende I2C saidile ja juurdepääs kõigile nende pakutavatele andmelehtedele ja rakenduste märkmetele. Eriti siin on I2C siinide kirjeldus ja tehnilised üksikasjad. Hankige Atmelilt andmelehed ATtiny2313 ja ATmega168 (andmeraamatud?). Atmeli rakenduse märkused on siin. Vaadake AVR310 ja AVR315. Haara ka kood. Vaadake siit palju rohkem I2C asju.

8. samm. Märkused geekidele

Tõelise geeki jaoks, kes soovib üksikasju teada saada, on siin mõned asjad, mida Atmeli rakenduste märkmeid ja draiverikoodi vaadates meeles pidada:- I2C-seadme adresseerimise ja käsutamise meetod ei kuulu spetsifikatsiooni! Peale alam -aadressi ja lugemis-/kirjutamisbiti pole käske, režiime jms täpsustatud ja need on antud seadmele omased. Selle väga selgeks tegemiseks pange tähele, et Atmeli näites kasutatud skeem kehtib ainult selle näite kohta ja on üsna mittestandardne.- USI-rakendus erineb TWI-rakendusest mõne olulise viisi poolest. + USI -ga pakub kellaaega tarkvara; TWI -ga pakub seda bitikiiruse generaator. + USI meetod ei kasuta katkestusi; TWI teeb seda. See on teatud mõttes mõistlik, kuna perekond Mega (kasutades TWI -d) võib teha palju muid asju ja seda ei tohiks I2C ülekanded häirida. Katkestusega juhitud versioon USI jaoks on kindlasti võimalik, seda pole selles juhendis lihtsalt rakendatud. + USI riistvara ei ole I2C jaoks optimeeritud ja saab hakkama ainult 8 -bitiste edastustega. See tähendab, et üheksanda biti saatmiseks on vaja kahte ülekannet (kas NACK või ACK). TWI riistvara tegeleb sellega automaatselt. See muudab USI draiveri juurutamise veidi keerukamaks. + TWI vigade tuvastamist käsitletakse riistvaras. USI nõuab tarkvara käsitlemist, mis muudab asja mõnevõrra keerulisemaks. + TWI riistvara juhib otse pordi konfiguratsiooni. USI riistvara nõuab pordi bittide konfigureerimist enne pordi kasutamist. Seda näete USI rutiinis Master_Initialize.-Atmel väidab, et I2C-siini tõmbamiseks on võimalik kasutada AVR-pordi tõmbamist. Ma pole välja mõelnud, kuidas seda lähenemist toimima saada. Kahe välise takisti kasutamine tundub üsna lihtne skeem, nii et ma ei kulutanud sellele palju aega.

Soovitan: