Kazalo:

I2C vodilo za ATtiny in ATmega: 8 korakov
I2C vodilo za ATtiny in ATmega: 8 korakov

Video: I2C vodilo za ATtiny in ATmega: 8 korakov

Video: I2C vodilo za ATtiny in ATmega: 8 korakov
Video: LDmicro 14: ЖК-дисплей I2C и часы реального времени DS3231 (программирование лестничной схемы ПЛК микроконтроллера с помощью LDmicro) 2024, Julij
Anonim
I2C Bus za ATtiny in ATmega
I2C Bus za ATtiny in ATmega

Obožujem mikrokrmilnike Atmel AVR! Od izgradnje razvojnega sistema geta, opisanega v tem navodilu, nisem imel konca zabave pri eksperimentiranju z AVR ATtiny2313 in še posebej z ATmega168. Šel sem celo tako daleč, da sem napisal Instructable o uporabi stikal kot vhodov in razširil koncept razvojnega sistema geta na CPLD. V nedavnem projektu sem potreboval več stikal za nastavitev kontrolnih vrednosti. AVR -ji niso imeli dovolj vhodno -izhodnih zatičev, zato sem se moral nekaj zamisliti. Lahko bi poskusil s kompleksnim vhodnim sistemom s tipkovnico in zaslonom, vendar bi ATtiny2313 zmanjkalo virov. Na srečo je Atmel rešil to težavo z vključitvijo vmesnika, ki se lahko poveže z dodatnimi čipi (na primer pomnilnikom ali V/I vrati) s preprostim dvožičnim vmesnikom. Tako je, z uporabo samo dveh V/I zatičev na AVR -ju lahko dostopamo do številnih dodatnih V/I zatičev in drugih virov. Ta dvožični vmesnik je uradno znan kot vodilo z integriranim vezjem ali samo vodilo I2C in ga je izumil NXP, ko je bil še vedno Philips Semiconductors. Če berete ta Instructable, ste verjetno že slišali za vodilo I2C in ste ga morda celo uporabili na PIC ali drugem mikrokrmilniku. Konceptualno zelo preprosti in podprti s strojno opremo na AVR -jih, so gonilniki programske opreme še vedno potrebni za uporabo vodila I2C. Atmel ponuja opombe o aplikacijah (glej vire kasneje v tem navodilu), vendar so te nepopolne in ne prikazujejo nobenih primerov, razen komunikacije z drugo napravo AVR. AVR -ji. Namesto tega bom predstavil razširjene različice gonilnikov Atmel za naprave ATtiny2313 in ATmega168, razložil bom zahteve in omejitve, ki veljajo pri njihovi uporabi, ter vam pokazal delovne primere naprav I2C. Ko boste delali skozi ta Instructable, boste lahko vodilo I2C uspešno uporabljali v svojih projektih AVR. Očitno je, da lahko ignorirate gonilnike za drobce ali MEGA, če vas zanima le eden od njih. Za tiste, ki želite izvedeti več o vodilu I2C, bom dal povezave do ustreznega gradiva.

1. korak: Kaj je sploh to, kar počnete na I2C?

Kaj so sploh te stvari I2C?
Kaj so sploh te stvari I2C?
Kaj so sploh te stvari I2C?
Kaj so sploh te stvari I2C?
Kaj so sploh te stvari I2C?
Kaj so sploh te stvari I2C?
Kaj so sploh te stvari I2C?
Kaj so sploh te stvari I2C?

