Obsah:

Sběrnice I2C pro ATtiny a ATmega: 8 kroků
Sběrnice I2C pro ATtiny a ATmega: 8 kroků

Video: Sběrnice I2C pro ATtiny a ATmega: 8 kroků

Video: Sběrnice I2C pro ATtiny a ATmega: 8 kroků
Video: LDmicro 14: I2C LCD & DS3231 Real-Time Clock (Microcontroller PLC Ladder Programming with LDmicro) 2024, Červenec
Anonim
Sběrnice I2C pro ATtiny a ATmega
Sběrnice I2C pro ATtiny a ATmega

Miluji mikrokontroléry Atmel AVR! Od vybudování vývojového systému ghetta popsaného v tomto Instructable jsem neměl konce s experimentováním zejména s AVR ATtiny2313 a ATmega168. Dokonce jsem zašel tak daleko, že jsem napsal Instructable o používání přepínačů jako vstupů, a rozšířil koncept Ghetto Development System na CPLD. Během nedávného projektu jsem potřeboval několik přepínačů pro nastavení hodnot řízení. AVR neměly dostatek I/O pinů, takže jsem musel něco vymyslet. Mohl jsem zkusit složitý vstupní systém s klávesnicí a displejem, ale ATtiny2313 by došly zdroje. Naštěstí Atmel tento problém vyřešil zahrnutím rozhraní, které lze propojit s dalšími čipy (například pamětí nebo I/O porty) pomocí jednoduchého dvouvodičového rozhraní. To je pravda, použitím pouze dvou I/O pinů na AVR můžeme získat přístup k mnoha dalším I/O pinům a dalším zdrojům. Toto dvouvodičové rozhraní je formálně známé jako sběrnice integrovaných obvodů nebo jen sběrnice I2C a bylo vynalezeno společností NXP, když to byl ještě Philips Semiconductors. Pokud čtete tento Instructable, pravděpodobně jste slyšeli o sběrnici I2C a možná jste ji dokonce použili na PIC nebo jiném mikrokontroléru. Softwarové ovladače jsou sice koncepčně velmi jednoduché a podporované hardwarovými prostředky na AVR, ale stále jsou nutné pro použití sběrnice I2C. Atmel poskytuje poznámky k aplikaci (viz Zdroje dále v tomto Instructable), ale ty jsou neúplné a neukazují žádné příklady nad rámec komunikace s jiným zařízením AVR. Účelem tohoto Instructable není nikoho naučit, jak vytvořit ovladače I2C pro AVR. Spíše poskytnu rozšířené verze ovladačů Atmel pro zařízení ATtiny2313 a ATmega168, vysvětlím požadavky a omezení, která při jejich používání platí, a ukážu vám funkční příklady zařízení I2C. Poté, co si projdete tento Instructable, budete moci úspěšně používat sběrnici I2C ve svých projektech AVR. Očividně můžete ovladače ignorovat pro malé nebo MEGA, pokud vás zajímá pouze jeden z nich. Pro ty, kteří se chtějí dozvědět více o sběrnici I2C, poskytnu odkazy na příslušný materiál.

Krok 1: Co je to všechno za věci I2C?

Co je to vůbec za věci I2C?
Co je to vůbec za věci I2C?
Co je to vůbec za věci I2C?
Co je to vůbec za věci I2C?
Co je to vůbec za věci I2C?
Co je to vůbec za věci I2C?
Co je to vůbec za věci I2C?
Co je to vůbec za věci I2C?

Sběrnice I2C je jednoduché dvouvodičové připojení, které může propojit více zařízení dohromady a umožnit jim výměnu dat. Ve své nejjednodušší formě existuje jedno hlavní zařízení, které komunikuje s více podřízenými zařízeními. Všechna zařízení jsou připojena paralelně ke dvěma vodičům sběrnice I2C. Dva vodiče jsou známé jako SCL a SDA. SCL je hodinový řádek a je řízen hlavním zařízením. SDA je obousměrná datová linka. K přenosu dat master vysílá slave adresu kombinovanou s jednobitovým příznakem čtení/zápisu. Pokud je požadován zápis, master bude nadále odesílat data adresovanému slave. Pokud je požadováno čtení, podřízený odpoví daty. Pro koordinaci transakcí jsou linky SCL a SDA manipulovány masterem a slave, aby signalizovaly několik podmínek. Patří sem START, STOP, ACK (potvrzení) a NAK (bez potvrzení). Podrobnosti o těchto podmínkách řeší řidiči. Skuteční geekové mezi vámi se mohou naučit všechny podrobnosti v odkazech uvedených na konci tohoto Instructable. Elektrické požadavky jsou velmi jednoduché. Master a slave musí používat stejnou úroveň pro Vcc, musí být připojeny uzemnění a linky SCL a SDA musí být vytaženy až do Vcc. Hodnota stahovacích odporů je přesně určena výpočtem založeným na celkové kapacitě na sběrnici, ale prakticky může být téměř jakákoli hodnota mezi 1,8 K a 10 K. Začínám s 5.1K a používám nižší hodnoty, dokud to nefunguje. To obvykle není problém, pokud nemáte mnoho zařízení nebo dlouhé délky vodičů mezi zařízeními. Nominální rychlost přenosu dat na sběrnici I2C je 100 kBit/s. Možné jsou také rychlosti 400 kB/s, 1 Mbit/s a další, ale ovladače v tomto Instructable nejsou podporovány. Všechna zařízení I2C budou pracovat rychlostí 100 kBit/s. ATtiny2313 a ATmega168 implementují sběrnici I2C odlišně. ATtiny2313 používá hardware Universal Serial Interface (USI) - který lze také použít pro sběrnici SPI. ATmega168 má vyhrazený hardware pro sběrnici I2C známý jako Two Wire Interface (TWI). Jakmile jsou ovladače zapsány, jsou tyto rozdíly pro uživatele většinou transparentní. Jeden významný rozdíl je v softwaru: Ovladač ATmega168 I2C je řízen přerušením, zatímco u ATtiny2313 není. To znamená, že program ATmega168 nemusí čekat, až proběhne přenos dat I2C, ale musí pouze počkat, než zahájí další přenos nebo dokud data nepřijdou z operace čtení. Následující příklady a diskuse by to měly objasnit. Adresy I2C jsou dlouhé 7 bitů, takže pokud má každé jedinečnou adresu, může být na sběrnici až 127 zařízení. Jak je znázorněno na obrázku, tato 7bitová adresa je posunuta o jeden bit doleva a nejméně významný bit je použit k označení čtení nebo zápisu zařízení na adrese. Kompletní adresa slave je tedy 8bitový bajt. Skutečná adresa je částečně určena interně zařízení a nelze ji změnit (4 nejvýznamnější bity) a částečně je určena bity, které mohou být připojeny k pinům zařízení (3 nejméně významné bity), které lze nastavit na vysokou nebo nízkou konkrétní adresu. Zní to matoucí, ale příklad to objasní. Datový list PCA8574A ukazuje, že čtyři nejvýznamnější bity adresy I2C budou vždy 0111. Další tři bity jsou určeny nastavením na pinech AD0, AD1 a AD2. Tyto kolíky mohou být spojeny se zemí nebo s kladným napětím (5 voltů), což představuje 0 nebo 1. Rozsah možných adres je tedy 38 až 3F hexadecimální, jak ukazuje druhý obrázek z datového listu PCA8574. Změnou nastavení bitů adresy tedy může být na sběrnici I2C současně až 8 PCA8574A. Každý bude reagovat pouze na svou konkrétní adresu otroka. Pokud je zapotřebí ještě více I/O portů, lze použít PCA8574. Jediným rozdílem mezi PCA8574 a PCA8574A je, že rozsah adres slave I2C PCA8574 je 20 až 27 hexadecimálních. Určení adresy daného zařízení může být matoucí, protože některé datové listy považují bit čtení/zápisu za součást adresa. Pečlivě si přečtěte datový list a mějte na paměti, že adresa slave bude 7 bitů dlouhá. Bit pro čtení/zápis by měl být zpracován samostatně. Opět pomůže příklad. Datový list pro 24C16 EEPROM, se kterým budeme experimentovat, říká, že první (nejvýznamnější) čtyři bity adresy slave jsou 1010. Další tři bity lze určit pomocí A0, A1 a A2; Všimněte si však, že datový list zahrnuje také 24C01 až 24C08, což jsou menší velikosti EEPROM. Obrázek z datového listu ukazuje, že nastavení těchto bitů adresy je při zvyšování velikosti ignorováno a pro 24C16 jsou zcela ignorována. To znamená, že na posledních třech bitech nezáleží a 24C16 skutečně používá všechny adresy slave I2C 50 až 57 hexadecimálních. Rozsah adres slave bude ve skutečnosti adresovat různé sekce v rámci 24C16. Prvních 256 bajtů je na adrese 50 h, dalších 256 v 51 h atd. Až do posledních 256 v 57 h - celkem 2 kB bajtů. Protože adresa RAM PCF8570, se kterou také experimentujeme, je v tomto rozsahu, 24C16 a PCF8570 nelze použít společně.

Krok 2: Objednejte si některá zařízení I2C

Nyní, když víte něco o sběrnici I2C a chcete ji používat, proč si neobjednat některá zařízení I2C, aby s nimi nyní experimentovali, aby mohli být na cestě k vám, když chystáte software? Vhodná zařízení obsahují I/ O Interface Expander (můj oblíbený), statický RAM a EEPROM. Je toho mnohem víc, ale jsou to skvělé začátky. Použité procesory AVR jsou ATtiny2313 a Atmega168 (používané v Arduinu). Pokud jste v nich noví, podívejte se na tento skvělý Instructable, abyste se o nich dozvěděli a vybudovali si svůj vývojový systém v ghettu. Schéma ATmega168 v tomto Instructable ukazuje, jak implementovat vývojový systém Ghetto pro tento procesor. Kabel paralelního portu je stejný jako kabel pro ATtiny2313. (Nezkoušel jsem USB verzi vývojového systému Ghetto, takže si nejsem jistý, jak se k němu přistupuje ke sběrnici I2C. Totéž pro Arduino.) Zde jsou čísla dílů Digikey. Port Expander: IC I2C I/O EXPANDER 568-4236-5-NDRam: IC SRAM 256X8 W/I2C 568-1071-5-NDEEPROM: IC EEPROM SÉRIOVÁ 16K CAT24C16LI-G-ND

Krok 3: Ovladače I2C

Zde jsou popisy funkcí ovladače pro sběrnici I2C. Ty byly vyvinuty pomocí poznámek Atmel Apps Notes pro začátečníky. Bez nich jako základny, na které by se dalo stavět, bych to nedokázal. Vývoj byl proveden pomocí WinAVR a kompilátoru gcc C. Omezení hodinové rychlosti jsou popsána níže pro každý procesor. Vzhledem k tomu, že nejsem schopen otestovat všechny možné kombinace chutí a taktů procesoru, budu se držet toho, co skutečně mohu testovat, a pokusím se naznačit omezení a omezení. Zde jsou funkce ovladače a jejich použití. Další podrobnosti a funkce používané v kompletních programech naleznete v příkladech. Pro ATtiny2313: Požadavek na hodiny: Ovladače jsou navrženy pro taktovací frekvenci 1 MHz (výchozí frekvence) pro ATtiny2313. Pokud chcete běžet za jiné sazby, budete muset upravit konstanty v ovladačích. Pošlete mi e -mail, pokud s tím potřebujete pomoc. Několik tipů můžete získat také z poznámek k aplikacím Atmel v odkazech v kroku Zdroje. USI_TWI_Master_Initialise () Tato funkce inicializuje hardware USI pro provoz v režimu I2C. Zavolejte to jednou na začátku programu. Vrací neplatné a neexistují žádné argumenty. USI_TWI_Get_State_Info () Tato funkce vrací informace o chybě I2C a používá se, pokud během transakce I2C došlo k chybě. Protože tato funkce vrací pouze chybový kód, používám funkci TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) k blikání chybové LED. Chybové kódy jsou definovány v USI_TWI_Master.h. Nazvěte to takto: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () Tato funkce se používá ke čtení a zápisu jednotlivých bytů do zařízení I2C. Používá se také k zápisu více bajtů. Existuje 6 kroků k použití této funkce. 1) Deklarujte vyrovnávací paměť zpráv ve vašem programu, aby obsahovala adresu slave a datový bajt, který má být odeslán nebo přijat. unsigned char messageBuf (MESSAGEBUF_SIZE); 2) Vložte adresu Slave jako první bajt do vyrovnávací paměti. Posuňte jej o jeden bit vlevo a NEBO v bitu pro čtení/zápis. Všimněte si, že bit pro čtení/zápis bude 1 pro čtení a 0 pro zápis. Tento příklad je pro čtení. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (PRAVDA << TWI_READ_BIT); 3) Při zápisu vložte bajt, který má být zapsán, do dalšího umístění ve vyrovnávací paměti. 4) Zavolejte funkci USI_TWI_Start_Read_Write s vyrovnávací pamětí zprávy a velikostí zprávy jako argumenty. Temp = USI_TWI_Start_Read_Write (messageBuf, 2); 5) vrácenou hodnotu (v tomto případě dočasnou) lze otestovat, zda nedošlo k chybě. Pokud ano, postupuje se podle výše uvedeného postupu. Viz příklady v programech. 6) Pokud bylo požadováno čtení, bude čtení bajtů na druhém místě ve vyrovnávací paměti. Pokud má být zapsáno více bajtů (například do paměťového zařízení), lze použít stejnou rutinu. Nastavení vyrovnávací paměti a volání rutiny se mírně liší. Druhý bajt ve vyrovnávací paměti bude počáteční adresou paměti, na kterou se má zapisovat. Zapisovaná data budou v následujících bajtech. Velikost zprávy bude velikost včetně všech platných dat. Pokud má být zapsáno 6 bajtů, pak velikost zprávy bude 8 (adresa slave + adresa paměti + 6 bajtů dat). USI_TWI_Start_Random_Read () Tato funkce se používá ke čtení více bajtů ze zařízení I2C, obvykle má smysl pouze pro nějaká vzpomínka. Použití této rutiny je až na dvě výjimky velmi podobné předchozí rutině. Na nastavení bitu pro čtení/zápis nezáleží. Volání této rutiny vždy způsobí operaci Čtení. Velikost zprávy by měla být 2 plus počet bytů, které mají být přečteny. Pokud nedojde k žádným chybám, data budou ve vyrovnávací paměti začínající na druhém místě. Pro ATmega168: Požadavek na hodiny: ovladače jsou navrženy pro taktovací frekvenci 4MHz pro ATmega168. Příklad kódu ukazuje, jak nastavit tuto taktovací frekvenci. Pokud chcete běžet za jiné sazby, budete muset upravit konstanty v ovladačích. Pokud to potřebujete, pošlete mi e -mail. TWI_Master_Initialise () Tato funkce inicializuje hardware TWI pro provoz v režimu I2C. Zavolejte to jednou na začátku programu. Vrací neplatné a neexistují žádné argumenty. Po inicializaci nezapomeňte povolit přerušení voláním swi (). TWI_Get_State_Info () Tato funkce vrací informace o chybě I2C a používá se, pokud během transakce I2C došlo k chybě. Protože tato funkce vrací pouze chybový kód, používám funkci TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) k blikání chybové LED. Chybové kódy jsou definovány v TWI_Master.h, ale jsou upraveny pro signalizaci na chybové LED. Podrobnosti najdete v ukázkovém kódu. Nazvěte to takto: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) Všimněte si, že kontrola chyb se provádí tak, že se ujistíte, že je transakce I2C dokončena (níže popsaná funkce), a poté trochu otestujete v globálním stavovém slově. TWI_Start_Read_Write () TWI_Start_Random_ dvě funkce fungují stejně jako odpovídající funkce popsané výše, ale s několika výjimkami. Nevracejí žádné chybové hodnoty. Čtení dat není přeneseno do vyrovnávací paměti. To se provede pomocí dále popsané funkce. Při volání TWI_Start_Random_Read by messageSize měl být počet požadovaných datových bajtů plus jeden, ne dva. I2C ovladač pro ATmega168 je řízen přerušením. To znamená, že transakce I2C jsou spuštěny a poté prováděny nezávisle, zatímco hlavní rutina pokračuje v běhu. Když hlavní rutina chce data z transakce I2C, kterou spustila, musí zkontrolovat, zda jsou data k dispozici. U kontroly chyb je situace stejná. Před kontrolou chyb si hlavní rutina musí být jistá, že je transakce I2C dokončena. K těmto účelům se používají následující dvě funkce. TWI_Transceiver_Busy () Voláním této funkce zjistíte, zda je transakce I2C dokončena, než začnete kontrolovat chyby. Ukázkové programy ukazují, jak to použít. TWI_Read_Data_From_Buffer () Voláním této funkce přenesete data z vyrovnávací paměti pro příjem ovladače I2C do vyrovnávací paměti pro zprávy. Tato funkce zajistí, aby transakce I2C byla dokončena před přenosem dat. I když je touto funkcí vrácena hodnota, shledávám spolehlivější kontrolu chybového bitu přímo. Jak to nazvat. Velikost zprávy by měla být o jednu větší než požadovaný počet datových bitů. Data budou v messageBuf začínat na druhém místě. Temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

Krok 4: Pojďme stavět

Pojďme stavět!
Pojďme stavět!
Pojďme stavět!
Pojďme stavět!
Pojďme stavět!
Pojďme stavět!
Pojďme stavět!
Pojďme stavět!

Začněte stažením souboru I2C Schematics.zip. Možná budete chtít ve své pracovní oblasti vytvořit složku I2C pro uložení schémat a ukázkových programových souborů. Rozbalte schémata do tohoto adresáře. Najdete složku s názvem I2C Schematics. Otevřete soubor s názvem tiny I2C.pdf. Toto schéma ukazuje vývojový systém ATtiny2313 Ghetto a expandér I/O portů PCA8574A (má kolem sebe velký čárkovaný rámeček). Okruh Port Expander je postaven na prkénku. Podívejte se na fotografie, jak tyto obvody vypadají. Jsou opravdu velmi jednoduché. Část schématu ATtiny2313 je pouze vývojový systém Ghetto se třemi blikajícími světly (LED1, 2 a 3, plus R4, 5 a 6) a připojeným tlačítkem (S1) plus jedním další detail. Tím detailem je přidání propojek (JP4, 5 a 6), které lze odstranit, aby bylo možné připojit linky SCL a SDA sběrnice I2C. Pro programování musí být propojky propojeny, poté odstraněny, aby bylo možné připojit SCL a SDA. Fotografie ukazují propojky na místě a odstraněné. Umístění těchto propojek je na vás, stačí je nasadit do svého vývojového systému Ghetto, pokud chcete použít sběrnici I2C. Pro programování musí být odpojena sběrnice I2C a propojky. Všimněte si, že se opravdu musíte starat pouze o JP4 a JP6 pro sběrnici I2C. Pokud si myslíte, že budete někdy chtít použít sběrnici SPI, vložte JP5. Breadboarding expandéru I/O portů PCA8574A je velmi jednoduchý. Zajistěte připojení Vcc (+5 voltů) a Gnd (uzemnění) a připojte AD0, 1 a 2 k zemi (adresa I2C slave je 38 hex). Poté připojte 4 blinkenlights a 4 DIP přepínače. (Pokud nemáte přepínače DIP, můžete použít pouze vodiče. Připevněte k uzemnění nebo ponechte plovoucí signál pro zapnutí nebo vypnutí signálu.) Nakonec připojte stahovací odpory (R11 a 12) z SDA a SCL k Vcc. Ty jsou zobrazeny jako 3,3 K, ale jakákoli hodnota od 1,8 K do 5,1 K by měla fungovat (možná až 10 K, ale to jsem nezkoušel). Jakmile naprogramujete ATtiny2313, můžete odstranit propojky a připojit SDA a SCL pro testování. Nyní pro ATmega168. Jedinou překážkou je, že jste pro tento procesor možná nevybudovali vývojový systém Ghetto. Pokud tomu tak je, pak vámi poskytnuté schéma (MEGA I2C.pdf) vám ukáže, jak na to. Toto je jen permutace verze ATtiny2313. Pokud plánujete dopředu, můžete se ujistit, že váš programovací kabel bude vyhovovat oběma systémům. Hlavním rozdílem je přidání C2 a C3. Umístění najdete na obrázcích, měly by být velmi blízko čipu; jeden z nich je ve skutečnosti pod čipem. Pomáhají zejména zabránit vniknutí šumu z analogového na digitální převodník. Pokud neplánujete použít sběrnici SPI, nemusíte vkládat propojky, protože pro sběrnici I2C na tomto čipu nejsou potřeba. Všimněte si toho, že lišta PCA8754A se nezmění. Stačí připojit SDA a SCL a můžete vyrazit! Snadné, co?

Krok 5: Pojďme kódovat a testovat

Pojďme kódovat a testovat!
Pojďme kódovat a testovat!
Pojďme kódovat a testovat!
Pojďme kódovat a testovat!
Pojďme kódovat a testovat!
Pojďme kódovat a testovat!

Je čas sestavit ovladače a ukázkové programy. Začneme s ATtiny2313 a prkénkem PCA8574A, které jsme právě postavili. Stáhněte si soubor I2C.zip do pracovního adresáře I2C a rozbalte jej. Budete mít novou složku s názvem I2C. V něm najdete USI I2C (pro ATtiny2313) a TWI I2C (pro ATmega168). V USI I2C najdete složku I_O Port. Tato složka obsahuje kód našeho prvního ukázkového programu a ovladače USI I2C. Pomocí WinAVR kompilujte a načtěte kód do ATtiny2313. Zhluboka se nadechněte a zapněte napájení. Zde je co očekávat: Při zapnutí LED 1 na portu PD6 ATtiny2313 dvakrát zabliká. Nic se nestane, dokud nestisknete tlačítko (S1). Při každém stisknutí tlačítka se spínače načtou a jejich nastavení se zobrazí na LED diodách připojených k PCA8574A. Změňte hodnotu spínačů, stiskněte tlačítko a LED diody by se měly změnit. Dělejte to tak dlouho, dokud vás nepřekvapí, že to funguje. Pokud (nedej bože!) Věci nefungují podle očekávání, pečlivě zkontrolujte zapojení. Chyby I2C budou signalizovány blikáním na LED3 (PD4) a pravděpodobně znamenají, že musíte zkontrolovat, zda jsou SDA a SCL připojeny ke správným pinům a jsou správně vytaženy. Pokud věci stále nefungují, přečtěte si zbytek této části, abyste se dozvěděli o ladění. Nyní se vraťme a podívejme se na kód. Otevřete soubor USI_I2C_Port.c. Toto je kód pro ukázkový program. (USI_TWI_Master.c a USI_TWI_Master.h obsahují ovladače - můžete je ignorovat, pokud vás to nezajímá.) Pomocí tohoto příkladu můžete vést vlastní aplikace I2C. Program vám většinou ukáže, jak inicializovat a používat ovladače I2C, včetně nastavení adresu slave a zbytek vyrovnávací paměti zpráv a získání dat z ní. Uvidíte také, jak tlačítko rozpojím a nastavím smyčku while. Za zmínku stojí několik podrobností o programu. Všimněte si toho, že data z přepínačů jsou invertována, než jsou zapsána na LED diody na expandéru portů. Všimněte si také, že vstupní porty na expandéru portů musí být zapsány jako vysoké, aby správně fungovaly. Tyto podrobnosti jsou popsány v datovém listu PCA8574A. Vždy si pečlivě přečtěte datové listy! Zajímavější je použití podmíněného ladění. Blízko začátku souboru programu je příkaz // #define DEBUG a v kódu jsou poslány příkazy #ifdef DEBUG. Dokud není DEBUG definován (dvě lomítka způsobí, že řádek bude komentářem a nebude definován), kód v příkazech #ifdef až #endif nebude kompilován. Pokud ale věci nefungují tak, jak očekáváte, překompilovejte a znovu načtěte kód pomocí příkazu #define DEBUG bez komentáře. Získáte mnohem více bliknutí na LED diodách, které můžete dekódovat, abyste sledovali provádění programu a pomohli vám najít přesně to, kde se stala chyba. Ve skutečnosti vám to doporučuji vyzkoušet, abyste zjistili, co se stane. Uvidíte, že LED 2 (na PD5) bude blikat v průběhu provádění programu. Hodnota načtená ze spínačů bude blikat na LED 1 (PD6), než se zobrazí na LED diodách expandéru portů. Měli byste být schopni sledovat běh programu pomocí těchto LED diod. Budeme pracovat s ATmega168 dále; tuto sekci přeskočte, pokud vás zajímá pouze ATtiny2313. Stále se mnou? Dobrý. Přesuňte se do složky TWI_I2C, změňte svůj pracovní adresář na IO_Port a zkompilujte a načtěte TWI_I2C_Port.c do ATmega168. Odpojte SDA a SCL linky od ATtiny2313 a připojte je k ATmega168. Zapojte napájení a uzemnění a zapněte. Operace by měla být stejná! Hrajte, dokud napětí nezmizí, a pak se podívejme na kód. Otevřete TWI_I2C_Port.c. Kód je téměř identický kromě zpracování chyb a přizpůsobení ovladačů řízených přerušením. Zde jsou rozdíly: Pamatujte, že hodiny musí být nastaveny na 4 MHz, aby sběrnice I2C fungovala správně. Sei (); příkaz zapne přerušení po inicializaci ovladačů I2C. Chcete -li zkontrolovat chyby, testuje se konkrétní stavový bit. Během čtení musí být volána funkce TWI_Read_Data_From_Buffer pro přenos načtených dat do vyrovnávací paměti zpráv. Během zápisu, zatímco (TWI_Transceiver_Busy ()) musí být použit, aby se ujistil, že přenos je dokončen před kontrolou chyb. Tyto poslední dvě funkce jsou popsány výše v popisu ovladačů. Kromě toho je kód téměř stejný jako pro ATtiny2313. DEBUG funguje stejně, pokud s tím chcete experimentovat.

Krok 6: Použití paměti I2C

Použití paměti I2C
Použití paměti I2C
Použití paměti I2C
Použití paměti I2C
Použití paměti I2C
Použití paměti I2C
Použití paměti I2C
Použití paměti I2C

Nyní, když jsme se naučili používat sběrnici I2C ke čtení a zápisu expandéru I/O portů, přejděme k používání pamětí I2C, RAM i EEPROM. Hlavní rozdíl je v tom, že více bytů lze číst nebo zapisovat z pamětí jediným příkazem I2C. Abychom se na tyto experimenty připravili, musíme mírně upravit hardware a na prkénku postavit pár nových obvodů. Ponechejte obvod Port Expander, protože jej použijeme k zobrazení některých hodnot paměti. Odstraňte DIP přepínače z PCA8574A a na tyto piny nasaďte blinkenlights. Pokud nemáte dostatek blikajících světel, přesuňte je na P4 až P7 na P0 až P3. (Hodnoty k zobrazení jsou dostatečně malé.) Nyní se podívejte na schematický I2C Ram.pdf a připojte PCF8570 na prkénko. Podívejte se také na obrázek. Ujistěte se, že jste připojili pin 7 k Vcc. Spusťte vodiče pro SDA a SCL z PCA8574A. Nevyžadují se žádné další výsuvné odpory. Pokud vás také zajímá EEPROM, vytvořte tento obvod také pomocí I2C EEPROM.pdf pro 24C16, ale pozor, příklad používá ATmega168. Tento obvod je opravdu jednoduchý. Jak bylo uvedeno výše, adresní bity by měly být ignorovány. Stačí připojit sílu a zem. Prozatím nepřipojujte SDA a SCL, protože experimentování s RAM jsme nedokončili. Začneme naše paměťové experimenty s ATtiny2313 připojeným k expandéru portů PCA8574A a RAM PCF8570. Program zapíše některá čísla do RAM, poté je načte zpět a zobrazí je na expandéru portů. Změňte svůj pracovní adresář na RAM pod USI I2C. Pomocí souboru make zkompilovat a stáhnout USI_I2C_RAM.c. Soubory ovladače I2C jsou totožné se soubory, které jsme použili dříve. Připojte napájení a na LED 1 (PD6) byste měli vidět jedno blikání. Data budou zapsána do prvních 4 bajtů paměti. Stiskněte tlačítko a dva bajty se načtou zpět a zobrazí se. Na expandéru portů (P0) byste měli vidět jednu LED diodu, dvousekundovou pauzu a poté dvě LED diody (P0 a P1). Další dvěsekundová pauza a kontrolky LED by měly zhasnout. Opakovaným stisknutím tlačítka sekvence začne znovu. Ladění je podobné výše popsané metodě. Podívejme se na kód. Otevřete USI_I2C_RAM.c. Mělo by to vypadat docela podobně jako předchozí kód. Hlavní rozdíly jsou v detailech paměti pro čtení a zápis. Podívejte se na způsob načítání vyrovnávací paměti zpráv před voláním, které skutečně provádí zápis. První bajt je adresa slave s příslušně nastaveným bitem pro čtení/zápis. Ale další bajt je adresa paměti, na kterou se má začít zapisovat data. Poté přicházejí skutečné datové bajty, které se postupně načtou do paměti počínaje na zadanou adresu. Velikost zprávy zadáme jako 6. Začneme tedy psát na adresu 00 a hodnoty 01, 03, 02 a 06 zapíšeme do paměťových míst 00 až 03. K načtení dat zpět z paměti musíme použít funkci USI_TWI_Start_Random_Read. Vyrovnávací paměť zpráv získá adresu slave v prvním bajtu a počáteční adresu ve druhém bajtu. Potom zavolejte funkci s velikostí zprávy nastavenou na počet bajtů ke čtení plus 2. Všimněte si, že na bitu čtení/zápisu nezáleží, protože čtení bude provedeno bez ohledu na to. Vrácená data začnou na druhém místě ve vyrovnávací paměti zpráv. Jakmile jsou data načtena, převedena pro zobrazení na expandéru portů a zapsána do nich po bajtech s pauzou mezi hodnotami. Nakonec LED diody Port Expander zhasnou. Zápisy do Port Expander jsou totožné s tím, co bylo provedeno v předchozích příkladech. Pro zábavu můžete odkomentovat příkaz #define DEBUG, jak je uvedeno výše, a uvidíte spoustu blikajících LED diod. Po dalším úspěšném experimentu jsme vzrušeni vzrušením a přejdeme k ATmega168 a EEPROM. Změňte svůj pracovní adresář na EEPROM pod TWI I2C. Pomocí souboru make zkompilovat a stáhnout TWI_I2C_EEPROM.c. Soubory ovladače I2C jsou totožné se soubory, které jsme dříve používali pro PCA8574A. Chcete -li program otestovat, odpojte ATtiny2313 a připojte ATmega168. Nechte sběrnici I2C připojenou k RAM a zapněte ji. Výsledky jsou různé, protože nyní píšeme a čteme další data. LED 1 na PD7 by měla při inicializaci blikat. Stiskněte tlačítko a data se načtou zpět z paměti a zobrazí se. LED diody na PCA8574 by měly blikat v následujícím pořadí: P1, P0 & P2, (všechny vypnuty), P0 & P1, P1 & P2. Nakonec by měly všechny LED diody portu zhasnout. Opakujte to znovu, ale počkejte, říkáte. Není tento program pro EEPROM? Protože přistupujeme k paměťovému zařízení na stejné adrese I2C, stejný program funguje pro RAM i EEPROM. Vypněte a přesuňte SDA a SCL z RAM do EEPROM a spusťte program znovu. Mělo by to fungovat úplně stejně. Všimněte si, že EEPROM a RAM nelze připojit ke sběrnici I2C současně, protože sdílejí stejnou adresu. (Ti chytří mezi vámi mohou uvažovat o změně programovatelných bitů adres na RAM, ale to stále nebude fungovat. 24C16 používá celý blok adres, které lze pro Ram naprogramovat.) Dobře, podívejme se na tento poslední program. Otevřete TWI_I2C_EEPROM.c. První věc, které si všimnete, je, že jsem naznačil, jak řešit úplnou EEPROM 24C16. Přístup k němu je možný v 256 bajtových blocích na 8 různých I2C slave adresách. Podívejte se, jak je MEMORY_ADDR definována jako počáteční adresa na 50 hexadecimálních; proto Beran pracoval. Pokud chcete získat přístup k dalším blokům 24C16, použijte jiné adresy, jak jsem uvedl. Podívejte se, jak jsem nastavil zápis do paměti. Nejprve se do vyrovnávací paměti vloží adresa slave se sadou bitů pro čtení/zápis, poté počáteční adresa 00, potom 16 bytů dat. Funkce TWI_Start_Read_Write je volána pro zápis dat (jako dříve) s velikostí zprávy nastavenou na 18. Když je tlačítko stisknuto, použijeme ke čtení dat TWI_Start_Random_Read a TWI_Read_Data_From_Buffer. Každý třetí bajt je zobrazen na LED diodách expandéru portů. Nakonec diody LED zhasnou, aby čekaly na další stisknutí tlačítka. Možná se divíte, proč jsem se rozhodl napsat 16 bajtů. Pokud si pozorně přečtete datový list, uvidíte, že 24C16 provede cyklus zápisu, kdykoli přijme 16 bajtů, i když se odesílá více bajtů. Takže to vypadalo jako pěkné číslo k použití. Pokud se rozhodnete toto zvýšit, budete muset změnit velikost MESSAGEBUF_SIZE. Budete také muset změnit hodnotu TWI_BUFFER_SIZE v TWI_Master.h. Důvodem je, že ovladač zkopíruje data z vyrovnávací paměti zpráv pro použití rutinou služby přerušení. Gratulujeme! Nyní jste připraveni používat sběrnici I2C ve svých vlastních projektech!

Krok 7: Webové zdroje

Zde jsou odkazy na datové listy částí použitých pro experimenty. Rozhodně byste je měli dostat, pokud nedostanete nic jiného. Port ExpanderRamEEPROBE Jako tvůrce I2C má NXP (Philips) spoustu skvělých věcí. (Rádi ve svých adresách URL používají hranaté závorky, takže je sem nemohu správně zahrnout. Omlouváme se.] Chcete -li se dostat do oblasti I2C, vyberte ze seznamu Produkty rozhraní. Budete se moci dostat na jejich web I2C a přístup ke všem datovým listům a poznámkám k aplikacím, které nabízejí. Zde je zejména popis sběrnice I2C a technické detaily. Získejte datové listy ATtiny2313 a ATmega168 (datové knihy?) od společnosti Atmel. Poznámky k aplikaci Atmel jsou zde. Podívejte se na AVR310 a AVR315. Popadněte také kód. Podívejte se zde na spoustu dalších věcí z I2C.

Krok 8: Poznámky pro geeky

Pro opravdového geeka, který chce znát detaily, je zde několik věcí, které je třeba mít na paměti, když se podíváte na poznámky a kód ovladače Atmel Apps:- Metoda adresování a ovládání zařízení I2C není součástí specifikace! Jiné než adresa slave a bit pro čtení/zápis, příkazy, režimy atd. Nejsou specifikovány a jsou specifické pro dané zařízení. Aby to bylo velmi jasné, všimněte si, že schéma použité v příkladu Atmel se vztahuje pouze na tento příklad a je do značné míry nestandardní.- Implementace USI se liší od implementace TWI v několika důležitých ohledech. + U USI je taktování zajištěno softwarem; s TWI je poskytován generátorem přenosové rychlosti. + Metoda USI nepoužívá přerušení; TWI ano. To dává určitý smysl, protože rodina Mega (pomocí TWI) by mohla dělat spoustu dalších věcí a neměla by být zahlcena převody I2C. Verze řízená přerušením pro USI je určitě možná, jen není implementována v tomto Instructable. + Hardware USI není optimalizován pro I2C a zvládne pouze 8bitové přenosy. To znamená, že k odeslání devátého bitu jsou nutné dva přenosy (buď NACK nebo ACK). Hardware TWI to řeší automaticky. Díky tomu je implementace ovladače USI trochu komplikovanější. + Detekce chyb pro TWI je řešena hardwarově. USI vyžaduje zpracování v softwaru, který věci poněkud komplikuje. + Hardware TWI řídí konfiguraci portu přímo. Hardware USI vyžaduje, aby byly portové bity nakonfigurovány, než bude možné port použít. Uvidíte to v rutině Master_Initialize pro USI.-Atmel tvrdí, že pro pull-upy sběrnice I2C je možné použít pull-upy portu AVR. Nepřišel jsem na způsob, jak tento přístup fungovat. Použití dvou externích rezistorů se zdá jako docela jednoduché schéma, takže jsem nad tím netrávil mnoho času.

Doporučuje: