Tartalomjegyzék:
- 1. lépés: Egyébként mi ez az I2C cucc?
- 2. lépés: Rendeljen néhány I2C -eszközt
- 3. lépés: I2C illesztőprogramok
- 4. lépés: Építsünk
- 5. lépés: Kódoljunk és teszteljünk
- 6. lépés: Az I2C memória használata
- 7. lépés: Internetes erőforrások
- 8. lépés: Megjegyzések a Geeks számára
Videó: I2C busz ATtiny és ATmega számára: 8 lépés
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-01-30 09:44
Imádom az Atmel AVR mikrokontrollereit! A Ghetto Fejlesztési Rendszer kiépítése óta, amelyet ebben az utasításban ismertetünk, nem volt vége a szórakozásnak az AVR ATtiny2313 -mal és különösen az ATmega168 -nal való kísérletezéssel. Még odáig is eljutottam, hogy egy Instructable -t írtam a kapcsolók bemenetként való használatáról, és kiterjesztettem a Ghetto Development System koncepciót a CPLD -re. Egy nemrégiben készült projekt során több kapcsolóra volt szükségem a vezérlőértékek beállításához. Az AVR -k nem rendelkeztek elegendő I/O tűvel, ezért valamit gondolnom kellett. Kipróbálhattam volna egy komplex beviteli rendszert billentyűzettel és kijelzővel, de az ATtiny2313 -ban elfogytak volna az erőforrások. Szerencsére az Atmel megoldást jelentett a probléma megoldására azzal, hogy egy olyan interfészt tartalmazott, amely további chipekhez (például memória vagy I/O port) kapcsolódhat egy egyszerű kétvezetékes interfésszel. Így van, ha csak két I/O érintkezőt használ egy AVR -n, számos további I/O tűhöz és más forrásokhoz is hozzáférhetünk. Ezt a kétvezetékes interfészt hivatalosan Inter-Integrated Circuit busznak vagy csak I2C busznak nevezik, és az NXP találta ki, amikor még Philips Semiconductors volt. Ha olvassa ezt az Instructable -t, akkor valószínűleg hallott már az I2C buszról, és lehet, hogy PIC -n vagy más mikrokontrolleren is használta. Bár fogalmilag nagyon egyszerű, és az AVR -ek hardveres erőforrásai támogatják, az I2C busz használatához továbbra is szükség van szoftver illesztőprogramokra. Az Atmel Alkalmazási megjegyzéseket biztosít (lásd az Erőforrásokat később, ebben az utasításban), de ezek hiányosak, és nem mutatnak példákat más AVR -eszközzel való kommunikáción kívül. Ennek az utasításnak nem célja, hogy bárkit megtanítson az I2C illesztőprogramok létrehozására. AVR -ek. Inkább az Atmel illesztőprogramok kibővített verzióit adom meg az ATtiny2313 és ATmega168 eszközökhöz, elmagyarázom az ezek használatakor érvényes követelményeket és korlátozásokat, és bemutatom az I2C eszközök működő példáit. Miután végigdolgozta ezt az utasítást, sikeresen használhatja az I2C buszt az AVR projektekben. Nyilvánvalóan figyelmen kívül hagyhatja az illesztőprogramokat akár az apró, akár a MEGA esetén, ha csak az egyik érdekli őket. Azok számára, akik többet szeretnének megtudni az I2C buszról, linkeket adok a megfelelő anyagokhoz.
1. lépés: Egyébként mi ez az I2C cucc?
Az I2C busz egy egyszerű, kétvezetékes kapcsolat, amely több eszközt összekapcsolhat, és lehetővé teszi számukra az adatok cseréjét. A legegyszerűbb formában van egy master eszköz, amely több slave eszközzel kommunikál. Minden eszköz párhuzamosan van csatlakoztatva az I2C busz két vezetékével. A két vezeték SCL és SDA néven ismert. Az SCL az óravonal, és a master eszköz vezérli. Az SDA a kétirányú adatvonal. Az adatok átviteléhez a mester küld egy slave címet egy bites olvasási/írási jelzővel kombinálva. Ha írásra van szükség, a master továbbra is adatokat küld a címzett slave -nek. Ha olvasást kér, a slave adatokkal válaszol. A tranzakciók koordinálásához az SCL és az SDA vonalakat a master és a slave manipulálja, hogy több feltételt jelezzen. Ezek közé tartozik a START, STOP, ACK (nyugtázás) és a NAK (nincs nyugtázás). Ezen feltételek részleteit a sofőrök kezelik. Az igazi stréberek között minden részletet megtudhat a használati utasítás végén található linkeken. Az elektromos követelmények meglehetősen egyszerűek. A masternek és a slave -eknek ugyanazt a szintet kell használniuk a Vcc -hez, a földeléseket össze kell kötni, és az SCL és SDA vezetékeket fel kell húzni Vcc -ig. A felhúzó ellenállások értékét pontosan meghatározza a buszon lévő teljes kapacitáson alapuló számítás, de gyakorlatilag bármilyen érték lehet 1,8K és 10K között. 5.1K -val kezdem, és alacsonyabb értékeket használok, amíg működik. Ez általában nem jelent problémát, hacsak nincs sok eszköz vagy hosszú vezeték az eszközök között. Az I2C buszon a névleges adatátviteli sebesség 100 KB/s. 400Kbit/másodperc, 1Mbits/másodperc és ennél nagyobb sebesség is lehetséges, de az illesztőprogramok nem támogatják ezt az utasítást. Minden I2C eszköz 100 kbit/s sebességgel fog működni. Az ATtiny2313 és az ATmega168 mindegyik másképpen valósítja meg az I2C buszt. Az ATtiny2313 az Universal Serial Interface (USI) hardvert használja - amely az SPI buszhoz is használható. Az ATmega168 dedikált hardverrel rendelkezik a kétvezetékes interfész (TWI) néven ismert I2C buszhoz. Az illesztőprogramok megírása után ezek a különbségek többnyire átláthatók a felhasználó számára. Egy jelentős különbség a szoftverben van: az ATmega168 I2C illesztőprogram megszakításos, míg az ATtiny2313 esetében nem. Ez azt jelenti, hogy egy ATmega168 programnak nem kell várnia az I2C adatátvitelre, hanem csak várnia kell, mielőtt újabb átvitelt kezdeményez, vagy amíg az adatok beérkeznek egy olvasási műveletből. A példáknak és a követendő megbeszéléseknek ezt világossá kell tenniük. Az IC -címek 7 bit hosszúak, így akár 127 eszköz is lehet a buszon, ha mindegyik egyedi címmel rendelkezik. Amint az ábrán látható, ez a 7 bites cím egy bit balra tolódik, és a legkevésbé jelentős bit az eszköz olvasásának vagy írásának megjelölésére szolgál a címen. Így a teljes slave cím egy 8 bites bájt. A tényleges címet részben az eszköz határozza meg belsőleg, és nem lehet megváltoztatni (4 legjelentősebb bit), részben pedig az eszközcsapokhoz csatlakoztatható bitekkel (3 legkevésbé jelentős bit), amelyek magasra vagy alacsonyra köthetők a beállításhoz egy konkrét címet. Zavarosnak hangzik, de egy példa világossá teszi ezt. A PCA8574A adatlap azt mutatja, hogy az I2C cím négy legjelentősebb bitje mindig 0111. A következő három bit az AD0, AD1 és AD2 érintkezők beállításai alapján kerül meghatározásra. Ezek a csapok a földhöz vagy a pozitív feszültségű tápegységhez (5 volt) köthetők, így 0 vagy 1. Tehát a lehetséges címek tartománya 38–3 F hexadecimális, amint azt a PCA8574 adatlap másik ábrája is mutatja. Tehát a címbit beállítások megváltoztatásával akár 8 PCA8574A is lehet egyszerre az I2C buszon. Mindegyik csak a saját slave címére reagál. Ha még több I/O portra van szükség, akkor a PCA8574 használható. Az egyetlen különbség a PCA8574 és a PCA8574A között az, hogy a PCA8574 I2C slave címtartománya 20-27 hexadecimális. Egy adott eszköz címének meghatározása zavaró lehet, mivel egyes adatlapok az olvasási/írási bitet a cím. Olvassa el figyelmesen az adatlapot, és ne feledje, hogy a slave cím 7 bit hosszú lesz. Az olvasási/írási bitet külön kell kezelni. Ismét egy példa segít. A kísérleti 24C16 EEPROM adatlapja szerint a slave cím első (legjelentősebb) négy bitje 1010. A következő három bit az A0, A1 és A2 segítségével határozható meg; de vegye figyelembe, hogy az adatlap kiterjed a 24C01 -től a 24C08 -ig, amelyek kisebb méretű EEPROM -ok. Az adatlapon látható ábra azt mutatja, hogy e címbitek beállításait figyelmen kívül hagyja a méret növekedésével, és teljesen figyelmen kívül hagyja a 24C16 esetében. Vagyis az utolsó három bit nem számít, és a 24C16 valóban az összes I2C slave címet használja, 50-57 hexadecimális. A szolga címek tartománya valójában a 24C16 különböző szakaszaihoz fog szólni. Az első 256 bájt az 50h címen, a következő 256 az 51h címen, és így tovább az utolsó 256 bájtig az 57h órában - összesen 2K bájt. Mivel az általunk is kísérletezett PCF8570 RAM címe ebben a tartományban van, a 24C16 és a PCF8570 nem használható együtt.
2. lépés: Rendeljen néhány I2C -eszközt
Most, hogy ismer egy keveset az I2C buszról, és szeretné használni, miért nem rendelné meg néhány I2C -eszköz kísérletezését, hogy útban legyenek a szoftver elkészítése közben? A megfelelő eszközök közé tartozik az I/ I O Interface Expander (kedvenc), egy statikus ram és egy EEPROM. Van még sok más, de ezek nagyszerű kezdetek. Az általunk használt AVR processzorok az ATtiny2313 és az Atmega168 (Arduino -ban használatos). Ha még nem ismeri ezeket, akkor nézze meg ezt a nagyszerű Instructable -t, hogy megismerje őket és építse fel a Ghetto fejlesztési rendszerét. Az ATmega168 sematikus ábrája a jelen Instructable programban bemutatja, hogyan kell megvalósítani a Ghetto Development System -et ehhez a processzorhoz. A párhuzamos port kábele megegyezik az ATtiny2313 kábelével. (Nem próbáltam ki a Ghetto Development System USB verzióját, így nem vagyok biztos benne, hogyan érhető el rajta az I2C busz. Ugyanez vonatkozik az Arduino -ra is.) Itt vannak a Digikey cikkszámok. 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
3. lépés: I2C illesztőprogramok
Íme az I2C busz meghajtó funkcióinak leírása. Ezeket az Atmel Apps Notes segítségével fejlesztették ki. Ezt nem tudtam volna megtenni nélkülük, mint alapot, amelyre építhetnék. A fejlesztés WinAVR és a gcc C fordító segítségével történt. Az órajel -korlátozásokat az alábbiakban ismertetjük minden processzor esetében. Mivel nem tudom tesztelni az összes lehetséges processzor íz / órajel kombinációt, csak ragaszkodom ahhoz, amit ténylegesen tudok tesztelni, és megpróbálom jelezni a korlátozásokat és korlátozásokat. Itt vannak az illesztőprogram funkciói és azok használata. Kérjük, nézze meg a példákat a további részletekért és a teljes programokban használt funkciók megtekintéséhez. ATtiny2313 esetén: Órakövetelmény: Az illesztőprogramokat 1MHz (az alapértelmezett) frekvenciára tervezték az ATtiny2313 számára. Ha más sebességgel szeretne futni, akkor az illesztőprogramokban kell beállítania az állandókat. Ha segítségre van szüksége, küldjön e -mailt. Néhány tippet az Atmel alkalmazások jegyzeteiből is kaphat az Erőforrások lépés linkjeiben. USI_TWI_Master_Initialise () Ez a funkció inicializálja az USI hardvert az I2C mód működéséhez. Hívja fel egyszer a program kezdetén. Üres értéket ad vissza, és nincsenek érvek. USI_TWI_Get_State_Info () Ez a függvény az I2C hibainformációkat adja vissza, és akkor használható, ha hiba történt az I2C tranzakció során. Mivel ez a függvény csak hibakódot ad vissza, a TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) függvényt használom a hiba LED villogására. A hibakódokat a USI_TWI_Master.h tartalmazza. Így hívhatjuk: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () Ezzel a funkcióval egyetlen bájt olvasható és írható I2C eszközökre. Több bájt írására is használják. Ennek a funkciónak 6 lépése van.1) Nyilvánítson meg egy üzenetpuffert a programjában, hogy megtartsa a slave címet és az elküldendő vagy fogadandó adatbájtot. unsigned char messageBuf (MESSAGEBUF_SIZE); 2) Helyezze a slave címet a puffer első bájtjába. Tolja el egy kicsit balra, és VAGY az Olvasás/Írás bitben. Ne feledje, hogy az Olvasás/Írás bit 1 lesz olvasáshoz és 0 íráshoz. Ez a példa olvasásra szolgál. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (IGAZ << TWI_READ_BIT); 3) Írás közben helyezze az írandó bájtot a puffer következő helyére. 4) Hívja meg a USI_TWI_Start_Read_Write függvényt az üzenet pufferrel és az üzenet méretével argumentumként. a visszaadott érték (ebben az esetben a hőmérséklet) tesztelhető, hogy nem történt -e hiba. Ha igen, akkor a fentiek szerint kezeljük. Lásd a példákat a programokban. A puffer beállítása és a rutin hívása kissé eltér. A puffer második bájta lesz a kezdő memóriacím, amelyre írni kell. Az írandó adatok a következő bájtokban lesznek. Az üzenet mérete az összes érvényes adatot tartalmazó méret lesz. Tehát ha 6 bájtot kell írni, akkor az üzenet mérete 8 lesz (szolga cím + memória cím + 6 bájt adat). valamiféle emlék. Ennek a rutinnak a használata nagyon hasonló az előzőhöz, két kivételtől eltekintve. Az Olvasás/Írás bit beállítása nem számít. Ennek a rutinnak a meghívása mindig olvasási műveletet okoz. Az üzenet mérete 2, és az olvasandó bájtok száma. Ha nem történt hiba, akkor az adatok a második helyen kezdődő pufferben lesznek. Az ATmega168 esetében: Órakövetelmény: az illesztőprogramokat 4 MHz -es órajelre tervezték az ATmega168 számára. A példakód bemutatja, hogyan kell beállítani ezt az órajelet. Ha más sebességgel szeretne futni, akkor az illesztőprogramokban kell beállítania az állandókat. E -mailben küldje el nekem, ha ezt meg kell tennie. TWI_Master_Initialise () Ez a funkció inicializálja a TWI hardvert az I2C mód működéséhez. Hívja fel egyszer a program kezdetén. Üresen tér vissza, és nincsenek érvek. Az inicializálás után feltétlenül engedélyezze a megszakításokat a swi () hívásával. TWI_Get_State_Info () Ez a függvény az I2C hibainformációit adja vissza, és akkor használható, ha hiba történt az I2C tranzakció során. Mivel ez a függvény csak hibakódot ad vissza, a TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) függvényt használom a hiba LED villogására. A hibakódokat a TWI_Master.h tartalmazza, de módosítják a hiba LED -en történő jelzéshez. A részleteket lásd a példakódban. TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) Ne feledje, hogy a hibák ellenőrzése úgy történik, hogy meggyőződik arról, hogy az I2C tranzakció befejeződött (az alábbiakban ismertetett funkció), majd tesztel egy kicsit a globális állapotszóban. két függvény ugyanúgy működik, mint a fent leírt megfelelő funkciók, de néhány kivételtől eltekintve. Nem adnak vissza hibaértékeket. Az olvasott adatok nem kerülnek át a pufferbe. Ezt a következő funkcióval kell elvégezni. A TWI_Start_Random_Read hívásakor az messageSize legyen a kért adatbájtok száma plusz egy, nem kettő. Az ATmega168 I2C illesztőprogramja megszakításos. Vagyis az I2C tranzakciók elindulnak, majd egymástól függetlenül végrehajtódnak, miközben a fő rutin továbbra is fut. Amikor a fő rutin adatokat akar az indított I2C tranzakcióból, ellenőriznie kell, hogy az adatok rendelkezésre állnak -e. Hasonló a helyzet a hibák ellenőrzésével is. A hibák ellenőrzése előtt a fő rutinnak meg kell győződnie arról, hogy az I2C tranzakció befejeződött. A következő két függvényt használják erre a célra. TWI_Transceiver_Busy () Hívja meg ezt a függvényt, és ellenőrizze, hogy az I2C tranzakció befejeződött -e a hibák ellenőrzése előtt. A példaprogramok bemutatják ennek használatát. TWI_Read_Data_From_Buffer () Hívja meg ezt a funkciót, hogy adatokat vigyen át az I2C illesztőprogram fogadási pufferéből az üzenetpufferbe. Ez a funkció az adatok átvitele előtt meggyőződik arról, hogy az I2C tranzakció befejeződött. Míg ez a függvény értéket ad vissza, megbízhatóbbnak találom a hiba bit közvetlen ellenőrzését. Így hívhatjuk. Az üzenet méretének eggyel nagyobbnak kell lennie, mint a kívánt adatbitek száma. Az adatok a messageBuf -ban lesznek a második helytől kezdődően.temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);
4. lépés: Építsünk
Kezdje az I2C Schematics.zip fájl letöltésével. Érdemes létrehozni egy I2C mappát a munkaterületen, ahol a vázlatok és a minta programfájlok tárolhatók. Csomagolja ki a sémákat ebbe a könyvtárba. Megtalálja az I2C Schematics nevű mappát. Nyissa meg az apró I2C.pdf nevű fájlt. Ez a vázlat az ATtiny2313 Ghetto Development System -et és a PCA8574A I/O Port Expander -t mutatja (a nagy szaggatott doboz körül). A portbővítő áramkör kenyérlapra épül. Nézze meg a fényképeket, hogy megnézze, hogyan néznek ki ezek az áramkörök. Tényleg nagyon egyszerűek. A vázlat ATtiny2313 része csak a Ghetto Development System, három villogó lámpával (LED1, 2 és 3, valamint R4, 5 és 6) és egy nyomógombbal (S1), valamint egy további részletek. Ez a rész a jumper (JP4, 5 és 6) hozzáadása, amelyek eltávolíthatók, lehetővé téve az I2C busz SCL és SDA vonalainak csatlakoztatását. A jumpereknek a programozás helyén kell lenniük, majd el kell távolítani őket, hogy az SCL és az SDA csatlakoztatható legyen. A fényképeken a jumperek a helyükön vannak és eltávolítva. Ezeknek a jumpereknek az elhelyezése rajtad múlik, csak fel kell tenned őket a Ghetto Development System -re, ha használni szeretnéd az I2C buszt. Az I2C buszt le kell választani, és a jumpereket a programozáshoz kell elhelyezni. Ne feledje, hogy az I2C busz esetében csak a JP4 és a JP6 funkcióval kell foglalkoznia. Tegye be a JP5 formátumot, ha úgy gondolja, hogy valaha is használni szeretné az SPI buszt. A PCA8574A I/O portbővítő kenyérsütése nagyon egyszerű. Biztosítson Vcc (+5 volt) és Gnd (föld) csatlakozásokat, és csatlakoztassa az AD0, 1 és 2 földeket (az I2C slave cím 38 hexadecimális). Ezután csatlakoztasson 4 villogó lámpát és 4 DIP kapcsolót. (Ha nincs DIP kapcsolója, akkor csak vezetékeket használhat. Csatlakoztassa a földhöz, vagy hagyja lebegni a jelzés be- vagy kikapcsolását.) Végül csatlakoztassa a felhúzó ellenállásokat (R11 és 12) az SDA és az SCL csatlakozóról az Vcc-hez. Ezek 3.3K -ként jelennek meg, de minden 1.8K és 5.1K közötti értéknek működnie kell (talán 10K -ig, de ezt még nem próbáltam). Az ATtiny2313 programozása után eltávolíthatja az áthidalókat, és csatlakoztathatja az SDA -t és az SCL -t a teszteléshez. Most az ATmega168 esetében. Az egyetlen ránc itt az, hogy lehet, hogy nem épített Ghetto fejlesztési rendszert ehhez a processzorhoz. Ha ez a helyzet, akkor az általam megadott vázlat (MEGA I2C.pdf) megmutatja, hogyan. Ez csak az ATtiny2313 verzió permutációja. Ha előre tervez, meggyőződhet arról, hogy a programozókábel mindkét rendszerhez illeszkedik. A fő különbség a C2 és C3 hozzáadása. Ezek elhelyezését lásd a képeken, nagyon közel kell lenniük a chiphez; az egyik valójában a chip alatt van. Ezek segítenek elkerülni a zajokat az analóg -digitális átalakítóból. Nem kell beraknia az áthidalókat, hacsak nem tervezi az SPI busz használatát, mivel ezekre nincs szükség a chipen található I2C buszhoz. Ne feledje, hogy a PCA8754A kenyértábla változatlan marad. Csatlakoztassa az SDA -t és az SCL -t, és már indulhat is! Könnyű, mi?
5. lépés: Kódoljunk és teszteljünk
Itt az ideje, hogy felépítse az illesztőprogramokat és a példaprogramokat. Kezdjük az ATtiny2313 -mal és a most épített PCA8574A kenyérlemezzel. Töltse le az I2C.zip fájlt az I2C munkakönyvtárába, és bontsa ki. Új mappája lesz, I2C néven. Ebben megtalálható az USI I2C (ATtiny2313 esetén) és a TWI I2C (ATmega168 esetén). A USI I2C rendszerben megtalálja az I_O Port mappát. Ez a mappa tartalmazza az első példaprogramunk kódját és az USI I2C illesztőprogramokat. WinAVR használatával fordítsa le és töltse be a kódot az ATtiny2313 -ba. Vegyen egy mély lélegzetet, és kapcsolja be az áramot. Íme, mire számíthat: Bekapcsoláskor az ATtiny2313 PD6 portjának 1 -es LED -je kétszer felvillan. Semmi más nem történik, amíg meg nem nyomja a gombot (S1). A gomb minden egyes megnyomására a kapcsolók beolvasásra kerülnek, és beállításuk megjelenik a PCA8574A -hoz csatlakoztatott LED -eken. Módosítsa a kapcsolók értékét, nyomja meg a gombot, és a LED -eknek meg kell változniuk. Folytassa ezt addig, amíg túl nem éri az izgalmat, amikor látja, hogy működik. Ha (ne adj Isten!) A dolgok nem a várt módon működnek, gondosan ellenőrizze a vezetékezést. Az I2C hibákat a LED3 (PD4) villogása jelzi. Ha a dolgok még mindig nem működnek, olvassa el a szakasz további részét a hibakeresésről. Most menjen vissza, és nézzük meg a kódot. Nyissa meg a USI_I2C_Port.c fájlt. Ez a példaprogram kódja. (A USI_TWI_Master.c és USI_TWI_Master.h tartalmazza az illesztőprogramokat - figyelmen kívül hagyhatja őket, kivéve, ha kíváncsi rá.) A példa segítségével vezérelheti saját I2C -alkalmazásait. A program elsősorban az I2C illesztőprogramok inicializálását és használatát mutatja be, beleértve a beállításokat is fel a slave címet és az üzenetpuffer többi részét, és kiveszi belőle az adatokat. Azt is látni fogja, hogyan kapcsolom ki a gombot, és hogyan állítom be a while ciklust. A program néhány részletét érdemes megemlíteni. Vegye figyelembe, hogy a kapcsolók adatai megfordulnak, mielőtt a portbővítő LED -jeire írják. Vegye figyelembe azt is, hogy a portbővítő bemeneti portjait magasnak kell írni, hogy megfelelően működjenek. Ezeket a részleteket a PCA8574A adatlap írja le. Mindig figyelmesen olvassa el az adatlapokat! Érdekesebb a feltételes hibakeresés használata. A programfájl kezdete közelében van a // #define DEBUG utasítás, és a kódba beleszórva #ifdef DEBUG utasítások. Amíg a DEBUG nincs definiálva (a két perjel megjegyzést fűz a sorhoz, és megakadályozza annak meghatározását), az #ifdef - #endif utasításokban lévő kód nem kerül lefordításra. De ha a dolgok nem a várt módon működnek, fordítsa újra és töltse be újra a kódot a #define DEBUG megjegyzés nélkül. Sokkal több villogást kap a LED -eken, amelyeket dekódolva követheti a program végrehajtását, és segíthet megtalálni a hibák pontos helyét. Valójában azt javaslom, hogy próbálja ki ezt, csak hogy lássa, mi történik. Látni fogja, hogy a LED 2 (a PD5 -n) villogni fog, amint a végrehajtás előrehalad a programon keresztül. A kapcsolókról leolvasott érték villogni kezd az 1. LED -en (PD6), mielőtt megjelenik a portbővítő LED -eken. A LED -ek használatával nyomon kell követnie a program futását. A következőkben az ATmega168 -nal dolgozunk; hagyja ki ezt a részt, ha csak az ATtiny2313 érdekli. Maradj velem? Jó. Lépjen a TWI_I2C mappába, módosítsa a munkakönyvtárat IO_Port -ra, majd fordítsa le és töltse be a TWI_I2C_Port.c fájlt az ATmega168 -ba. Válassza le az SDA és SCL vonalakat az ATtiny2313 -ról, és csatlakoztassa őket az ATmega168 -hoz. Csatlakoztassa az áramot és a földet, és kapcsolja be. A műveletnek azonosnak kell lennie! Játssz, amíg az izgalom alábbhagy, majd nézzük a kódot. Nyissa meg a TWI_I2C_Port.c. A kód majdnem azonos, kivéve a hibakezelést és a megszakított vezérlésű illesztőprogramok befogadását. Íme a különbségek: Vegye figyelembe, hogy az órát 4 MHz -re kell állítani, hogy az I2C busz megfelelően működjön. A sei (); utasítás bekapcsolja a megszakításokat az I2C illesztőprogramok inicializálása után. A hibák ellenőrzéséhez egy adott állapotbitet tesztelnek. Olvasás közben meg kell hívni a TWI_Read_Data_From_Buffer függvényt, hogy át lehessen vinni az olvasott adatokat az üzenetpufferbe. Írás közben, míg a (TWI_Transceiver_Busy ()) parancsot kell használni, hogy megbizonyosodjon arról, hogy az átvitel befejeződött, mielőtt hibákat keres. Ezt az utolsó két funkciót fentebb az illesztőprogramok leírása ismerteti. Ettől eltekintve a kód nagyjából ugyanaz, mint az ATtiny2313 esetében. A DEBUG ugyanúgy működik, ha ezzel kísérletezni szeretne.
6. lépés: Az I2C memória használata
Most, hogy megtanultuk használni az I2C buszt egy I/O portbővítő olvasásához és írásához, térjünk át az I2C memóriák használatára, mind a RAM, mind az EEPROM. A fő különbség az, hogy több bájt olvasható vagy írható memóriából egyetlen I2C paranccsal. Ahhoz, hogy felkészülhessünk ezekre a kísérletekre, némileg módosítanunk kell a hardvert, és ki kell építenünk néhány új áramkört a kenyértáblán. Őrizze meg a portbővítő áramkört, mivel néhány memóriaérték megjelenítésére használjuk. Távolítsa el a DIP -kapcsolókat a PCA8574A -ból, és tegyen villogó fényeket ezekre a csapokra. Ha nincs elegendő villogó fénye, helyezze át a P4 -en keresztül a P7 -en lévőket a P0 -ra a P3 -ra. (A megjelenítendő értékek elég kicsik.) Most nézze meg a sematikus I2C Ram.pdf fájlt, és csatlakoztassa a PCF8570 -et a kenyértáblához. Nézd meg a képet is. Feltétlenül kösse a 7 -es tüskét az Vcc -hez. Futtassa az SDA és SCL vezetékeket a PCA8574A -ból. Nincs szükség további felhúzó ellenállásokra. Ha az EEPROM is érdekli, építse fel az áramkört az I2C EEPROM.pdf használatával is a 24C16 számára, de figyelmeztetni kell, hogy a példa az ATmega168-at használja. Ez az áramkör valóban egyszerű. Amint fentebb tárgyaltuk, a címbiteket figyelmen kívül kell hagyni. Csak csatlakoztassa az áramot és a földet. Ne csatlakoztassa még az SDA -t és az SCL -t, mivel még nem fejeztük be a RAM -mal való kísérletezést. Memóriakísérleteinket a PCA8574A Port Expanderhez és a PCF8570 Ram -hoz csatlakoztatott ATtiny2313 -mal kezdjük. A program néhány számot ír a Ramba, majd visszaolvassa és megjeleníti a Port Expanderben. Változtassa meg a munkakönyvtárat RAM -ra USI I2C alatt. Használja a make fájlt a USI_I2C_RAM.c összeállításához és letöltéséhez. Ne feledje, hogy az I2C illesztőprogram fájljai megegyeznek a korábban használt fájlokkal. Csatlakoztassa az áramellátást, és egyetlen villogást kell látnia az 1 -es LED -en (PD6). Az adatok a memória első 4 bájtjába kerülnek. Nyomja meg a gombot, és két bájt visszaolvasásra kerül és megjelenik. Látnia kell egy LED -fényt a portbővítőn (P0), két másodperces szünetet, majd két LED -et (P0 és P1). Újabb két másodperc szünet, és a LED -eknek ki kell kapcsolniuk. Nyomja meg újra a gombot a sorozat újraindításához. A hibakeresés hasonló a fent leírt módszerhez. Nézzük meg a kódot. Nyissa meg a USI_I2C_RAM.c fájlt. Nagyon hasonlónak kell lennie az előző kódhoz. A fő különbségek az olvasási és írási memória részletei. Nézze meg, hogyan töltődik be az üzenetpuffer az írást ténylegesen végrehajtó hívás előtt. Az első bájt a slave cím, ahol az olvasási/írási bit megfelelően van beállítva. De a következő bájt az a memóriacím, amelyen az adatok írása megkezdődik. Ezután jönnek a tényleges adatbájtok, amelyek sorrendben betöltődnek a memóriába, az általunk megadott címen kezdve. Az üzenet méretét 6 -nak adjuk meg. Tehát a 00 címen kezdjük el az írást, és a 01, 03, 02 és 06 értékeket írjuk be a 00 és 03 közötti memóriahelyekre. Az adatok visszaolvasásához a memóriából a USI_TWI_Start_Random_Read függvényt kell használnunk. Az üzenetpuffer megkapja a szolga címet az első bájtban, és a kezdő címet a második bájtban. Ezután hívja meg a függvényt úgy, hogy az üzenetméret az olvasandó bájtok számára és 2 -re van állítva. Ne feledje, hogy az olvasási/írási bit nem számít, mivel az olvasás ettől függetlenül megtörténik. A visszaadott adatok az üzenetpuffer második helyén kezdődnek. Miután beolvasta az adatokat, fordítva jeleníti meg őket a portbővítőn, és egyenként egy bájtot írnak hozzá, az értékek közötti szünetel. Végül a Port Expander LED -ek kialszanak. A kikötőbővítőnek írt írások megegyeznek az előző példákban leírtakkal. A szórakozás kedvéért a fentiek szerint feloldhatja a #define DEBUG utasítást, és rengeteg villogó LED -et láthat. Az izgalomtól kipirulva egy újabb sikeres kísérlet után térjünk át az ATmega168 -ra és az EEPROM -ra. Módosítsa a munkakönyvtárat EEPROM -ra TWI I2C alatt. Használja a make fájlt a TWI_I2C_EEPROM.c fordításához és letöltéséhez. Ne feledje, hogy az I2C illesztőprogram fájljai megegyeznek a korábban a PCA8574A esetében használt fájlokkal. A program teszteléséhez válassza le az ATtiny2313 -at, és csatlakoztassa az ATmega168 -at. Hagyja az I2C buszt a Ramhoz csatlakoztatva, és kapcsolja be. Az eredmények eltérőek, mivel most több adatot írunk és olvasunk. A PD7 LED -jének villognia kell az inicializáláskor. Nyomja meg a gombot, és az adatok visszaolvasásra kerülnek a memóriából, és megjelennek. A PCA8574 LED -jeinek a következő sorrendben kell villogniuk: P1, P0 & P2, (minden ki), P0 & P1, P1 & P2. Végül a Port LED -eknek kialudniuk kell. Ismételten nyomja meg a gombot. Ó, de várjon, mondja. Ez a program nem az EEPROM? Mivel ugyanazon az I2C címen érünk el egy memóriaeszközt, ugyanaz a program működik mind a Ram, mind az EEPROM esetében. Kapcsolja ki és helyezze át az SDA -t és az SCL -t a Ramból az EEPROM -ba, és futtassa újra a programot. Pontosan ugyanúgy kell működnie. Vegye figyelembe, hogy az EEPROM és a Ram nem csatlakoztatható egyszerre az I2C buszhoz, mivel ugyanazt a címet használják. (Az okosabbak közületek fontolóra vehetik a Ram programozható címbitjeinek megváltoztatását, de ez még mindig nem fog működni. A 24C16 a Ram számára programozható teljes címblokkot használja.) OK, nézzük ezt az utolsó programot. Nyissa meg a TWI_I2C_EEPROM.c fájlt. Az első dolog, amit észre kell venni, hogy jeleztem, hogyan kell kezelni a teljes 24C16 EEPROM -ot. 256 bájtos darabokban érhető el 8 különböző I2C slave címen. Nézze meg, hogy a MEMORY_ADDR kezdőcímként van definiálva 50 hexadecimális értéknél; ezért működött a Ram. Ha hozzá szeretne férni a 24C16 többi blokkjához, akkor használja a többi címet, ahogy jeleztem. Nézze meg, hogyan állítottam be a memóriába írást. Először az olvasási/írási bitkészlettel rendelkező slave -címet helyezzük a pufferbe, majd a 00 -as kezdőcímet, majd 16 bájt adatot. A TWI_Start_Read_Write függvényt meghívjuk az adatok írására (mint korábban), 18 -ra állítva az üzenetméretet. Amikor megnyomja a gombot, a TWI_Start_Random_Read és a TWI_Read_Data_From_Buffer segítségével olvassuk vissza az adatokat. Minden harmadik bájt megjelenik a portbővítő LED -eken. Végül a LED -ek kialszanak, és várják a következő gombnyomást. Lehet, hogy vajon miért döntöttem úgy, hogy 16 bájtot írok. Ha figyelmesen elolvassa az adatlapot, látni fogja, hogy a 24C16 írási ciklust végez, amikor 16 bájtot kap, még akkor is, ha több bájt kerül elküldésre. Szóval szép számnak tűnt használni. Ha ezt növeli, módosítania kell a MESSAGEBUF_SIZE méretét. A TWI_BUFFER_SIZE értéket is módosítania kell a TWI_Master.h fájlban. Ennek oka az, hogy az illesztőprogram lemásolja az adatokat az üzenetpufferből a megszakítási szolgáltatási rutin számára. Gratulálunk! Most már készen áll az I2C busz használatára saját projektjeiben!
7. lépés: Internetes erőforrások
Itt találhatók a kísérletekhez használt alkatrészek adatlapjaira mutató linkek. Ezeket mindenképpen meg kell szereznie, ha nem kap mást. (Szeretnek szögletes zárójeleket használni URL -címeikben, ezért nem tudom helyesen felvenni őket ide. Sajnáljuk.] Az I2C terület eléréséhez válassza a Termékek listából az Interfész lehetőséget. Elérheti I2C webhelyüket, és hozzáférés az összes általuk kínált adatlaphoz és alkalmazásjegyzethez. Az I2C busz leírása és különösen a technikai részletek itt találhatók. Szerezze be az ATtiny2313 és ATmega168 adatlapokat (adatkönyveket?) az Atmeltől. Az Atmel alkalmazás megjegyzései itt találhatók. Nézze meg az AVR310 és AVR315 típusokat. Fogja meg a kódot is. Nézzen meg itt további I2C -dolgokat.
8. lépés: Megjegyzések a Geeks számára
Az igazi stréber számára, aki tudni akarja a részleteket, itt van néhány dolog, amelyet szem előtt kell tartania, ha megnézi az Atmel Apps Notes és az illesztőprogram kódját:- Az I2C eszköz megszólításának és parancsolásának módja nem része a specifikációnak! A slave -címen és az olvasási/írási biten kívül a parancsok, módok stb. Nincsenek megadva, és egy adott eszközre jellemzőek. Ennek egyértelművé tétele érdekében vegye figyelembe, hogy az Atmel példában használt séma csak erre a példára vonatkozik, és nagyjából nem szabványos.- Az USI implementáció néhány fontos szempontból különbözik a TWI megvalósítástól. + USI esetén az órát szoftver biztosítja; a TWI -vel egy Bit Rate Generator biztosítja. + Az USI módszer nem használ megszakításokat; a TWI igen. Ennek van némi értelme, mivel a Mega család (TWI -t használva) sok más dolgot is végezhet, és nem szabad, hogy az I2C átigazolások megzavarják. Az USI megszakítás -vezérelt változata minden bizonnyal lehetséges, csak ebben az utasításban nincs megvalósítva. + Az USI hardver nincs optimalizálva az I2C -re, és csak 8 bites átvitelt képes kezelni. Ez azt jelenti, hogy a kilencedik bit elküldéséhez két átvitelre van szükség (NACK vagy ACK). A TWI hardver ezt automatikusan kezeli. Ez egy kicsit bonyolultabbá teszi az USI illesztőprogram megvalósítását. + A TWI hibafelismerését hardver kezeli. Az USI szoftverkezelést igényel, ami némileg bonyolítja a dolgokat. + A TWI hardver közvetlenül vezérli a port konfigurációját. Az USI hardver megköveteli, hogy a portbiteket konfigurálni kell a port használata előtt. Ezt látni fogja az USI Master_Initialize rutinjában.-Az Atmel azt állítja, hogy az I2C busz felhúzásához AVR port felhúzást is lehet használni. Nem találtam rá módot arra, hogy ez a megközelítés működjön. Két külső ellenállás használata elég egyszerű sémának tűnik, ezért nem töltöttem sok időt ezzel.
Ajánlott:
Fordulatszámmérő/szkenner Arduino, OBD2 és CAN busz használatával: 8 lépés
Fordulatszámmérő/szkenner Arduino, OBD2 és CAN busz használatával: Bármely Toyota Prius (vagy más hibrid/speciális jármű) tulajdonos tudja, hogy a műszerfaláról hiányzik néhány tárcsa! A priusomnak nincs motor fordulatszáma vagy hőmérője. Ha előadóművész vagy, akkor érdemes tudni olyan dolgokat, mint az időzítés előrehaladása és
Kormánykerék gombok autós sztereó adapterhez (CAN busz -> 1. kulcs): 6 lépés
Kormánykerék kulcsok autós sztereó adapterhez (CAN busz -> Key1): Néhány nappal egy használt autó vásárlása után rájöttem, hogy nem tudok zenét lejátszani a telefonomról az autórádión keresztül. Még frusztrálóbb volt, hogy az autóban volt bluetooth, de csak hanghívásokat engedélyezett, zenét nem. Windows Phone USB portja is volt, de
Akár 3 RS485 busz egy Arduino -n: 5 lépés
Akár 3 RS485 busz egy Arduino -n: Ebben az utasításban megmutatom, hogyan lehet 3 független RS485 buszt csatlakoztatni egy Arduino -hoz. Ez akkor lehet hasznos, ha átjárót szeretne létrehozni ezek között a buszok között, vagy ha ezekben a buszokban eszközöket szeretne vezérelni (a busz csatlakoztatása nélkül
LCD busz menetrend kijelző: 7 lépés
LCD busz menetrend kijelző: Standard 18
Környezeti kijelző a busz érkezéséhez: 6 lépés (képekkel)
Környezeti kijelző buszérkezéshez: Bár a képernyők népszerűek lehetnek az információk megtekintésére, határozottan nem ezek az egyetlen módja az információfogyasztásnak. Számos lehetőség kínálkozik a környezetünkből származó információk megjelenítésére, és ezzel a projekttel igyekszünk feltörni