Vodilo I2C je preprosta dvožična povezava, ki lahko poveže več naprav skupaj in jim omogoča izmenjavo podatkov. V svoji najpreprostejši obliki obstaja ena glavna naprava, ki komunicira z več podrejenimi napravami. Vse naprave so vzporedno povezane z dvema žicama vodila I2C. Obe žici sta znani kot SCL in SDA. SCL je linija ure in jo nadzira glavna naprava. SDA je dvosmerna podatkovna linija. Za prenos podatkov poveljnik pošlje pomožni naslov v kombinaciji z eno bitno zastavico za branje/pisanje. Če je zaželen zapis, bo mojster še naprej pošiljal podatke naslovljenemu podrejenemu. Če je zahtevano branje, bo podrejeni odgovoril s podatki. Za koordinacijo transakcij vodila SCL in SDA upravljata voditelj in podrejeni, da signalizirata več pogojev. Ti vključujejo START, STOP, ACK (potrditev) in NAK (brez potrditve). Podrobnosti o teh pogojih obravnavajo vozniki. Pravi ljubitelji med vami se lahko naučijo vseh podrobnosti na povezavah na koncu tega navodila. Električne zahteve so precej preproste. Poveljnik in pomožni elementi morajo uporabljati isto raven za Vcc, ozemljitve morajo biti povezane, vodi SCL in SDA pa morajo biti potegnjeni do Vcc. Vrednost vlečnih uporov je natančno določena z izračunom, ki temelji na skupni kapacitivnosti vodila, praktično pa je lahko skoraj vsaka vrednost med 1,8 K in 10 K. Začnem z 5.1K in uporabljam nižje vrednosti, dokler ne deluje. Običajno to ni problem, razen če imate med napravami veliko naprav ali dolge žice. Nominalna hitrost prenosa podatkov na vodilu I2C je 100 Kbit/s. Možne so tudi hitrosti 400 Kbit/sekundo, 1 Mbit/sekundo in več, vendar gonilniki v tem navodilu ne podpirajo. Vse naprave I2C bodo delovale s hitrostjo 100 Kbit/s. ATtiny2313 in ATmega168 različno izvajata vodilo I2C. ATtiny2313 uporablja strojno opremo za univerzalni serijski vmesnik (USI) - ki se lahko uporablja tudi za vodilo SPI. ATmega168 ima namensko strojno opremo za vodilo I2C, znano kot dvožični vmesnik (TWI). Ko so gonilniki napisani, so te razlike uporabniku večinoma pregledne. Ena pomembna razlika je v programski opremi: gonilnik ATmega168 I2C je prekinjen, medtem ko pri ATtiny2313 ni. To pomeni, da programu ATmega168 ni treba čakati na prenos podatkov I2C, ampak je treba počakati le pred začetkom drugega prenosa ali do prihoda podatkov iz operacije branja. Primeri in razprava, ki jih je treba upoštevati, bi morali to pojasniti. Naslovi I2C so dolgi 7 bitov, zato je na vodilu lahko do 127 naprav, če ima vsaka svoj edinstven naslov. Kot je prikazano na sliki, se ta 7 -bitni naslov premakne za en bit v levo, najmanj pomemben bit pa se uporabi za označevanje branja ali pisanja naprave na naslovu. Tako je celoten podrejeni naslov 8 -bitni bajt. Dejanski naslov je delno določen znotraj naprave in ga ni mogoče spremeniti (4 najpomembnejša bita), delno pa določajo biti, ki so lahko povezani z zatiči naprave (3 najmanj pomembni biti), ki jih je mogoče visoko ali nizko vezati za nastavitev določen naslov. Sliši se zmedeno, vendar bo to jasno razložil primer. Podatkovni list PCA8574A kaže, da bodo štirje najpomembnejši bitovi naslova I2C vedno 0111. Naslednji trije biti so določeni z nastavitvami na zatičih AD0, AD1 in AD2. Ti zatiči so lahko vezani na ozemljitev ali na napajalnik pozitivne napetosti (5 voltov), da predstavljajo 0 oziroma 1. Razpon možnih naslovov je torej šestnajstiški od 38 do 3F, kot je prikazano na drugi sliki iz podatkovnega lista PCA8574. Tako je s spreminjanjem nastavitev naslovnega bita lahko na vodilu I2C istočasno do 8 PCA8574A. Vsak se bo odzval samo na svoj specifični naslov pomožnika. Če potrebujete še več I/O vrat, lahko uporabite PCA8574. Edina razlika med PCA8574 in PCA8574A je v tem, da je obseg naslovnih strežnikov I2C PCA8574 od šestnajstiškega števila od 20 do 27. Določanje naslova dane naprave je lahko zmedeno, saj nekateri podatkovni listi menijo, da je bit za branje/pisanje del naslov. Pazljivo preberite podatkovni list in upoštevajte, da bo pomožni naslov dolg 7 bitov. Bit za branje/pisanje je treba obravnavati ločeno. Spet bo v pomoč primer. Podatkovni list za 24C16 EEPROM, s katerim bomo eksperimentirali, pravi, da so prvi (najpomembnejši) štirje biti naslova pomožnika 1010. Naslednje tri bite lahko določimo z A0, A1 in A2; vendar upoštevajte, da podatkovni list zajema tudi 24C01 do 24C08, ki so manjši EEPROM -ji. Slika iz podatkovnega lista kaže, da se nastavitve teh naslovnih bitov prezrejo, ko se velikost poveča, in so popolnoma zanemarjene za 24C16. To pomeni, da zadnji trije bitovi niso pomembni in 24C16 res uporablja vse podrejene naslove I2C 50 do 57 šestnajstiško. Obseg podrejenih naslovov bo dejansko obravnaval različne odseke znotraj 24C16. Prvih 256 bajtov je na naslovu 50h, naslednjih 256 ob 51h in tako naprej do zadnjih 256 ob 57h - skupaj 2K bajtov. Ker je naslov RAM -a PCF8570, s katerim tudi eksperimentiramo, v tem območju, 24C16 in PCF8570 ni mogoče uporabljati skupaj.

2. korak: Naročite nekaj naprav I2C

Zdaj, ko veste malo o vodilu I2C in ga želite uporabiti, zakaj ne bi zdaj naročili nekaterih naprav I2C, da bi eksperimentirali, da bodo lahko na poti k vam, medtem ko pripravljate programsko opremo? Primerne naprave vključujejo I/ O Interface Expander (moj najljubši), Static Ram in EEPROM. Še veliko je, a to je odličen začetek. Procesorja AVR, ki ju bomo uporabljali, sta ATtiny2313 in Atmega168 (uporablja se v Arduinu). Če ste novi pri teh, si oglejte ta odličen Instructable, če želite izvedeti več o njih in zgraditi svoj razvojni sistem geta. Shema ATmega168 v tem navodilu prikazuje, kako implementirati Ghetto Development System za ta procesor. Kabel za vzporedna vrata je enak tistemu za ATtiny2313. (Nisem preizkusil USB različice razvojnega sistema Ghetto, zato nisem prepričan, kako na njem dostopam do vodila I2C. Enako za Arduino.) Tu so številke delov Digikeyja. RAZŠIRITELJ 568-4236-5-NDRam: IC SRAM 256X8 W/I2C 568-1071-5-NDEEPROM: Serijski IC EEPROM 16K CAT24C16LI-G-ND

Korak: Gonilniki I2C

Tu so opisi gonilniških funkcij za vodilo I2C. Ti so bili razviti z uporabo Atmel Apps Notes za začetnike. Brez njih kot podlage za gradnjo tega ne bi mogel narediti. Razvoj je bil izveden z uporabo WinAVR in gcc C prevajalnika. Omejitve taktov so opisane spodaj za vsak procesor. Ker ne morem preizkusiti vseh možnih kombinacij arome procesorja / takta procesorja, se bom držal tistega, kar dejansko lahko preizkusim, in poskušal navesti omejitve in omejitve. Tu so gonilniške funkcije in njihova uporaba. Za več podrobnosti si oglejte primere in si oglejte funkcije, ki se uporabljajo v celotnih programih. Za ATtiny2313: Ura zahteva: Gonilniki so zasnovani za taktno frekvenco 1MHz (privzeta hitrost) za ATtiny2313. Če želite teči po drugih cenah, boste morali prilagoditi konstante v gonilnikih. Pošljite mi e -pošto, če potrebujete pomoč pri tem. Nekaj namigov lahko dobite tudi iz zapiskov aplikacij Atmel v povezavah v koraku Resources. USI_TWI_Master_Initialise () Ta funkcija inicializira strojno opremo USI za delovanje v načinu I2C. Pokličite ga enkrat na začetku programa. Vrne void in ni argumentov. USI_TWI_Get_State_Info () Ta funkcija vrne podatke o napaki I2C in se uporablja, če je med transakcijo I2C prišlo do napake. Ker ta funkcija vrne samo kodo napake, uporabljam funkcijo TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg), da utripam LED napake. Kode napak so določene v USI_TWI_Master.h. Takole lahko to pokličete: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () Ta funkcija se uporablja za branje in pisanje enobajtnih podatkov v naprave I2C. Uporablja se tudi za zapis več bajtov. Za uporabo te funkcije je 6 korakov. 1) Razglasite medpomnilnik sporočil v svojem programu, da zadrži naslov podrejenega in podatkovni bajt za pošiljanje ali sprejemanje. unsigned char messageBuf (MESSAGEBUF_SIZE); 2) Vmesni naslov postavite kot prvi bajt v medpomnilniku. Premaknite ga za en bit v levo in OR v bit za branje/pisanje. Upoštevajte, da je bit za branje/pisanje 1 za branje in 0 za zapis. Ta primer je za branje. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (TRUE << TWI_READ_BIT); 3) Pri pisanju vnesite bajt, ki ga želite zapisati, na naslednjo lokacijo v vmesnem pomnilniku. vrnjeno vrednost (v tem primeru temp.) je mogoče preizkusiti, če je prišlo do napake. Če je tako, se obravnava, kot je opisano zgoraj. Oglejte si primere v programih. 6) Če je bilo zahtevano branje, bo branje bajtov na drugem mestu v vmesnem pomnilniku. Če je treba zapisati več bajtov (na primer v pomnilniško napravo), lahko uporabimo to isto rutino. Nastavitev medpomnilnika in klic rutine sta nekoliko drugačna. Drugi bajt v vmesnem pomnilniku bo začetni pomnilniški naslov, na katerega želite pisati. Podatki za zapis bodo v naslednjih bajtih. Velikost sporočila bo velikost, vključno z vsemi veljavnimi podatki. Če je torej treba zapisati 6 bajtov, bo velikost sporočila 8 (podrejeni naslov + pomnilniški naslov + 6 bajtov podatkov). USI_TWI_Start_Random_Read () Ta funkcija se uporablja za branje več bajtov iz naprave I2C, običajno je smiselna le za nekakšen spomin. Uporaba te rutine je zelo podobna prejšnji, z dvema izjemama. Nastavitev bita za branje/pisanje ni pomembna. Klic te rutine bo vedno povzročil branje. Velikost sporočila mora biti 2 plus število prebranih bajtov. Če ni prišlo do napak, bodo podatki v vmesnem pomnilniku, ki se začne na drugi lokaciji. Za ATmega168: Zahteva ure: gonilniki so zasnovani za takto 4MHz za ATmega168. Primer kode prikazuje, kako nastaviti takšno hitrost. Če želite teči po drugih cenah, boste morali prilagoditi konstante v gonilnikih. Če želite to narediti, mi pišite. TWI_Master_Initialise () Ta funkcija inicializira strojno opremo TWI za delovanje v načinu I2C. Pokličite ga enkrat na začetku programa. Vrne se neveljavno in ni argumentov. Prekinitve obvezno omogočite s klicem swi () po inicializaciji. TWI_Get_State_Info () Ta funkcija vrne podatke o napaki I2C in se uporablja, če je med transakcijo I2C prišlo do napake. Ker ta funkcija vrne samo kodo napake, uporabljam funkcijo TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) za utripanje LED napake. Kode napak so definirane v TWI_Master.h, vendar so spremenjene za signalizacijo na LED napaki. Za podrobnosti glejte primer kode. Tako lahko to pokličete: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) Upoštevajte, da se preverjanje napak izvede tako, da se prepričate, da je transakcija I2C dokončana (spodaj opisana funkcija), nato pa nekoliko preizkusite v globalni besedni statusi. dve funkciji delujeta enako kot ustrezne funkcije, opisane zgoraj, vendar z nekaj izjemami. Ne vračajo nobenih vrednosti napak. Odčitani podatki se ne prenesejo v medpomnilnik. To bo storjeno s funkcijo, opisano v nadaljevanju. Ko pokličete TWI_Start_Random_Read, mora biti messageSize število zahtevanih podatkovnih bajtov plus en, ne dva. Gonilnik I2C za ATmega168 je prekinjen. To pomeni, da se transakcije I2C zaženejo in nato izvedejo neodvisno, medtem ko se glavna rutina še naprej izvaja. Ko glavna rutina želi podatke iz transakcije I2C, ki se je začela, mora preveriti, ali so podatki na voljo. Enako velja za preverjanje napak. Pred preverjanjem napak mora biti glavna rutina prepričana, da je transakcija I2C končana. Naslednji dve funkciji se uporabljata za te namene. TWI_Transceiver_Busy () Pokličite to funkcijo, da preverite, ali je transakcija I2C končana, preden preverite napake. Primeri programov prikazujejo, kako to uporabiti. TWI_Read_Data_From_Buffer () Pokličite to funkcijo za prenos podatkov iz sprejemnega medpomnilnika gonilnika I2C v medpomnilnik za sporočila. Ta funkcija bo pred prenosom podatkov zagotovila, da je transakcija I2C končana. Čeprav ta funkcija vrne vrednost, se mi zdi, da je preverjanje bita napake neposredno bolj zanesljivo. Evo, kako to pokličete. Velikost sporočila mora biti za eno večja od želenega števila podatkovnih bitov. Podatki bodo v sporočiluBuf, ki se začne na drugi lokaciji.temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

4. korak: Zgradimo

Gradimo!
Gradimo!
Gradimo!
Gradimo!
Gradimo!
Gradimo!
Gradimo!
Gradimo!

Začnite s prenosom datoteke I2C Schematics.zip. Morda boste želeli na svojem delovnem območju ustvariti mapo I2C, v kateri bodo shranjene sheme in primeri programskih datotek. Razpakirajte sheme v ta imenik. Našli boste mapo z imenom I2C Schematics. Odprite datoteko tiny I2C.pdf. Ta shema prikazuje razvojni sistem geta ATtiny2313 in razširitvenik V/I vrat PCA8574A (okrog njega je velika črtkana škatla). Vezje razširjevalnika vrat je zgrajeno na podlagi. Oglejte si fotografije, da vidite, kako izgledajo ta vezja. Res so precej preprosti. Del sheme ATtiny2313 je le razvojni sistem Ghetto s tremi utripajočimi lučmi (LED1, 2 in 3, plus R4, 5 in 6) in gumbom (S1), priklopljenim nanj, in enim dodatne podrobnosti. Ta podrobnost je dodatek mostov (JP4, 5 in 6), ki jih je mogoče odstraniti, da se omogoči povezava linij SCL in SDA vodila I2C. Mostiči morajo biti nameščeni za programiranje, nato pa jih odstraniti, da se lahko povežeta SCL in SDA. Fotografije prikazujejo skakalce na mestu in odstranjene. Postavitev teh skakalcev je odvisna od vas, le če jih želite uporabiti za vodilo I2C, jih morate dati v svoj razvojni sistem Ghetto. Vodilo I2C morate odklopiti in namestiti mostičke za programiranje. Upoštevajte, da morate za vodilo I2C skrbeti le za JP4 in JP6. Vstavite JP5, če mislite, da boste kdaj želeli uporabiti vodilo SPI. Breadboarding PCA8574A I/O Port Expander je zelo preprost. Zagotovite priključke Vcc (+5 voltov) in Gnd (ozemljitev) in priključite AD0, 1 in 2 na ozemljitev (podrejeni naslov I2C je 38 -kratnik). Nato priključite 4 utripajoče luči in 4 DIP stikala. (Če nimate DIP stikal, lahko uporabite samo žice. Privežite ozemljitev ali pustite plavajočo, da vklopite ali izklopite signal.) Na koncu priključite vlečne upore (R11 in 12) iz SDA in SCL v Vcc. Ti so prikazani kot 3.3K, vendar bi morala delovati vsaka vrednost od 1.8K do 5.1K (morda do 10K, vendar tega nisem poskusil). Ko programirate ATtiny2313, lahko odstranite mostičke in priključite SDA in SCL za testiranje. Zdaj za ATmega168. Edina guba tukaj je, da za ta procesor morda niste zgradili razvojnega sistema Ghetto. V tem primeru vam bo shema, ki jo ponudim (MEGA I2C.pdf), pokazala, kako. To je le permutacija različice ATtiny2313. Če načrtujete vnaprej, se lahko prepričate, da bo vaš programski kabel ustrezal obema sistemoma. Glavna razlika je dodajanje C2 in C3. Oglejte si slike za njihovo namestitev, naj bodo zelo blizu čipa; eden od njih je pravzaprav pod čipom. Ti pripomorejo predvsem k preprečevanju hrupa iz analogno -digitalnega pretvornika. Mostičkov vam ni treba vstavljati, razen če nameravate uporabiti vodilo SPI, saj niso potrebni za vodilo I2C na tem čipu. Upoštevajte, da bo plošča PCA8754A nespremenjena. Priključili boste le SDA in SCL in odšli! Enostavno, kaj?

5. korak: Kodirajmo in preizkusimo

Kodirajmo in preizkusimo!
Kodirajmo in preizkusimo!
Kodirajmo in preizkusimo!
Kodirajmo in preizkusimo!
Kodirajmo in preizkusimo!
Kodirajmo in preizkusimo!

Čas je za izdelavo gonilnikov in zglednih programov. Začeli bomo z ATtiny2313 in ploščo PCA8574A, ki smo jo pravkar zgradili. Prenesite datoteko I2C.zip v delovni imenik I2C in jo razpakirajte. Imeli boste novo mapo z imenom I2C. V njem najdete USI I2C (za ATtiny2313) in TWI I2C (za ATmega168). V USI I2C boste našli mapo I_O Port. Ta mapa vsebuje kodo za naš prvi primer programa in gonilnike USI I2C. Z uporabo WinAVR prevedite in naložite kodo v ATtiny2313. Globoko vdihnite in vklopite napajanje. Pričakujte naslednje: Ko je vklopljen, LED 1 na vratih PD6 na ATtiny2313 utripa dvakrat. Dokler ne pritisnete gumba (S1), se ne bo zgodilo nič drugega. Vsakič, ko pritisnete gumb, se stikala preberejo in njihova nastavitev se prikaže na LED diodah, priključenih na PCA8574A. Spremenite vrednost stikal, pritisnite gumb in LED diode bi se morale spremeniti. To počnite, dokler ne presežete navdušenja nad tem, kako deluje. Če (ne daj bog!) Stvari ne delujejo po pričakovanjih, natančno preverite ožičenje. Napake I2C bodo označene s utripajočimi diodami LED3 (PD4) in verjetno pomenijo, da morate preveriti, ali sta SDA in SCL povezana s pravilnimi nožicami in pravilno povlečena. Če stvari še vedno ne delujejo, preberite preostanek tega razdelka, če želite izvedeti več o odpravljanju napak. Zdaj pa pojdite nazaj in si oglejmo kodo. Odprite datoteko USI_I2C_Port.c. To je koda za primer programa. (USI_TWI_Master.c in USI_TWI_Master.h vsebujeta gonilnike - lahko jih prezrete, razen če ste radovedni.) Uporabite primer za vodenje lastnih aplikacij I2C. Program vam večinoma pokaže, kako inicializirati in uporabljati gonilnike I2C, vključno z nastavitvami navzgor podrejenega naslova in preostalega medpomnilnika sporočil ter pridobivanje podatkov iz njega. Videli boste tudi, kako odklepam gumb in nastavim zanko while. Nekaj podrobnosti programa je vredno omeniti. Upoštevajte, da se podatki iz stikal obrnejo, preden se zapišejo v LED na razširitveniku vrat. Upoštevajte tudi, da morajo biti vhodna vrata na razširilniku vrat zapisana kot visoka, da bodo delovala pravilno. Te podrobnosti so opisane v podatkovnem listu PCA8574A. Vedno pozorno preberite podatkovne liste! Bolj zanimiva je uporaba pogojnega odpravljanja napak. Blizu začetka programske datoteke je stavek // #define DEBUG, po kodi pa razpršeni #ifdef DEBUG stavki. Dokler DEBUG ni opredeljen (dve poševnici naredita vrstico komentar in preprečita njeno opredelitev), koda v stavkih #ifdef do #endif ne bo sestavljena. Če pa stvari ne delujejo, kot ste pričakovali, kodo znova sestavite in znova naložite z #define DEBUG unmented. Na LED diodah boste dobili veliko več utripov, ki jih lahko dekodirate, da boste spremljali izvajanje programa in vam pomagali ugotoviti, kje točno gre narobe. Pravzaprav priporočam, da poskusite to, da vidite, kaj se bo zgodilo. Videli boste, da bo LED 2 (na PD5) utripala, ko bo program napredoval. Vrednost, odčitana s stikali, bo utripala na LED 1 (PD6), preden se prikaže na LED -lukah za razširitev vrat. S temi LED diodami bi morali spremljati program, ki se izvaja. Naslednjič bomo delali z ATmega168; preskočite ta razdelek, če vas zanima samo ATtiny2313. Še vedno z mano? Dobro. Premaknite se v mapo TWI_I2C, spremenite svoj delovni imenik v IO_Port ter prevedite in naložite TWI_I2C_Port.c v ATmega168. Odklopite vodila SDA in SCL od ATtiny2313 in ju povežite z ATmega168. Priključite napajanje in ozemljitev ter vklopite. Operacija mora biti enaka! Igrajte, dokler vznemirjenje ne popusti, nato pa poglejmo kodo. Odprite TWI_I2C_Port.c. Koda je skoraj enaka, razen pri ravnanju z napakami in prilagajanju gonilnikov s prekinitvami. Tu so razlike: Upoštevajte, da mora biti ura nastavljena na 4 MHz, da vodilo I2C deluje pravilno. Sei (); stavek vklopi prekinitve po inicializaciji gonilnikov I2C. Za preverjanje napak se preizkusi določen statusni bit. Med branjem je treba poklicati funkcijo TWI_Read_Data_From_Buffer za prenos prebranih podatkov v medpomnilnik sporočil. Med pisanjem je treba uporabiti (TWI_Transceiver_Busy ()), da se prepričate, da je prenos končan, preden preverite napake. Zadnji dve funkciji sta opisani zgoraj v opisu gonilnikov. Razen tega je koda skoraj enaka kot za ATtiny2313. DEBUG deluje enako tudi, če želite eksperimentirati s tem.

6. korak: Uporaba pomnilnika I2C

Uporaba pomnilnika I2C
Uporaba pomnilnika I2C
Uporaba pomnilnika I2C
Uporaba pomnilnika I2C
Uporaba pomnilnika I2C
Uporaba pomnilnika I2C
Uporaba pomnilnika I2C
Uporaba pomnilnika I2C

Zdaj, ko smo se naučili uporabljati vodilo I2C za branje in pisanje razširitelja V/I vrat, preidimo na uporabo pomnilnikov I2C, tako RAM kot EEPROM. Glavna razlika je v tem, da je mogoče z enim ukazom I2C prebrati ali zapisati več bajtov iz spominov. Če se želimo pripraviti na te poskuse, moramo rahlo spremeniti strojno opremo in na plošči zgraditi nekaj novih vezij. Ohranite vezje razširjevalnika vrat, saj ga bomo uporabili za prikaz nekaterih pomnilniških vrednosti. Odstranite DIP stikala z računalnika PCA8574A in na te zatiče namestite utripajoče luči. Če nimate dovolj utripajočih luči, jih premaknite s P4 do P7 na P0 do P3. (Vrednosti, ki jih je treba prikazati, so dovolj majhne.) Zdaj si oglejte shemo I2C Ram.pdf in priključite PCF8570 na ploščo. Oglejte si tudi sliko. Bodite prepričani, da pin 7 pritrdite na Vcc. Vodite žice za SDA in SCL s PCA8574A. Dodatni vlečni upori niso potrebni. Če vas zanima tudi EEPROM, zgradite to vezje tudi z uporabo I2C EEPROM.pdf za 24C16, vendar vas opozarjamo, da primer uporablja ATmega168. To vezje je res preprosto. Kot smo že omenili, je treba naslove zanemariti. Samo priključite moč in ozemljite. Ne povezujte SDA in SCL, ker še nismo končali eksperimentiranja z Ramom. Začeli bomo s pomnilniškimi poskusi z ATtiny2313, priključenim na razširitvenik vrat PCA8574A in na Ram PCF8570. Program bo zapisal nekaj številk v Ram, nato jih prebral nazaj in prikazal na razširitveniku vrat. Premenite svoj delovni imenik v RAM pod USI I2C. Za izdelavo in prenos datoteke USI_I2C_RAM.c uporabite datoteko make. Upoštevajte, da so datoteke gonilnikov I2C enake tistim, ki smo jih uporabljali prej. Priključite napajanje in na LED 1 (PD6) boste videli en sam utrip. Podatki bodo zapisani v prve 4 bajte pomnilnika. Pritisnite gumb in dva bajta se bosta prebrala in prikazala. Na razširitveniku vrat (P0) bi morali videti eno LED lučko, dve sekundi pavze, nato pa dve lučki LED (P0 in P1). Še dve sekundi pavze in LED se morata ugasniti. Za ponovni zagon zaporedja pritisnite gumb. Odpravljanje napak je podobno zgoraj opisani metodi. Oglejmo si kodo. Odprite USI_I2C_RAM.c. Izgledati mora precej podobno prejšnji kodi. Glavne razlike so podrobnosti branja in pisanja spomina. Pred klicem, ki dejansko zapisuje, poglejte, kako se naloži medpomnilnik sporočil. Prvi bajt je podrejeni naslov z ustrezno nastavljenim bitom za branje/pisanje. Naslednji bajt je naslov pomnilnika, na katerem lahko začnete pisati podatke. Nato pridejo dejanski podatkovni bajti, ki se bodo zaporedno naložili v pomnilnik, od naslova, ki smo ga določili. Velikost sporočila določimo kot 6. Zato začnemo pisati na naslovu 00 in vrednosti 01, 03, 02 in 06 vpišemo v pomnilniške lokacije od 00 do 03. Za branje podatkov iz pomnilnika moramo uporabiti funkcijo USI_TWI_Start_Random_Read. Medpomnilnik sporočil dobi podrejeni naslov v prvem bajtu in začetni naslov v drugem bajtu. Nato pokličite funkcijo z velikostjo sporočila, nastavljeno na število bajtov za branje plus 2. Upoštevajte, da bit za branje/pisanje ni pomemben, saj bo branje izvedeno ne glede na to. Vrnjeni podatki se bodo začeli na drugem mestu v medpomnilniku za sporočila. Ko so podatki prebrani, se obrnejo za prikaz na razširitveniku vrat in se nanj zapišejo po en bajt z zamikom med vrednostmi. Na koncu se LED -lučke za razširitev vrat izklopijo. Zapisi v razširitvenik vrat so enaki tistemu, kar je bilo storjeno v prejšnjih primerih. Za zabavo lahko razkomentirate izjavo #define DEBUG, kot je prikazano zgoraj, in si ogledate veliko utripajočih LED diod. Po novem uspešnem poskusu, razburjeni od navdušenja, pojdimo na ATmega168 in EEPROM. Spremenite svoj delovni imenik v EEPROM pod TWI I2C. Za izdelavo in prenos datoteke TWI_I2C_EEPROM.c uporabite datoteko make. Upoštevajte, da so datoteke gonilnikov I2C enake tistim, ki smo jih prej uporabljali za PCA8574A. Če želite preizkusiti program, odklopite ATtiny2313 in priključite ATmega168. Pustite vodilo I2C priklopljeno na Ram in vklopite. Rezultati so drugačni, saj zdaj pišemo in beremo več podatkov. LED 1 na PD7 naj utripa ob inicializaciji. Pritisnite gumb in podatki se bodo prebrali iz pomnilnika in prikazali. LED diode na PCA8574 naj utripajo v naslednjem zaporedju: P1, P0 in P2, (vse izklopljeno), P0 & P1, P1 in P2. Nazadnje bi morale vse LED lučke ugasniti. Če želite to ponoviti, znova pritisnite gumb. Počakaj, praviš. Ali ni ta program za EEPROM? Ker dostopamo do pomnilniške naprave na istem naslovu I2C, isti program deluje tako za Ram kot za EEPROM. Izklopite in premaknite SDA in SCL iz rama v EEPROM in znova zaženite program. Delovati mora popolnoma enako. Upoštevajte, da EEPROM in Ram ni mogoče hkrati povezati z vodilom I2C, saj imata isti naslov. (Pametni med vami lahko razmislijo o spremembi nastavljivih bitov naslova na Ramu, vendar to še vedno ne bo delovalo. 24C16 uporablja celoten blok naslovov, ki jih je mogoče programirati za Ram.) OK, poglejmo ta zadnji program. Odprite TWI_I2C_EEPROM.c. Najprej je treba opozoriti, da sem navedel, kako nasloviti celoten EEPROM 24C16. Do njega lahko dostopate v 256 -bajtnih delih na 8 različnih podrejenih naslovih I2C. Oglejte si, kako je MEMORY_ADDR definiran kot začetni naslov pri 50 šestnajstiških številkah; zato je Ram delal. Če želite dostopati do drugih blokov 24C16, uporabite druge naslove, kot sem jih navedel. Poglejte, kako sem nastavil pisanje v spomin. Najprej se v vmesni pomnilnik vstavi podrejeni naslov z nastavljenim bitom za branje/pisanje, nato začetni naslov 00, nato 16 bajtov podatkov. Funkcija TWI_Start_Read_Write se pokliče, da zapiše podatke (kot prej) z velikostjo sporočila, nastavljeno na 18. Ko pritisnete gumb, uporabimo TWI_Start_Random_Read in TWI_Read_Data_From_Buffer za branje podatkov nazaj. Vsak tretji bajt je prikazan na LED -lukah za razširitev vrat. Nazadnje se LED lučke izklopijo, da počakajo na naslednji pritisk gumba. Morda se sprašujete, zakaj sem se odločil napisati 16 bajtov. Če pozorno preberete podatkovni list, boste videli, da 24C16 izvaja cikel pisanja, kadar prejme 16 bajtov, tudi če se pošlje več bajtov. Tako se mi je zdelo lepo število. Če se odločite za povečanje tega, boste morali spremeniti velikost MESSAGEBUF_SIZE. V TWI_Master.h boste morali spremeniti tudi vrednost TWI_BUFFER_SIZE. To je zato, ker gonilnik kopira podatke iz medpomnilnika sporočil za uporabo v rutini prekinitvenih storitev. Čestitamo! Zdaj ste pripravljeni uporabljati vodilo I2C v svojih projektih!

7. korak: Spletni viri

Tu so povezave do podatkovnih listov za dele, uporabljene za poskuse. Vsekakor bi jih morali dobiti, če ne dobite ničesar drugega. Port ExpanderRamEEPROMKot ustvarjalec I2C, ima NXP (Philips) ogromno odličnih stvari. (V svojih URL -jih radi uporabljajo oklepaje, zato jih ne morem pravilno vključiti. Žal.) Če želite priti na območje I2C, na seznamu izdelkov izberite Vmesnik. Dostopali boste do njihovega spletnega mesta I2C in dostop do vseh podatkovnih listov in zapiskov o aplikacijah, ki jih ponujajo. Opis vodila I2C in zlasti tehnične podrobnosti so tukaj. Pridobite podatkovne liste ATtiny2313 in ATmega168 (podatkovne knjige?) iz Atmela. Opombe o uporabi Atmel so tukaj. Poglejte AVR310 in AVR315. Zgrabi tudi kodo. Tu si poglej še veliko stvari I2C.

8. korak: Opombe za štrene

Za pravega čudaka, ki želi izvedeti podrobnosti, si morate zapomniti nekaj stvari, če pogledate opombe Atmel Apps in kodo gonilnika:- Način naslavljanja in ukazovanja naprave I2C ni del specifikacij! Razen naslova podrejenega in bita za branje/pisanje, ukazi, načini itd. Niso določeni in so značilni za določeno napravo. Da bi bilo to zelo jasno, upoštevajte, da shema, uporabljena v primeru Atmel, velja samo za ta primer in je precej nestandardna.- Izvajanje USI se razlikuje od izvajanja TWI na nekaj pomembnih vidikov. + Z USI -jem urejanje zagotavlja programska oprema; pri TWI -ju zagotavlja generator hitrosti prenosa. + Metoda USI ne uporablja prekinitev; to počne TWI. To ima določen smisel, saj bi družina Mega (ki uporablja TWI) lahko počela veliko drugih stvari in jih prenos I2C ne bi smel ovirati. Različica s prekinitvami za USI je vsekakor možna, le da ni v tem Instructableu. + Strojna oprema USI ni optimizirana za I2C in lahko upravlja samo 8 -bitne prenose. To pomeni, da sta za prenos devetega bita potrebna dva prenosa (bodisi NACK ali ACK). Strojna oprema TWI to obravnava samodejno. Zaradi tega je implementacija gonilnika USI nekoliko bolj zapletena. + Odkrivanje napak za TWI se izvaja strojno. USI zahteva rokovanje s programsko opremo, ki nekoliko otežuje stvari. + Strojna oprema TWI neposredno nadzoruje konfiguracijo vrat. Strojna oprema USI zahteva nastavitev bitov vrat, preden jih lahko uporabite. To boste videli v rutini Master_Initialize za USI.-Atmel trdi, da je za vleke vodila I2C mogoče uporabiti vlečenje vrat AVR. Nisem našel načina, kako bi ta pristop deloval. Uporaba dveh zunanjih uporov se zdi precej preprosta shema, zato za to nisem porabil veliko časa.

Priporočena: