Turinys:

„I2C“autobusas „ATtiny“ir „ATmega“: 8 žingsniai
„I2C“autobusas „ATtiny“ir „ATmega“: 8 žingsniai

Video: „I2C“autobusas „ATtiny“ir „ATmega“: 8 žingsniai

Video: „I2C“autobusas „ATtiny“ir „ATmega“: 8 žingsniai
Video: Control 32 Servo over Wi-Fi using ESP32 and PCA9685 via desktop or mobile phone V5 2024, Liepa
Anonim
I2C autobusas, skirtas ATtiny ir ATmega
I2C autobusas, skirtas ATtiny ir ATmega

Man patinka „Atmel AVR“mikrovaldikliai! Sukūręs „Ghetto Development System“, aprašytą šioje instrukcijoje, man nebuvo smagu eksperimentuoti su „AVR ATtiny2313“ir ypač su „ATmega168“. Aš netgi nuėjau taip toli, kad parašiau „Instructable“, naudodami jungiklius kaip įvestį, ir išplėtiau „Ghetto Development System“koncepciją į CPLD. Neseniai vykusio projekto metu man reikėjo kelių jungiklių, skirtų kontrolinėms vertėms nustatyti. AVR neturėjo pakankamai įvesties/išvesties kaiščių, todėl turėjau kažką galvoti. Galėjau išbandyti sudėtingą įvesties sistemą su klaviatūra ir ekranu, tačiau „ATtiny2313“būtų pritrūkę išteklių. Laimei, „Atmel“pateikė būdą, kaip išspręsti šią problemą, įtraukdamas sąsają, kuri gali susieti su papildomomis mikroschemomis (pvz., Atminties ar įvesties/išvesties prievadais) su paprasta dviejų laidų sąsaja. Teisingai, naudodami tik du įvesties/išvesties kaiščius AVR, galime pasiekti daugybę papildomų įvesties/išvesties kaiščių ir kitus išteklius. Ši dviejų laidų sąsaja oficialiai žinoma kaip integruotos grandinės magistralė arba tiesiog I2C magistralė, kurią NXP išrado dar būdama „Philips Semiconductors“. Jei skaitote šią instrukciją, tikriausiai girdėjote apie I2C magistralę ir galbūt ją naudojote PIC ar kitame mikrovaldiklyje. Nors programinės įrangos tvarkyklės yra konceptualiai labai paprastos ir palaikomos AVR aparatinės įrangos ištekliais, jos vis tiek yra būtinos norint naudoti I2C magistralę. „Atmel“pateikia taikymo pastabas (žr. Išteklius vėliau šioje instrukcijoje), tačiau jos yra neišsamios ir nerodo jokių pavyzdžių, išskyrus bendravimą su kitu AVR įrenginiu. Šios instrukcijos tikslas nėra išmokyti visus, kaip sukurti I2C tvarkykles AVR. Atvirkščiai, pateiksiu išplėstines „Atmel“tvarkyklių versijas ATtiny2313 ir ATmega168 įrenginiams, paaiškinsiu reikalavimus ir apribojimus, taikomus naudojant šiuos įrenginius, ir parodysiu veikiančius I2C įrenginių pavyzdžius. Po to, kai atliksite šią instrukciją, galėsite sėkmingai naudoti I2C magistralę savo AVR projektuose. Akivaizdu, kad galite ignoruoti mažos arba MEGA tvarkykles, jei jus domina tik vienas iš jų. Tiems, kurie nori daugiau sužinoti apie I2C autobusą, pateiksiu nuorodas į atitinkamą medžiagą.

1 žingsnis: kas vis dėlto yra visa tai „I2C“medžiaga?

Kas čia per „I2C“?
Kas čia per „I2C“?
Kas čia per „I2C“?
Kas čia per „I2C“?
Kas čia per „I2C“?
Kas čia per „I2C“?
Kas čia per „I2C“?
Kas čia per „I2C“?

I2C magistralė yra paprastas dviejų laidų ryšys, galintis sujungti kelis įrenginius ir leisti jiems keistis duomenimis. Paprasčiausiu pavidalu yra vienas pagrindinis įrenginys, kuris bendrauja su keliais pavaldžiais įrenginiais. Visi įrenginiai yra prijungti lygiagrečiai prie dviejų I2C magistralės laidų. Du laidai yra žinomi kaip SCL ir SDA. SCL yra laikrodžio linija, kurią valdo pagrindinis įrenginys. SDA yra dvikryptė duomenų linija. Norėdami perduoti duomenis, pagrindinis siunčia slave adresą kartu su vieno bito skaitymo/rašymo vėliava. Jei norima rašyti, kapitonas ir toliau siunčia duomenis adresuotam vergui. Jei prašoma skaityti, vergas atsakys pateikdamas duomenis. Norėdami koordinuoti operacijas, SCL ir SDA linijos yra valdomos kapitono ir pavaldinio, kad signalizuotų apie kelias sąlygas. Tai apima START, STOP, ACK (patvirtinti) ir NAK (nepripažinti). Išsamią informaciją apie šias sąlygas tvarko vairuotojai. Tikrieji geikai gali sužinoti visą informaciją šios nuorodos pabaigoje pateiktose nuorodose. Elektros reikalavimai yra gana paprasti. Pagrindinis ir vergas turi naudoti tą patį Vcc lygį, pagrindai turi būti prijungti, o SCL ir SDA linijos turi būti ištrauktos iki Vcc. Pritraukiamųjų rezistorių vertė tiksliai nustatoma apskaičiuojant pagal bendrą magistralės talpą, tačiau praktiškai tai gali būti beveik bet kokia vertė nuo 1,8K iki 10K. Pradedu nuo 5.1K ir naudoju mažesnes reikšmes, kol jis veikia. Paprastai tai nėra problema, nebent tarp įrenginių turite daug įrenginių arba ilgus laidus. Nominali duomenų perdavimo sparta I2C magistralėje yra 100 KB/s. Taip pat galimi 400 KB/s, 1 MB/s ir didesni tarifai, tačiau šios instrukcijos tvarkyklės nepalaiko. Visi I2C įrenginiai veiks 100Kbit/s greičiu. Kiekvienas ATtiny2313 ir ATmega168 skirtingai įgyvendina I2C magistralę. „ATtiny2313“naudoja „Universal Serial Interface“(USI) aparatinę įrangą, kuri taip pat gali būti naudojama SPI magistralėje. „ATmega168“turi specialią I2C magistralės įrangą, žinomą kaip dviejų laidų sąsaja (TWI). Parašius tvarkykles, šie skirtumai vartotojui dažniausiai yra skaidrūs. Vienas reikšmingas skirtumas yra programinėje įrangoje: „ATmega168 I2C“tvarkyklė yra pertraukiama, o „ATtiny2313“- ne. Tai reiškia, kad ATmega168 programai nereikia laukti, kol bus perduoti I2C duomenys, o tik palaukti, kol bus pradėtas kitas perdavimas, arba kol bus gauti duomenys iš skaitymo operacijos. Toliau pateikiami pavyzdžiai ir diskusijos turėtų tai aiškiai parodyti. I2C adresai yra 7 bitų ilgio, todėl magistralėje gali būti iki 127 įrenginių, jei kiekvienas turi unikalų adresą. Kaip parodyta paveikslėlyje, šis 7 bitų adresas perkeliamas į kairę vienu bitu, o mažiausiai reikšmingas bitas naudojamas prietaiso skaitymui ar rašymui pažymėti adresu. Taigi visas pavaldinio adresas yra 8 bitų baitas. Tikrasis adresas iš dalies nustatomas įrenginio viduje ir jo negalima pakeisti (4 reikšmingiausi bitai), o iš dalies nustatomi bitai, kurie gali būti prijungti prie įrenginio kaiščių (3 mažiausiai reikšmingi bitai), kuriuos galima susieti aukštai arba žemai konkretų adresą. Skamba painiai, bet pavyzdys tai paaiškins. Iš PCA8574A duomenų lapo matyti, kad keturi reikšmingiausi I2C adreso bitai visada bus 0111. Kitus tris bitus lemia AD0, AD1 ir AD2 kaiščių nustatymai. Šie kaiščiai gali būti pririšti prie žemės arba prie teigiamos įtampos (5 voltų), kad būtų atitinkamai 0 arba 1. Taigi galimų adresų diapazonas yra 38–3 F šešioliktainiai, kaip parodyta kitame paveiksle iš PCA8574 duomenų lapo. Taigi, pakeitus adreso bitų nustatymus, I2C magistralėje vienu metu gali būti iki 8 PCA8574A. Kiekvienas atsakys tik į savo konkretų vergo adresą. Jei reikia dar daugiau įvesties/išvesties prievadų, galima naudoti PCA8574. Vienintelis skirtumas tarp PCA8574 ir PCA8574A yra tas, kad PCA8574 I2C vergių adresų diapazonas yra nuo 20 iki 27 šešioliktainiai. Tam tikro įrenginio adreso nustatymas gali būti painus, nes kai kuriuose duomenų lapuose skaitymo/rašymo bitas yra dalis adresu. Atidžiai perskaitykite duomenų lapą ir atminkite, kad vergo adresas bus 7 bitų. Skaitymo/rašymo bitą reikia vertinti atskirai. Vėlgi, pavyzdys padės. 24C16 EEPROM duomenų lape, su kuriuo eksperimentuosime, teigiama, kad pirmieji (reikšmingiausi) keturi pavaldinio adreso bitai yra 1010. Kitus tris bitus galima nustatyti pagal A0, A1 ir A2; tačiau atkreipkite dėmesį, kad duomenų lapas taip pat apima 24C01–24C08, kurie yra mažesnio dydžio EEPROM. Duomenų lapo paveikslėlyje parodyta, kad didėjant dydžiui šių adresų bitų nustatymai ignoruojami ir 24C16 visiškai ignoruojami. Tai reiškia, kad paskutiniai trys bitai nesvarbūs, o 24C16 iš tikrųjų naudoja visus I2C slave adresus nuo 50 iki 57 šešioliktainių. Vergų adresų diapazonas iš tikrųjų bus skirtas įvairiems 24C16 skyriams. Pirmieji 256 baitai yra adresu 50h, kiti 256 - 51h ir tt iki paskutinių 256 baitų 57h - iš viso 2K baitų. Kadangi PCF8570 RAM, su kuriuo mes taip pat eksperimentuojame, adresas yra šiame diapazone, 24C16 ir PCF8570 negalima naudoti kartu.

2 veiksmas: užsisakykite kai kuriuos „I2C“įrenginius

Dabar, kai šiek tiek žinote apie „I2C Bus“ir norite juo naudotis, kodėl gi ne užsisakyti kai kurių „I2C“įrenginių, kad jie galėtų eksperimentuoti, kad jie būtų pakeliui pas jus, kol ruošiate programinę įrangą? Tinkami įrenginiai apima I/ I O sąsajos plėtiklis (mano mėgstamiausias), statinis ram ir EEPROM. Yra daug daugiau, bet tai puiki pradžia. AVR procesoriai, kuriuos naudosime, yra ATtiny2313 ir Atmega168 (naudojami „Arduino“). Jei esate naujokas, pažvelkite į šį puikų „Instructable“, kad sužinotumėte apie juos ir sukurtumėte savo „Ghetto Development System“. „ATmega168“schema šioje instrukcijoje parodo, kaip įdiegti „Ghetto Development System“šiam procesoriui. Lygiagrečiojo prievado kabelis yra toks pat kaip ir „ATtiny2313“. (Nebandžiau „Ghetto Development System“USB versijos, todėl nesu tikras, kaip jame galima pasiekti I2C magistralę. Tas pats ir su „Arduino“.) Čia yra „Digikey“dalių numeriai. Uosto plėtiklis: 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

3 žingsnis: I2C tvarkyklės

Čia pateikiami I2C magistralės vairuotojo funkcijų aprašymai. Jie buvo sukurti naudojant „Atmel Apps Notes“pradedantiesiems. Negalėčiau to padaryti be jų kaip pagrindo, kuriuo galėčiau remtis. Kūrimas buvo atliktas naudojant „WinAVR“ir „gcc C“kompiliatorių. Toliau aprašyti kiekvieno procesoriaus laikrodžio greičio apribojimai. Kadangi aš negaliu išbandyti visų galimų procesoriaus skonio / laikrodžio dažnio derinių, aš tiesiog laikysiuosi to, ką iš tikrųjų galiu išbandyti, ir bandysiu nurodyti apribojimus ir apribojimus. Čia pateikiamos tvarkyklės funkcijos ir kaip jas naudoti. Norėdami gauti daugiau informacijos ir pamatyti funkcijas, naudojamas visose programose, žr. Pavyzdžius. ATtiny2313: Laikrodžio reikalavimas: tvarkyklės sukurtos 1MHz (numatytasis dažnis) ATtiny2313 laikrodžio dažniui. Jei norite veikti kitu greičiu, turėsite pakoreguoti tvarkyklių konstantas. Parašykite man el. Paštu, jei jums reikia pagalbos tai atliekant. Taip pat galite gauti patarimų iš „Atmel“programų pastabų, esančių šaltinių veiksmo nuorodose. USI_TWI_Master_Initialise () Ši funkcija inicijuoja USI aparatinę įrangą, skirtą veikti I2C režimu. Skambinkite vieną kartą programos pradžioje. Ji grąžina negaliojančią ir nėra argumentų. USI_TWI_Get_State_Info () Ši funkcija pateikia I2C klaidos informaciją ir naudojama, jei įvyko klaida atliekant I2C operaciją. Kadangi ši funkcija pateikia tik klaidos kodą, klaidos šviesos diodui mirksėti naudoju funkciją TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg). Klaidų kodai yra apibrėžti USI_TWI_Master.h. Štai kaip tai pavadinti: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () Ši funkcija naudojama skaityti ir rašyti pavienius baitus į I2C įrenginius. Jis taip pat naudojamas rašyti kelis baitus. Norėdami naudoti šią funkciją, turite atlikti 6 veiksmus.1) Savo programoje paskelbkite pranešimų buferį, kad išlaikytumėte vergo adresą ir duomenų baitą, kurį norite išsiųsti ar gauti. unsigned char messageBuf (MESSAGEBUF_SIZE); 2) Įdėkite vergų adresą kaip pirmąjį baitą į buferį. Perkelkite jį šiek tiek į kairę ir ARBA į skaitymo/rašymo bitą. Atkreipkite dėmesį, kad skaitymo/rašymo bitas bus 1 skaitant ir 0 rašant. Šis pavyzdys skirtas skaitymui. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (TIESA << TWI_READ_BIT); 3) Atlikdami rašymą, įdėkite įrašytiną baitą į kitą buferio vietą. grąžintą vertę (šiuo atveju - temp) galima patikrinti, ar įvyko klaida. Jei taip, tai tvarkoma taip, kaip aptarta aukščiau. 6) Jei buvo paprašyta skaityti, baitų skaitymas bus antroje buferio vietoje. Jei reikia įrašyti kelis baitus (pvz., Į atminties įrenginį), galima naudoti tą pačią tvarką. Buferio nustatymas ir rutinos iškvietimas šiek tiek skiriasi. Antrasis baitas buferyje bus pradinis atminties adresas, į kurį reikia rašyti. Duomenys, kuriuos reikia įrašyti, bus keliais baitais. Pranešimo dydis bus tokio dydžio, kaip ir visi galiojantys duomenys. Taigi, jei reikia parašyti 6 baitus, pranešimo dydis bus 8 (pavaldinio adresas + atminties adresas + 6 baitai duomenų). kažkoks prisiminimas. Šios tvarkos naudojimas yra labai panašus į ankstesnę, išskyrus dvi išimtis. Skaitymo/rašymo bitų nustatymas nesvarbus. Paskambinus šiai procedūrai, visada bus atlikta skaitymo operacija. Pranešimo dydis turi būti 2 ir perskaitytinų baitų skaičius. Jei klaidų neįvyko, duomenys bus buferyje, prasidedantys antroje vietoje. ATmega168: Laikrodžio reikalavimas: tvarkyklės yra skirtos 4 MHz dažniui ATmega168. Pavyzdinis kodas parodo, kaip nustatyti šį laikrodžio dažnį. Jei norite veikti kitu greičiu, turėsite pakoreguoti tvarkyklių konstantas. Jei jums reikia tai padaryti, atsiųskite man el. Laišką. TWI_Master_Initialise () Ši funkcija inicijuoja TWI aparatinę įrangą, skirtą veikti I2C režimu. Skambinkite vieną kartą programos pradžioje. Grįžta tuščia ir nėra jokių argumentų. Būtinai įjunkite pertraukas, inicijuodami skambindami „swi“(). TWI_Get_State_Info () Ši funkcija pateikia I2C klaidos informaciją ir naudojama, jei I2C operacijos metu įvyko klaida. Kadangi ši funkcija pateikia tik klaidos kodą, klaidos šviesos diodui mirksėti naudoju funkciją TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg). Klaidų kodai yra apibrėžti TWI_Master.h, tačiau modifikuojami taip, kad signalizuotų apie klaidos šviesos diodą. Daugiau informacijos rasite kodo pavyzdyje. Štai kaip tai pavadinti: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) Atminkite, kad klaidų tikrinimas atliekamas įsitikinus, kad I2C operacija baigta (toliau aprašyta funkcija), o tada šiek tiek išbandę bendrosios būsenos žodį. TWI_Start_Read_Write () TWI_Start_and dvi funkcijos veikia taip pat, kaip ir anksčiau aprašytos atitinkamos funkcijos, tačiau su keliomis išimtimis. Jie negrąžina jokių klaidų verčių. Nuskaityti duomenys neperkeliami į buferį. Tai bus padaryta naudojant toliau aprašytą funkciją. Skambinant TWI_Start_Random_Read, pranešimo dydis turėtų būti prašomas duomenų baitų skaičius plius vienas, o ne du. ATmega168 I2C tvarkyklė yra pertraukiama. Y., I2C operacijos pradedamos ir tada vykdomos nepriklausomai, kol pagrindinė rutina ir toliau veikia. Kai pagrindinė rutina nori duomenų iš pradėtos „I2C“operacijos, ji turi patikrinti, ar duomenys yra prieinami. Situacija yra ta pati ir tikrinant klaidas. Pagrindinė rutina turi būti tikra, kad I2C operacija yra baigta prieš tikrinant, ar nėra klaidų. Kitos dvi funkcijos yra naudojamos šiems tikslams. TWI_Transceiver_Busy () Paskambinkite šiai funkcijai, kad patikrintumėte, ar I2C operacija yra baigta prieš tikrinant, ar nėra klaidų. Programų pavyzdžiai parodo, kaip tai naudoti. TWI_Read_Data_From_Buffer () Paskambinkite šia funkcija, jei norite perkelti duomenis iš I2C tvarkyklės gavimo buferio į pranešimų buferį. Ši funkcija užtikrins, kad I2C operacija būtų baigta prieš perduodant duomenis. Nors ši funkcija grąžina vertę, manau, kad patikrinti klaidos bitą yra patikimiau. Štai kaip tai pavadinti. Pranešimo dydis turi būti vienu didesnis už norimą duomenų bitų skaičių. Duomenys bus „messageBuf“, pradedant nuo antros vietos.temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

4 žingsnis: Kurkime

Kurkime!
Kurkime!
Kurkime!
Kurkime!
Kurkime!
Kurkime!
Kurkime!
Kurkime!

Pradėkite atsisiųsdami failą I2C Schematics.zip. Galbūt norėsite savo darbo zonoje sukurti I2C aplanką, kuriame būtų schemos ir pavyzdiniai programos failai. Išpakuokite schemas į šį katalogą. Rasite aplanką pavadinimu „I2C Schematics“. Atidarykite failą pavadinimu tiny I2C.pdf. Šioje schemoje pavaizduota „ATtiny2313 Ghetto Development System“ir „PCA8574A“įvesties/išvesties prievado plėtiklis (aplink yra didelė punktyrinė dėžutė). „Port Expander“grandinė pastatyta ant duonos lentos. Pažiūrėkite į nuotraukas, kad pamatytumėte, kaip atrodo šios grandinės. Jie tikrai gana paprasti. Schemos ATtiny2313 dalis yra tik „Ghetto Development System“su trimis mirksėjimo žibintais (LED1, 2 ir 3, plius R4, 5 ir 6) ir mygtuku (S1), prijungtu prie jo, plius vienas papildoma detalė. Ši detalė yra papildomi džemperiai (JP4, 5 ir 6), kuriuos galima nuimti, kad būtų galima prijungti I2C magistralės SCL ir SDA linijas. Džemperiai turi būti programavimo vietoje, tada nuimti, kad būtų galima prijungti SCL ir SDA. Nuotraukose matyti, kad džemperiai yra vietoje ir nuimami. Šių džemperių vieta priklauso nuo jūsų, tiesiog turite juos įdėti į „Ghetto Development System“, jei norite naudoti I2C magistralę. I2C magistralė turi būti atjungta ir įdėti trumpikliai programavimui. Atminkite, kad jums tikrai reikia rūpintis tik „I4C“magistralės JP4 ir JP6. Įdėkite JP5, jei manote, kad kada nors norėsite naudoti SPI magistralę. PCA8574A įvesties/išvesties prievado išplėtimas yra labai paprastas. Pateikite Vcc (+5 voltų) ir Gnd (įžeminimo) jungtis ir prijunkite AD0, 1 ir 2 prie žemės (I2C vergo adresas yra 38 šešiakampis). Tada prijunkite 4 mirksinčius žibintus ir 4 DIP jungiklius. (Jei neturite DIP jungiklių, galite tiesiog naudoti laidus. Pririškite prie žemės arba palikite plūduriuojantį, kad įjungtumėte arba išjungtumėte signalą.) Galiausiai prijunkite prisitraukimo rezistorius (R11 ir 12) iš SDA ir SCL prie Vcc. Jie rodomi kaip 3,3 tūkst., Bet bet kokia vertė nuo 1,8 tūkst. Iki 5,1 tūkst. Turėtų veikti (galbūt iki 10 tūkst., Bet aš to nebandžiau). Užprogramavę ATtiny2313, galite nuimti trumpiklius ir prijungti SDA bei SCL testavimui. Dabar ATmega168. Vienintelė raukšlė yra ta, kad galbūt nesate sukūrę „Ghetto Development System“šiam procesoriui. Jei taip yra, tada mano pateikta schema (MEGA I2C.pdf) parodys, kaip tai padaryti. Tai tik „ATtiny2313“versijos permacija. Jei planuojate iš anksto, galite įsitikinti, kad jūsų programavimo kabelis tiks abiem sistemoms. Pagrindinis skirtumas yra C2 ir C3 pridėjimas. Norėdami juos išdėstyti, žiūrėkite paveikslėlius, jie turėtų būti labai arti lusto; vienas iš jų iš tikrųjų yra po lustu. Tai padeda išvengti triukšmo, ypač iš analoginio į skaitmeninį keitiklį. Jums nereikia dėti trumpiklių, nebent planuojate naudoti SPI magistralę, nes jie nėra reikalingi šios mikroschemos I2C magistralėms. Atminkite, kad „PCA8754A“duonos plokštė nebus pakeista. Jūs tiesiog prijungsite SDA ir SCL ir eisite! Lengva, ane?

5 žingsnis: koduokime ir išbandykime

Koduokime ir testuokime!
Koduokime ir testuokime!
Koduokime ir testuokime!
Koduokime ir testuokime!
Koduokime ir testuokime!
Koduokime ir testuokime!

Atėjo laikas sukurti tvarkykles ir pavyzdines programas. Pradėsime nuo ką tik sukurtos „ATtiny2313“ir „PCA8574A“lentos. Atsisiųskite failą I2C.zip į savo I2C darbo katalogą ir išpakuokite jį. Turėsite naują aplanką I2C. Jame rasite USI I2C (ATtiny2313) ir TWI I2C (ATmega168). USI I2C rasite aplanką I_O Port. Šiame aplanke yra mūsų pirmosios pavyzdinės programos kodas ir USI I2C tvarkyklės. Naudodami „WinAVR“, sukompiliuokite ir įkelkite kodą į „ATtiny2313“. Giliai įkvėpkite ir įjunkite maitinimą. Štai ko tikėtis: įjungus ATtiny2313 prievado PD6 1 šviesos diodas mirksi du kartus. Nieko daugiau neįvyks, kol nepaspausite mygtuko (S1). Kiekvieną kartą paspaudus mygtuką, jungikliai skaitomi ir jų nustatymai rodomi prie PCA8574A prijungtuose šviesos dioduose. Pakeiskite jungiklių vertę, paspauskite mygtuką ir šviesos diodai turėtų pasikeisti. Tęskite tai, kol neįveiksite jaudulio, kai pamatysite, kaip jis veikia. Jei (neduok Dieve!) Viskas neveikia taip, kaip tikėtasi, atidžiai patikrinkite laidus. Apie I2C klaidas signalizuos LED3 (PD4) mirksėjimas ir tikriausiai reiškia, kad turite patikrinti, ar SDA ir SCL yra prijungti prie tinkamų kaiščių ir tinkamai ištraukti. Jei viskas vis tiek neveikia, perskaitykite likusią šio skyriaus dalį, kad sužinotumėte apie derinimą. Dabar grįžkite atgal ir pažvelkime į kodą. Atidarykite failą USI_I2C_Port.c. Tai yra pavyzdinės programos kodas. (USI_TWI_Master.c ir USI_TWI_Master.h yra tvarkyklės - galite jų nepaisyti, nebent jums įdomu.) Naudokite pavyzdį, kad galėtumėte vadovautis savo I2C programomis. Dažniausiai programa parodo, kaip inicijuoti ir naudoti I2C tvarkykles, įskaitant nustatymus nustatyti vergo adresą ir likusią pranešimų buferio dalį bei ištraukti duomenis iš jo. Taip pat pamatysite, kaip aš išjungiu mygtuką ir nustatysiu ciklo trukmę. Verta paminėti keletą programos detalių. Atminkite, kad duomenys iš jungiklių yra apversti prieš juos įrašant į prievado plėtiklio šviesos diodus. Taip pat atkreipkite dėmesį, kad „Port Expander“įvesties prievadai turi būti parašyti kaip „High“, kad jie tinkamai veiktų. Ši informacija aprašyta PCA8574A duomenų lape. Visada atidžiai perskaitykite duomenų lapus! Labiau įdomu yra sąlyginio derinimo naudojimas. Netoli programos failo pradžios yra teiginys // #define DEBUG ir apibarstomas visame kode yra #ifdef DEBUG sakiniai. Kol DEBUG nėra apibrėžta (abu pasvirieji brūkšniai daro eilutę komentare ir neleidžia jos apibrėžti), kodas #ifdef į #endif nebus sukompiliuotas. Bet jei viskas neveikia taip, kaip tikėjotės, iš naujo sukompiliuokite ir įkelkite kodą naudodami #define DEBUG nekomentuodami. Jūs gausite daugiau mirksėjimų šviesos dioduose, kuriuos galite iššifruoti, kad galėtumėte sekti savo programos vykdymą ir padėti jums tiksliai nustatyti, kur viskas negerai. Tiesą sakant, aš rekomenduoju tai išbandyti, kad pamatytumėte, kas atsitiks. Pamatysite, kad 2 šviesos diodas (PD5) mirksės vykdant programą. Reikšmė, nuskaityta iš jungiklių, mirksi 1 LED (PD6), prieš tai rodant prievado plėtiklio šviesos dioduose. Turėtumėte turėti galimybę sekti programą, kaip ji veikia, naudodami šiuos šviesos diodus. Toliau dirbsime su ATmega168; praleiskite šį skyrių, jei jus domina tik „ATtiny2313“. Vis dar su manimi? Gerai. Perkelkite į aplanką TWI_I2C, pakeiskite savo darbo katalogą į IO_Port ir sukompiliuokite bei įkelkite TWI_I2C_Port.c į ATmega168. Atjunkite SDA ir SCL linijas nuo ATtiny2313 ir prijunkite jas prie ATmega168. Prijunkite maitinimą ir žemę, ir įjunkite. Operacija turi būti tokia pati! Žaisk, kol susijaudinimas išnyks, tada pažvelkime į kodą. Atidarykite TWI_I2C_Port.c. Kodas yra beveik identiškas, išskyrus klaidų tvarkymą ir pertraukiamus vairuotojus. Čia yra skirtumai: Atkreipkite dėmesį, kad laikrodis turi būti nustatytas 4 MHz, kad I2C magistralė veiktų tinkamai. Sei (); pareiškimas įjungia pertraukas inicijavus I2C tvarkykles. Norėdami patikrinti, ar nėra klaidų, išbandomas konkretus būsenos bitas. Skaitymo metu turi būti iškviesta funkcija TWI_Read_Data_From_Buffer, kad perskaityti duomenys būtų perkelti į pranešimų buferį. Rašymo metu (TWI_Transceiver_Busy ()) reikia naudoti, kad įsitikintumėte, jog perkėlimas baigtas prieš tikrinant, ar nėra klaidų. Šios dvi paskutinės funkcijos aprašytos aukščiau tvarkyklių aprašyme. Išskyrus tai, kodas yra beveik toks pat kaip ir „ATtiny2313“. DEBUG veikia taip pat, jei norite su tuo eksperimentuoti.

6 veiksmas: „I2C“atminties naudojimas

Naudojant I2C atmintį
Naudojant I2C atmintį
Naudojant I2C atmintį
Naudojant I2C atmintį
Naudojant I2C atmintį
Naudojant I2C atmintį
Naudojant I2C atmintį
Naudojant I2C atmintį

Dabar, kai išmokome naudoti I2C magistralę skaityti ir rašyti įvesties/išvesties prievado plėtiklį, pereikime prie I2C atminties, tiek RAM, tiek EEPROM, naudojimo. Pagrindinis skirtumas yra tas, kad kelis baitus galima nuskaityti į atmintį arba įrašyti iš jos naudojant vieną I2C komandą. Norėdami pasiruošti šiems eksperimentams, turime šiek tiek modifikuoti aparatūrą ir sukurti porą naujų grandinių. Laikykite prievado plėtiklio grandinę, nes mes ją naudosime kai kurioms atminties vertėms rodyti. Nuimkite DIP jungiklius iš PCA8574A ir uždėkite ant tų kaiščių mirksinčius žibintus. Jei neturite pakankamai mirksinčių žibintų, perkelkite tuos, kurie yra nuo P4 iki P7, į P0 per P3. (Rodomos vertės yra pakankamai mažos.) Dabar pažiūrėkite į schematinį I2C Ram.pdf ir prijunkite PCF8570 prie lentos. Taip pat pažiūrėkite į paveikslėlį. Būtinai prijunkite 7 kaištį prie Vcc. Paleiskite laidus SDA ir SCL iš PCA8574A. Nereikia jokių papildomų traukimo rezistorių. Jei jus taip pat domina EEPROM, sukurkite tą grandinę taip pat naudodami 24216 I2C EEPROM.pdf, tačiau įspėkite, kad pavyzdys naudoja ATmega168. Ši grandinė yra tikrai paprasta. Kaip aptarta aukščiau, adresų bitų reikia nepaisyti. Tiesiog prijunkite maitinimą ir žemę. Dar neprijunkite SDA ir SCL, nes nebaigėme eksperimentuoti su „Ram“. Pradėsime atminties eksperimentus su ATtiny2313, prijungtu prie PCA8574A prievado plėtiklio ir prie PCF8570 Ram. Programa įrašys tam tikrus skaičius į „Ram“, tada perskaitys juos ir parodys „Port Expander“. Pakeiskite savo darbo katalogą į RAM pagal USI I2C. USI_I2C_RAM.c sukompiliuokite ir atsisiųskite failą make. Atminkite, kad I2C tvarkyklės failai yra identiški tiems, kuriuos naudojome anksčiau. Prijunkite maitinimą ir pamatysite vieną mirksėjimą 1 LED (PD6). Duomenys bus įrašyti į pirmuosius 4 baitus atminties. Paspauskite mygtuką ir du baitai bus perskaityti ir rodomi. Prievado plėtiklyje (P0) turėtumėte matyti vieną šviesos diodą, dviejų sekundžių pertrauką, tada du šviesos diodus (P0 ir P1). Dar dvi sekundės pauzė ir šviesos diodai turėtų išsijungti. Norėdami pradėti seką iš naujo, dar kartą paspauskite mygtuką. Derinimas yra panašus į aukščiau aprašytą metodą. Pažvelkime į kodą. Atidarykite USI_I2C_RAM.c. Jis turėtų atrodyti gana panašus į ankstesnį kodą. Pagrindiniai skirtumai yra skaitymo ir rašymo atminties detalės. Pažiūrėkite, kaip įkeliamas pranešimų buferis prieš skambutį, kuris iš tikrųjų atlieka rašymą. Pirmasis baitas yra vergo adresas, kuriame tinkamai nustatytas skaitymo/rašymo bitas. Bet kitas baitas yra atminties adresas, kuriuo reikia pradėti rašyti duomenis. Tada ateina faktiniai duomenų baitai, kurie bus nuosekliai įkeliami į atmintį, pradedant nuo mūsų nurodyto adreso. Mes nurodome pranešimo dydį kaip 6. Taigi mes pradedame rašyti adresu 00 ir įrašome reikšmes 01, 03, 02 ir 06 į atminties vietas nuo 00 iki 03. Norėdami perskaityti duomenis iš atminties, turime naudoti funkciją USI_TWI_Start_Random_Read. Pranešimų buferis gauna vergo adresą pirmame baite ir pradinį adresą antrame baite. Tada iškvieskite šią funkciją, kai pranešimo dydis yra nustatytas nuskaitytinų baitų skaičiui plius 2. Atminkite, kad skaitymo/rašymo bitas nesvarbus, nes skaitymas bus atliktas nepriklausomai. Grąžinti duomenys prasidės antroje pranešimų buferio vietoje. Kai duomenys bus perskaityti, jie bus apversti, kad būtų rodomi „Port Expander“, ir į juos įrašomas po vieną baitą su pertrauka tarp verčių. Galiausiai išjungiami „Port Expander“šviesos diodai. Raštai „Port Expander“yra identiški tam, kas buvo padaryta ankstesniuose pavyzdžiuose. Norėdami linksmintis, galite nekomentuoti #define DEBUG teiginio, kaip aprašyta aukščiau, ir pamatyti daugybę mirksinčių šviesos diodų. Po kito sėkmingo eksperimento apimtas jaudulio, pereikime prie ATmega168 ir EEPROM. Pakeiskite savo darbo katalogą į EEPROM pagal TWI I2C. Norėdami sudaryti ir atsisiųsti TWI_I2C_EEPROM.c, naudokite failą make. Atminkite, kad I2C tvarkyklės failai yra identiški tiems, kuriuos anksčiau naudojome PCA8574A. Norėdami išbandyti programą, atjunkite ATtiny2313 ir prijunkite ATmega168. Palikite I2C magistralę prijungtą prie „Ram“ir įjunkite. Rezultatai skiriasi, nes dabar rašome ir skaitome daugiau duomenų. Inicijuojant indikatorius PD7 turėtų mirksėti. Paspauskite mygtuką ir duomenys bus perskaityti iš atminties ir rodomi. Šviesos diodai ant PCA8574 turėtų mirksėti tokia seka: P1, P0 ir P2, (visi išjungti), P0 & P1, P1 ir P2. Galiausiai visi prievado šviesos diodai turėtų užgesti. Norėdami tai pakartoti, dar kartą paspauskite mygtuką. O, bet palaukite, sakote. Ar ši programa nėra skirta EEPROM? Kadangi prieiname prie atminties įrenginio tuo pačiu I2C adresu, ta pati programa veikia ir „Ram“, ir „EEPROM“. Išjunkite ir perkelkite SDA ir SCL iš „Ram“į EEPROM ir vėl paleiskite programą. Tai turėtų veikti lygiai taip pat. Atminkite, kad EEPROM ir „Ram“negalima vienu metu prijungti prie I2C magistralės, nes jie turi tą patį adresą. (Sumaniausi iš jūsų gali apsvarstyti galimybę pakeisti programuojamus adreso bitus „Ram“, bet tai vis tiek neveiks. 24C16 naudoja visą adresų bloką, kurį galima užprogramuoti „Ram“.) Gerai, pažvelkime į šią paskutinę programą. Atidarykite TWI_I2C_EEPROM.c. Pirmiausia reikia pastebėti, kad nurodžiau, kaip spręsti visą 24C16 EEPROM. Jį galima pasiekti 256 baitų dalimis 8 skirtingais I2C vergų adresais. Pažiūrėkite, kaip MEMORY_ADDR yra apibrėžtas kaip pradinis adresas esant 50 šešioliktainiams skaičiams; todėl ir veikė Avinas. Jei norite pasiekti kitus 24C16 blokus, naudokite kitus mano nurodytus adresus. Pažiūrėkite, kaip aš prisiruošiau rašyti į atmintį. Pirmiausia į buferį įdedamas vergo adresas su skaitymo/rašymo bitų rinkiniu, tada pradinis 00, tada 16 baitų duomenų adresas. Funkcija TWI_Start_Read_Write yra kviečiama rašyti duomenis (kaip ir anksčiau), kai pranešimo dydis nustatytas į 18. Kai paspaudžiamas mygtukas, mes naudojame TWI_Start_Random_Read ir TWI_Read_Data_From_Buffer, kad perskaitytume duomenis. Prievado plėtiklio šviesos dioduose rodomas kas trečias baitas. Galiausiai šviesos diodai išjungiami laukiant kito mygtuko paspaudimo. Jums gali kilti klausimas, kodėl pasirinkau parašyti 16 baitų. Jei atidžiai perskaitysite duomenų lapą, pamatysite, kad 24C16 atlieka rašymo ciklą, kai gauna 16 baitų, net jei siunčiama daugiau baitų. Taigi tai atrodė gražus skaičius. Jei nuspręsite tai padidinti, turėsite pakeisti MESSAGEBUF_SIZE dydį. Taip pat turėsite pakeisti TWI_BUFFER_SIZE vertę TWI_Master.h. Taip yra todėl, kad tvarkyklė nukopijuoja duomenis iš pranešimų buferio, kad galėtų naudoti pertraukimo paslaugos. Sveikinu! Dabar esate pasirengęs naudoti I2C magistralę savo projektuose!

7 žingsnis: žiniatinklio ištekliai

Čia yra nuorodos į eksperimentams naudojamų dalių duomenų lapus. Jei nieko daugiau negausite, tai tikrai turėtumėte gauti. Port ExpanderRamEEPROMBūdamas „I2C“kūrėjas, „NXP“(„Philips“) turi daugybę puikių dalykų. (Jie mėgsta naudoti laužtinius skliaustus savo URL, todėl negaliu jų tinkamai įtraukti čia. Atsiprašome.] Norėdami patekti į I2C sritį, produktų sąraše pasirinkite sąsają. Galėsite patekti į jų I2C svetainę ir prieiga prie visų jų siūlomų duomenų lapų ir programų pastabų. Ypač čia pateikiamas I2C magistralės aprašymas ir techninė informacija. Gaukite ATtiny2313 ir ATmega168 duomenų lapus (duomenų knygas?) iš „Atmel“. „Atmel“programos pastabos yra čia. Pažvelkite į AVR310 ir AVR315. Taip pat patraukite kodą. Čia rasite daug daugiau „I2C“dalykų.

8 žingsnis: pastabos „Geeks“

Tikram geekui, norinčiam sužinoti išsamią informaciją, reikia atsižvelgti į kai kuriuos dalykus, jei pažvelgsite į „Atmel Apps“pastabas ir tvarkyklės kodą:- „I2C“įrenginio adresavimo ir valdymo metodas nėra specifikacijų dalis! Išskyrus vergo adresą ir skaitymo/rašymo bitą, komandos, režimai ir kt. Nėra nurodyti ir yra būdingi tam tikram įrenginiui. Kad tai būtų labai aišku, atkreipkite dėmesį, kad „Atmel“pavyzdyje naudojama schema taikoma tik šiam pavyzdžiui ir yra beveik nestandartinė.- USI diegimas skiriasi nuo TWI įgyvendinimo keliais svarbiais būdais. + Naudojant USI, laikrodis pateikiamas programine įranga; su TWI ją teikia bitų spartos generatorius. + USI metodas nenaudoja pertraukimų; TWI tai daro. Tai turi tam tikrą prasmę, nes „Mega“šeima (naudodama TWI) gali užsiimti daugybe kitų dalykų ir neturėtų būti perkrauta „I2C“perkėlimų. Neabejotinai įmanoma pertraukimo varoma USI versija, ji tiesiog neįdiegta šioje instrukcijoje. + USI aparatinė įranga nėra optimizuota I2C ir gali apdoroti tik 8 bitų perdavimą. Tai reiškia, kad norint perduoti devintąjį bitą (NACK arba ACK) reikia dviejų perdavimų. TWI aparatūra tai tvarko automatiškai. Tai šiek tiek apsunkina USI tvarkyklės įdiegimą. + TWI klaidų aptikimas tvarkomas aparatinėje įrangoje. USI reikalauja tvarkyti programinę įrangą, kuri šiek tiek apsunkina dalykus. + TWI aparatūra tiesiogiai valdo prievado konfigūraciją. USI aparatūra reikalauja, kad prievado bitai būtų sukonfigūruoti prieš naudojant uostą. Tai pamatysite USI rutinoje „Master_Initialize“.-„Atmel“teigia, kad I2C magistralės ištraukimui galima naudoti AVR prievado ištraukimus. Aš nesugalvojau, kaip tokį metodą paversti veiksmingu. Dviejų išorinių rezistorių naudojimas atrodo gana paprasta schema, todėl tam neskiriau daug laiko.

Rekomenduojamas: