Obsah:

Zbernica I2C pre ATtiny a ATmega: 8 krokov
Zbernica I2C pre ATtiny a ATmega: 8 krokov

Video: Zbernica I2C pre ATtiny a ATmega: 8 krokov

Video: Zbernica I2C pre ATtiny a ATmega: 8 krokov
Video: AVR Ассемблер. Урок 10. SPI. AVR Assembler. Lesson 10. SPI. 2024, Júl
Anonim
Zbernica I2C pre ATtiny a ATmega
Zbernica I2C pre ATtiny a ATmega

Milujem mikrokontroléry Atmel AVR! Od vybudovania systému rozvoja geta, ktorý je popísaný v tomto návode, ma experimentovanie s AVR ATtiny2313 a ATmega168 obzvlášť nebavilo. Dokonca som zašiel tak ďaleko, že som napísal návod na používanie prepínačov ako vstupov a rozšíril som koncepciu vývojového systému Ghetto na CPLD. Počas nedávneho projektu som potreboval niekoľko prepínačov na nastavenie riadiacich hodnôt. AVR nemali dostatok I/O pinov, takže som musel niečo vymyslieť. Mohol som skúsiť komplexný vstupný systém s klávesnicou a displejom, ale ATtiny2313 by došli zdroje. Našťastie Atmel tento problém vyriešil začlenením rozhrania, ktoré je možné prepojiť s ďalšími čipmi (napríklad s pamäťou alebo I/O portami), pomocou jednoduchého dvojvodičového rozhrania. To je pravda, použitím iba dvoch I/O pinov na AVR môžeme získať prístup k mnohým ďalším I/O pinom a ďalším zdrojom. Toto dvojvodičové rozhranie je formálne známe ako zbernica integrovaných obvodov alebo iba zbernica I2C a bolo vynájdené spoločnosťou NXP, keď to ešte boli spoločnosti Philips Semiconductors. Ak čítate tento návod, pravdepodobne ste už počuli o zbernici I2C a možno ste ju dokonca použili na PIC alebo inom mikrokontroléri. Aj keď sú softvérové ovládače koncepčne veľmi jednoduché a podporované hardvérovými prostriedkami na AVR, sú stále nevyhnutné na používanie zbernice I2C. Atmel poskytuje poznámky k aplikácii (pozrite si zdroje ďalej v tomto návode), ktoré sú však neúplné a neukazujú žiadne príklady nad rámec komunikácie s iným zariadením AVR. Cieľom tohto návodu nie je naučiť kohokoľvek vytvárať ovládače I2C pre AVR. Poskytnem skôr rozšírené verzie ovládačov Atmel pre zariadenia ATtiny2313 a ATmega168, vysvetlím požiadavky a obmedzenia, ktoré pri ich použití platia, a ukážem vám pracovné príklady zariadení I2C. Keď si prečítate tento návod, budete môcť úspešne používať zbernicu I2C vo svojich projektoch AVR. Očividne môžete ovládače pre malé alebo MEGA ignorovať, ak vás zaujíma iba jeden z nich. Pre tých, ktorí sa chcú dozvedieť viac o zbernici I2C, poskytnem odkazy na príslušný materiál.

Krok 1: Čo je to všetko, čo je to I2C?

Čo je to všetko za veci z I2C?
Čo je to všetko za veci z I2C?
Čo je to všetko za veci z I2C?
Čo je to všetko za veci z I2C?
Čo je to všetko za veci z I2C?
Čo je to všetko za veci z I2C?
Čo je to všetko za veci z I2C?
Čo je to všetko za veci z I2C?

Zbernica I2C je jednoduché dvojvodičové pripojenie, ktoré umožňuje prepojenie viacerých zariadení a výmenu údajov. Vo svojej najjednoduchšej forme existuje jedno hlavné zariadenie, ktoré komunikuje s viacerými podradenými zariadeniami. Všetky zariadenia sú paralelne zapojené do dvoch vodičov zbernice I2C. Dva vodiče sú známe ako SCL a SDA. SCL je hodinový riadok a je riadený hlavným zariadením. SDA je obojsmerná dátová linka. Na prenos údajov master vysiela adresu slave kombinovanú s jednobitovým príznakom čítania/zápisu. Pokiaľ je požadovaný zápis, master bude pokračovať v odosielaní dát adresovanému slave. Ak je požadované čítanie, otrok odpovie údajmi. Na koordináciu transakcií sú linky SCL a SDA manipulované nadriadeným a podriadeným zariadením, aby signalizovali niekoľko podmienok. Patria sem START, STOP, ACK (potvrdenie) a NAK (bez potvrdenia). Podrobnosti o týchto podmienkach riešia vodiči. Skutoční geekovia medzi vami sa môžu dozvedieť všetky podrobnosti v odkazoch uvedených na konci tohto návodu. Elektrické požiadavky sú veľmi jednoduché. Master a slave musia používať rovnakú úroveň pre Vcc, uzemnenie musí byť prepojené a linky SCL a SDA musia byť vytiahnuté až do Vcc. Hodnota pull-up rezistorov je presne určená výpočtom na základe celkovej kapacity na zbernici, ale prakticky môže byť skoro akákoľvek hodnota medzi 1,8 K a 10 K. Začínam s 5,1 K a používam nižšie hodnoty, kým to nefunguje. To zvyčajne nie je problém, pokiaľ nemáte medzi zariadeniami veľa zariadení alebo dlhé vedenia. Nominálna rýchlosť prenosu dát na zbernici I2C je 100 kB/s. Sú možné aj rýchlosti 400 kB/s, 1 Mbit/s a ďalšie, ale nie sú podporované ovládačmi v tomto návode. Všetky zariadenia I2C budú pracovať rýchlosťou 100 kB/s. ATtiny2313 a ATmega168 implementujú zbernicu I2C odlišne. ATtiny2313 používa hardvér Universal Serial Interface (USI) - ktorý je možné použiť aj pre zbernicu SPI. ATmega168 má vyhradený hardvér pre zbernicu I2C známy ako dvojvodičové rozhranie (TWI). Keď sú ovládače napísané, tieto rozdiely sú pre používateľa väčšinou transparentné. Jeden významný rozdiel je v softvéri: Ovládač ATmega168 I2C je poháňaný prerušovaním, zatiaľ čo pre ATtiny2313 nie je. To znamená, že program ATmega168 nemusí čakať na uskutočnenie prenosov dát I2C, ale musí počkať iba pred zahájením ďalšieho prenosu alebo kým údaje neprichádzajú z operácie čítania. Nasledujúce príklady a diskusia by to mali objasniť. Adresy I2C sú dlhé 7 bitov, takže ak má každé jedinečnú adresu, na zbernici môže byť až 127 zariadení. Ako je znázornené na obrázku, táto 7 -bitová adresa je posunutá o jeden bit doľava a najmenej významný bit sa používa na označenie čítania alebo zápisu zariadenia na adrese. Úplná adresa slave je teda 8 bitový bajt. Skutočná adresa je čiastočne určená interne zariadeniu a nedá sa zmeniť (4 najvýznamnejšie bity) a čiastočne je určená bitmi, ktoré môžu byť pripojené k pinom zariadenia (3 najmenej významné bity), ktoré je možné nastaviť vysoko alebo nízko na nastavenie. konkrétnu adresu. Znie to mätúco, ale príklad to objasní. Dátový list PCA8574A ukazuje, že štyri najvýznamnejšie bity adresy I2C budú vždy 0111. Nasledujúce tri bity sú určené nastaveniami na kolíkoch AD0, AD1 a AD2. Tieto kolíky môžu byť viazané na uzemnenie alebo na kladný zdroj napätia (5 voltov), ktoré predstavujú 0 alebo 1. Rozsah možných adries je teda 38 až 3F hexadecimálnych, ako je znázornené na druhom obrázku z dátového listu PCA8574. Zmenou nastavení bitov adresy teda môže byť na zbernici I2C súčasne až 8 PCA8574A. Každý bude reagovať iba na svoju konkrétnu adresu otroka. Pokiaľ je potrebných ešte viac I/O portov, je možné použiť PCA8574. Jediným rozdielom medzi počítačmi PCA8574 a PCA8574A je ten, že rozsah adries slave I2C zariadenia PCA8574 je 20 až 27 hexadecimálnych. Určenie adresy daného zariadenia môže byť mätúce, pretože niektoré dátové listy považujú čítací/zapisovací bit za súčasť adresa. Pozorne si prečítajte technický list a majte na pamäti, že adresa slave bude mať 7 bitov. S bitom na čítanie/zápis by sa malo zaobchádzať oddelene. Opäť pomôže príklad. Dátový list pre 24C16 EEPROM, s ktorou budeme experimentovať, hovorí, že prvé (najvýznamnejšie) štyri bity adresy slave sú 1010. Nasledujúce tri bity môžu byť určené pomocou A0, A1 a A2; všimnite si však, že dátový list zahŕňa aj 24C01 až 24C08, ktoré sú menšej veľkosti EEPROM. Obrázok z dátového listu ukazuje, že nastavenia týchto bitov adresy sú pri zvyšovaní veľkosti ignorované a pre 24C16 sú úplne ignorované. To znamená, že na posledných troch bitoch nezáleží a 24C16 skutočne používa všetky adresy slave I2C 50 až 57 hexadecimálnych. Rozsah adries slave bude skutočne adresovať rôzne sekcie v rámci 24C16. Prvých 256 bajtov je na adrese 50 h, ďalších 256 o 51 h a tak ďalej až po posledných 256 o 57 h - celkom 2 kB bajtov. Pretože adresa RAM PCF8570, s ktorou tiež experimentujeme, je v tomto rozsahu, 24C16 a PCF8570 nemožno používať spoločne.

Krok 2: Objednajte si niektoré zariadenia I2C

Teraz, keď už viete niečo o zbernici I2C a chcete ju používať, prečo si neobjednať niektoré zariadenia I2C, aby s nimi teraz experimentovali, aby mohli byť na ceste k vám, keď pripravujete softvér? Príslušné zariadenia obsahujú I/ O Interface Expander (môj obľúbený), statický RAM a EEPROM. Je toho veľa, ale sú to skvelé začiatky. Použité procesory AVR sú ATtiny2313 a Atmega168 (používané v Arduine). Ak ste v nich noví, pozrite sa na tento skvelý návod, ako sa o nich dozvedieť a vybudovať si svoj vývojový systém v gete. Schéma ATmega168 v tomto návode ukazuje, ako implementovať vývojový systém ghetta pre tento procesor. Kábel paralelného portu je rovnaký ako kábel pre ATtiny2313. (Neskúsil som USB verziu vývojového systému Ghetto, takže si nie som istý, ako sa k nemu pristupuje k zbernici I2C. To isté pre Arduino.) Tu sú čísla dielov Digikey. Expander portu: I/O IC I2C EXPANDER 568-4236-5-NDRam: IC SRAM 256X8 W/I2C 568-1071-5-NDEEPROM: IC EEPROM SÉRIOVÝ 16K CAT24C16LI-G-ND

Krok 3: Ovládače I2C

Tu sú popisy funkcií ovládača pre zbernicu I2C. Tieto boli vyvinuté pomocou poznámok Atmel Apps Notes pre začiatočníkov. Bez nich by som to nedokázal ako základ, na ktorom by sa dalo stavať. Vývoj bol vykonaný pomocou WinAVR a kompilátora gcc C. Obmedzenia frekvencie hodín sú popísané nižšie pre každý procesor. Pretože nemôžem otestovať všetky možné kombinácie chuti a frekvencie procesora, budem sa držať toho, čo skutočne môžem testovať, a pokúsim sa naznačiť obmedzenia a obmedzenia. Tu sú funkcie ovládača a spôsob ich použitia. Podrobnejšie informácie a funkcie, ktoré sa používajú v kompletných programoch, nájdete v príkladoch. Pre ATtiny2313: požiadavka na hodiny: Ovládače sú navrhnuté pre taktovaciu frekvenciu 1 MHz (predvolená frekvencia) pre ATtiny2313. Ak chcete pracovať s inými sadzbami, budete musieť upraviť konštanty v ovládačoch. Pošlite mi e -mail, ak s tým potrebujete pomoc. Niektoré rady môžete získať aj z poznámok k aplikáciám Atmel v odkazoch v kroku zdrojov. USI_TWI_Master_Initialise () Táto funkcia inicializuje hardvér USI pre prevádzku v režime I2C. Zavolajte to raz na začiatku programu. Vráti neplatnosť a neexistujú žiadne argumenty. USI_TWI_Get_State_Info () Táto funkcia vracia informácie o chybe I2C a používa sa, ak sa počas transakcie I2C vyskytla chyba. Pretože táto funkcia vracia iba chybový kód, používam funkciu TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) na blikanie chybovej LED. Chybové kódy sú definované v USI_TWI_Master.h. Nazvite to takto: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () Táto funkcia sa používa na čítanie a zápis jednotlivých bytov do zariadení I2C. Tiež sa používa na zápis viacerých bytov. Existuje 6 krokov na používanie tejto funkcie. 1) Deklarujte vo svojom programe vyrovnávaciu pamäť správ, ktorá bude uchovávať adresu slave a dátový bajt, ktoré sa majú odoslať alebo prijať. unsigned char messageBuf (MESSAGEBUF_SIZE); 2) Vložte adresu slave ako prvý bajt do vyrovnávacej pamäte. Posuňte ho o jeden bit doľava a ALEBO do bitu na čítanie/zápis. Všimnite si toho, že bit na čítanie/zápis bude 1 pre čítanie a 0 pre zápis. Tento príklad je na čítanie. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (PRAVDA << TWI_READ_BIT); 3) Pri zápise vložte bajt, ktorý sa má zapísať, na ďalšie miesto vo vyrovnávacej pamäti. 4) Zavolajte funkciu USI_TWI_Start_Read_Write s medzipamäťou správy a veľkosťou správy ako argumenty. Temp = USI_TWI_Start_Read_Write (messageBuf, 2); 5) vrátená hodnota (v tomto prípade teplota) môže byť testovaná, aby sa zistilo, či nedošlo k chybe. Ak je to tak, postupuje sa tak, ako je uvedené vyššie. Pozrite si príklady v programoch. 6) Ak bolo požadované čítanie, čítanie bajtov bude na druhom mieste vo vyrovnávacej pamäti. Ak sa má zapísať viac bajtov (napríklad do pamäťového zariadenia), je možné použiť rovnakú rutinu. Nastavenie vyrovnávacej pamäte a volanie rutiny sa mierne líšia. Druhý bajt vo vyrovnávacej pamäti bude počiatočnou adresou pamäte, na ktorú sa má zapisovať. Údaje, ktoré sa majú zapísať, budú v nasledujúcich bajtoch. Veľkosť správy bude rovnaká ako veľkosť vrátane všetkých platných údajov. Ak sa má zapísať 6 bajtov, potom bude veľkosť správy 8 (adresa slave + adresa pamäte + 6 bajtov údajov). USI_TWI_Start_Random_Read () Táto funkcia sa používa na čítanie viacerých bajtov zo zariadenia I2C, zvyčajne má význam iba pre nejaká spomienka. Použitie tejto rutiny je veľmi podobné predchádzajúcej rutine, až na dve výnimky. Na nastavení bitu na čítanie/zápis nezáleží. Volanie tejto rutiny vždy spôsobí operáciu čítania. Veľkosť správy by mala byť 2 plus počet bajtov, ktoré sa majú prečítať. Ak sa nevyskytnú žiadne chyby, údaje budú vo vyrovnávacej pamäti začínajúc na druhom mieste. Pre ATmega168: Požiadavka na hodiny: ovládače sú navrhnuté pre hodinovú frekvenciu 4 MHz pre ATmega168. Príkladový kód ukazuje, ako nastaviť túto frekvenciu hodín. Ak chcete jazdiť za iné ceny, budete musieť upraviť konštanty v ovládačoch. Ak to potrebujete, pošlite mi e -mail. TWI_Master_Initialise () Táto funkcia inicializuje hardvér TWI pre prevádzku v režime I2C. Zavolajte to raz na začiatku programu. Vráti sa neplatný a neexistujú žiadne argumenty. Po inicializácii určite povoľte prerušenia volaním swi (). TWI_Get_State_Info () Táto funkcia vracia informácie o chybe I2C a používa sa, ak sa počas transakcie I2C vyskytla chyba. Pretože táto funkcia vracia iba chybový kód, na blikanie chybovej LED používam funkciu TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg). Chybové kódy sú definované v TWI_Master.h, ale sú upravené tak, aby signalizovali chybovou diódou LED. Podrobnosti nájdete v ukážkovom kóde. Nazvite to takto: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) Všimnite si toho, že kontrola chýb sa vykonáva tak, že sa uistíte, že transakcia I2C je dokončená (funkcia popísaná nižšie) a potom trochu otestujete v globálnom stavovom slove. TWI_Start_Read_Write () TWI_Start_Random_Readom dve funkcie fungujú rovnako ako zodpovedajúce funkcie popísané vyššie, ale s niekoľkými výnimkami. Nevracajú žiadne chybové hodnoty. Načítanie údajov sa neprenáša do vyrovnávacej pamäte. To sa vykoná pomocou funkcie popísanej ďalej. Pri volaní TWI_Start_Random_Read by messageSize mal byť požadovaný počet dátových bajtov plus jeden, nie dva. Ovládač I2C pre ATmega168 je poháňaný prerušením. To znamená, že transakcie I2C sa začnú a potom sa vykonávajú nezávisle, kým pokračuje hlavná rutina. Keď hlavná rutina chce údaje z transakcie I2C, ktorú začala, musí skontrolovať, či sú údaje k dispozícii. Pri kontrole chýb je rovnaká situácia. Pred kontrolou chýb si musí hlavná rutina overiť, či je transakcia I2C dokončená. Na tieto účely slúžia nasledujúce dve funkcie. TWI_Transceiver_Busy () Zavolajte na túto funkciu a zistite, či je transakcia I2C dokončená, a potom skontrolujte chyby. Príklady programov ukazujú, ako to použiť. TWI_Read_Data_From_Buffer () Zavolajte túto funkciu na prenos údajov z vyrovnávacej pamäte pre príjem vodiča I2C do vyrovnávacej pamäte správ. Táto funkcia zabezpečí, aby bola transakcia I2C dokončená pred prenosom údajov. Aj keď je touto funkciou vrátená hodnota, považujem spoľahlivejšie skontrolovať chybový bit priamo. Takto sa to dá nazvať. Veľkosť správy by mala byť o jednu väčšia ako požadovaný počet dátových bitov. Dáta budú v messageBuf začínajúc na druhom mieste.temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

Krok 4: Poďme stavať

Poďme stavať!
Poďme stavať!
Poďme stavať!
Poďme stavať!
Poďme stavať!
Poďme stavať!
Poďme stavať!
Poďme stavať!

Začnite stiahnutím súboru I2C Schematics.zip. Možno budete chcieť vo svojej pracovnej oblasti vytvoriť priečinok I2C na uloženie schém a ukážkových programových súborov. Rozbaľte schémy do tohto adresára. Nájdete priečinok s názvom I2C Schematics. Otvorte súbor s názvom tiny I2C.pdf. Táto schéma ukazuje vývojový systém ghetta ATtiny2313 a expandér I/O portov PCA8574A (má veľký prerušovaný rámček). Okruh Port Expander je postavený na doske. Pozrite sa na fotografie, aby ste videli, ako tieto obvody vyzerajú. Sú skutočne veľmi jednoduché. Časť schémy ATtiny2313 je iba vývojový systém Ghetto s tromi blinkenlinkami (LED1, 2 a 3, plus R4, 5 a 6) a k nim pripojeným tlačidlom (S1) plus jedným dodatočný detail. Tento detail je pridaním prepojok (JP4, 5 a 6), ktoré je možné odstrániť, aby bolo možné pripojiť linky SCL a SDA zbernice I2C. Na programovanie musia byť prepojky zapojené, potom odstránené, aby bolo možné pripojiť SCL a SDA. Fotografie zobrazujú prepojky na mieste a odstránené. Umiestnenie týchto prepojok je na vás, stačí ich vložiť do vášho vývojového systému Ghetto, ak chcete použiť zbernicu I2C. Na programovanie musí byť zbernica I2C odpojená a prepojky umiestnené. Všimnite si toho, že sa musíte starať iba o JP4 a JP6 pre zbernicu I2C. Vložte JP5, ak si myslíte, že budete niekedy chcieť použiť zbernicu SPI. Breadboarding expandéra I/O portov PCA8574A je veľmi jednoduchý. Zabezpečte pripojenia Vcc (+5 voltov) a Gnd (uzemnenie) a prepojte jednotky AD0, 1 a 2 so zemou (adresa slave I2C bude 38 hex). Potom pripojte 4 blikajúce svetlá a 4 prepínače DIP. (Ak nemáte prepínače DIP, môžete použiť iba vodiče. Pripojte alebo uzemnite, aby signál zapol alebo vypol.) Nakoniec pripojte výsuvné odpory (R11 a 12) z SDA a SCL k Vcc. Tieto sú zobrazené ako 3,3 K, ale akákoľvek hodnota od 1,8 K do 5,1 K by mala fungovať (možno až do 10 K, ale to som neskúsil). Akonáhle ste naprogramovali ATtiny2313, môžete odstrániť prepojky a pripojiť SDA a SCL na testovanie. Teraz pre ATmega168. Jedinou prekážkou je, že ste možno pre tento procesor nevybudovali vývojový systém Ghetto. Ak je to tak, potom schéma, ktorú poskytujem (MEGA I2C.pdf), vám ukáže ako. Toto je len permutácia verzie ATtiny2313. Ak plánujete dopredu, môžete sa uistiť, že váš programovací kábel bude vyhovovať obom systémom. Hlavným rozdielom je pridanie C2 a C3. Pozrite sa na obrázky, kde nájdete ich umiestnenie, mali by byť veľmi blízko čipu; jeden z nich je skutočne pod čipom. Pomáhajú predovšetkým predchádzať hluku z analógovo -digitálneho prevodníka. Ak neplánujete použiť zbernicu SPI, nemusíte prepájať prepojky, pretože nie sú potrebné pre zbernicu I2C na tomto čipe. Všimnite si toho, že nepájivá doska PCA8754A sa nezmení. Stačí pripojiť SDA a SCL a môžete ísť! Ľahké, čo?

Krok 5: Poďme kódovať a testovať

Poďme kódovať a testovať!
Poďme kódovať a testovať!
Poďme kódovať a testovať!
Poďme kódovať a testovať!
Poďme kódovať a testovať!
Poďme kódovať a testovať!

Je čas vytvoriť ovládače a ukážkové programy. Začneme s ATtiny2313 a nepájivou doskou PCA8574A, ktorú sme práve postavili. Stiahnite si súbor I2C.zip do svojho pracovného adresára I2C a rozbaľte ho. Budete mať nový priečinok s názvom I2C. V ňom nájdete USI I2C (pre ATtiny2313) a TWI I2C (pre ATmega168). V USI I2C nájdete priečinok I_O Port. Tento priečinok obsahuje kód nášho prvého ukážkového programu a ovládače USI I2C. Pomocou programu WinAVR skompilovajte a načítajte kód do ATtiny2313. Zhlboka sa nadýchnite a zapnite napájanie. Čo môžete očakávať: Pri zapnutí LED 1 na porte PD6 ATtiny2313 dvakrát zabliká. Nič sa nestane, kým nestlačíte tlačidlo (S1). Pri každom stlačení tlačidla sa spínače načítajú a ich nastavenie sa zobrazí na LED diódach pripojených k PCA8574A. Zmeňte hodnotu spínačov, stlačte tlačidlo a LED diódy by sa mali zmeniť. Pokračujte v tom, kým sa nedostanete nadšenie z toho, ako to funguje. Ak (nedaj bože!) Veci nefungujú podľa očakávania, starostlivo skontrolujte zapojenie. Chyby I2C budú signalizované blikaním LED3 (PD4) a pravdepodobne znamenajú, že musíte skontrolovať, či sú SDA a SCL pripojené k správnym kolíkom a či sú správne vytiahnuté. Ak veci stále nefungujú, prečítajte si zvyšok tejto sekcie, aby ste sa dozvedeli viac o ladení. Teraz sa vráťte a pozrime sa na kód. Otvorte súbor USI_I2C_Port.c. Toto je kód pre ukážkový program. (USI_TWI_Master.c a USI_TWI_Master.h obsahujú ovládače - môžete ich ignorovať, pokiaľ vás to nezaujíma.) Príklad použite na vedenie vlastných aplikácií I2C. Program vám väčšinou ukáže, ako inicializovať a používať ovládače I2C vrátane nastavenia. adresu slave a zvyšok vyrovnávacej pamäte správ a získanie údajov z nej. Tiež uvidíte, ako odpojím tlačidlo a nastavím slučku while. Za zmienku stojí niekoľko podrobností o programe. Všimnite si toho, že údaje z prepínačov sú invertované predtým, ako sú zapísané do LED diód na expandéri portov. Upozorňujeme, že vstupné porty na expandéri portov musia byť zapísané ako vysoké, aby správne fungovali. Tieto podrobnosti sú popísané v dátovom liste PCA8574A. Vždy si pozorne prečítajte údajové listy! Ešte zaujímavejšie je použitie podmieneného ladenia. Blízko začiatku programového súboru je príkaz // #define DEBUG a v kóde sú poslané príkazy #ifdef DEBUG. Pokiaľ nie je DEBUG definovaný (dve lomky robia z riadka komentár a nedávajú ho definovať), kód v príkazoch #ifdef až #endif nebude zostavený. Ak však veci nefungujú podľa vašich predstáv, znova skompilujte a znova načítajte kód pomocou príkazu #define DEBUG bez komentárov. Na LED diódach uvidíte oveľa viac žmurknutí, ktoré môžete dekódovať, aby ste sledovali priebeh programu, a pomôžu vám nájsť presne to, kde sa deje chyba. V skutočnosti vám to odporúčam vyskúšať, aby ste zistili, čo sa stane. Uvidíte, že LED 2 (na PD5) bude blikať počas postupu programu. Hodnota načítaná z prepínačov bude blikať na LED 1 (PD6) predtým, ako sa zobrazí na diódach LED expandéra. Mali by ste byť schopní sledovať beh programu pomocou týchto diód LED. S ATmega168 budeme pracovať ďalej; preskočte túto časť, ak vás zaujíma iba ATtiny2313. Stále so mnou? Dobre. Presuňte sa do priečinka TWI_I2C, zmeňte pracovný adresár na IO_Port a skompilujte a načítajte TWI_I2C_Port.c do ATmega168. Odpojte vedenia SDA a SCL od ATtiny2313 a pripojte ich k ATmega168. Pripojte napájanie a uzemnenie a zapojte. Operácia by mala byť rovnaká! Hrajte, kým napätie neustúpi, potom sa pozrime na kód. Otvorte TWI_I2C_Port.c. Kód je takmer identický, s výnimkou spracovania chýb a prispôsobenia ovládačov poháňaných prerušením. Tu sú rozdiely: Všimnite si toho, že hodiny musia byť nastavené na 4 MHz, aby zbernica I2C fungovala správne. Sei (); príkaz zapne prerušenia po inicializácii ovládačov I2C. Na kontrolu chýb sa testuje konkrétny stavový bit. Počas čítania je potrebné zavolať funkciu TWI_Read_Data_From_Buffer na prenos údajov načítaných do vyrovnávacej pamäte správ. Počas zápisu je potrebné použiť () na overenie, či je prenos dokončený, a až potom skontrolovať chyby. Tieto dve posledné funkcie sú popísané vyššie v popise ovládačov. Okrem toho je kód do značnej miery rovnaký ako pre ATtiny2313. DEBUG funguje rovnako, aj keď s tým chcete experimentovať.

Krok 6: Používanie pamäte I2C

Použitie pamäte I2C
Použitie pamäte I2C
Použitie pamäte I2C
Použitie pamäte I2C
Použitie pamäte I2C
Použitie pamäte I2C
Použitie pamäte I2C
Použitie pamäte I2C

Teraz, keď sme sa naučili používať zbernicu I2C na čítanie a zápis expandéra I/O portov, prejdeme k používaniu pamätí I2C, pamäte RAM aj EEPROM. Hlavný rozdiel je v tom, že viac bajtov je možné načítať alebo zapisovať z pamäte jediným príkazom I2C. Aby sme sa pripravili na tieto experimenty, musíme mierne upraviť hardvér a postaviť niekoľko nových obvodov na doske. Ponechajte obvod Port Expander, pretože ho použijeme na zobrazenie niektorých hodnôt pamäte. Odstráňte prepínače DIP z počítača PCA8574A a na tieto kolíky nasaďte svetlá. Ak nemáte dostatok blinkenlightov, presuňte ich na P4 až P7 na P0 až P3. (Hodnoty, ktoré sa majú zobraziť, sú dostatočne malé.) Teraz sa pozrite na schematický obrázok I2C Ram.pdf a zapojte PCF8570 na dosku. Pozrite sa aj na obrázok. Uistite sa, že ste pripájali kolík 7 k Vcc. Z PCA8574A spustite vodiče pre SDA a SCL. Nie sú potrebné žiadne ďalšie výsuvné odpory. Ak vás tiež zaujíma EEPROM, vytvorte tento obvod aj pomocou I2C EEPROM.pdf pre 24C16, ale dávajte pozor, aby tento príklad používal ATmega168. Tento obvod je skutočne jednoduchý. Ako je uvedené vyššie, bity adresy by mali byť ignorované. Stačí pripojiť napájanie a zem. Zatiaľ nepripájajte SDA a SCL, pretože sme nedokončili experimentovanie s RAM. Naše experimenty s pamäťou začneme s ATtiny2313 pripojeným k expandéru portov PCA8574A a k RAM PCF8570. Program zapíše do RAM nejaké čísla, potom ich odčíta a zobrazí na expandéri portov. Zmeňte svoj pracovný adresár na RAM pod USI I2C. Na vytvorenie a stiahnutie súboru USI_I2C_RAM.c použite súbor make. Súbory ovládača I2C sú rovnaké ako tie, ktoré sme použili predtým. Pripojte napájanie a mali by ste vidieť jediné bliknutie na LED 1 (PD6). Údaje sa zapíšu do prvých 4 bajtov pamäte. Stlačte tlačidlo a načítajú sa a zobrazia sa dva bajty. Na expandéri portu (P0) by ste mali vidieť jednu LED diódu, dvojsekundovú pauzu a potom dve LED (P0 a P1). Ďalšia dvojsekundová pauza a diódy LED by mali zhasnúť. Sekvenciu spustíte znova stlačením tlačidla. Ladenie je podobné vyššie uvedenej metóde. Pozrime sa na kód. Otvorte USI_I2C_RAM.c. Malo by to vyzerať dosť podobne ako predchádzajúci kód. Hlavnými rozdielmi sú detaily pamäte na čítanie a zápis. Pozrite sa na spôsob načítania vyrovnávacej pamäte správ pred hovorom, ktorý skutočne vykoná zápis. Prvý bajt je adresa slave s príslušne nastaveným bitom na čítanie/zápis. Ďalší bajt je však adresa pamäte, na ktorej môžete začať písať údaje. Potom prídu skutočné dátové bajty, ktoré sa postupne načítajú do pamäte od adresy, ktorú sme uviedli. Veľkosť správy určujeme ako 6. Začneme teda písať na adresu 00 a hodnoty 01, 03, 02 a 06 zapíšeme do pamäťových miest 00 až 03. Na čítanie údajov z pamäte musíme použiť funkciu USI_TWI_Start_Random_Read. Vyrovnávacia pamäť správ dostane adresu slave v prvom bajte a počiatočnú adresu v druhom bajte. Potom zavolajte funkciu s veľkosťou správy nastavenou na počet bajtov na čítanie plus 2. Všimnite si, že na bite na čítanie/zápis nezáleží, pretože čítanie sa vykoná bez ohľadu na to. Vrátené údaje sa začnú na druhom mieste vo vyrovnávacej pamäti správ. Akonáhle sú údaje načítané, sú prevrátené na zobrazenie na expandéri portov a zapísané do nich po jednom bajte s pauzou medzi hodnotami. Nakoniec kontrolky LED expandéra portov zhasnú. Zápisy do Port Expander sú identické s tým, čo bolo urobené v predchádzajúcich príkladoch. Zo zábavy môžete odkomentovať príkaz #define DEBUG, ako je uvedené vyššie, a vidieť veľa blikajúcich diód LED. Po ďalšom úspešnom experimente sme vzrušení vzrušením a prejdeme k ATmega168 a EEPROM. Zmeňte svoj pracovný adresár na EEPROM pod TWI I2C. Na vytvorenie a stiahnutie súboru TWI_I2C_EEPROM.c použite súbor make. Všimnite si toho, že súbory ovládača I2C sú identické so súbormi, ktoré sme použili predtým pre PCA8574A. Na otestovanie programu odpojte ATtiny2313 a pripojte ATmega168. Nechajte autobus I2C zavesený na ramene a zapnite ho. Výsledky sú rôzne, pretože teraz píšeme a čítame ďalšie údaje. LED 1 na PD7 by mala pri inicializácii blikať. Stlačte tlačidlo a údaje sa načítajú z pamäte a zobrazia sa. LED diódy na PCA8574 by mali blikať v nasledujúcom poradí: P1, P0 & P2, (všetky vypnuté), P0 & P1, P1 & P2. Nakoniec by mali všetky LED diódy portu zhasnúť. Zopakujte to znova stlačením tlačidla. Ach, ale počkajte, poviete si. Nie je tento program pre EEPROM? Pretože pristupujeme k pamäťovému zariadeniu na rovnakej adrese I2C, rovnaký program funguje pre RAM aj pre EEPROM. Vypnite zariadenie, presuňte SDA a SCL z RAM do EEPROM a spustite program znova. Malo by to fungovať úplne rovnako. Pamätajte, že EEPROM a RAM nie je možné pripojiť na zbernicu I2C súčasne, pretože zdieľajú rovnakú adresu. (Tí šikovní medzi vami môžu zvážiť zmenu programovateľných bitov adries na ram, ale to stále nebude fungovať. 24C16 používa celý blok adries, ktoré je možné naprogramovať pre ram.) Dobre, pozrime sa na tento posledný program. Otvorte TWI_I2C_EEPROM.c. Prvá vec, ktorú si treba všimnúť, je, že som naznačil, ako riešiť úplnú EEPROM 24C16. Prístup k nemu je možný v 256 bajtových blokoch na 8 rôznych adresách slave I2C. Pozrite sa, ako je MEMORY_ADDR definovaná ako počiatočná adresa na 50 hexadecimálnych; preto baran pracoval. Ak chcete získať prístup k ďalším blokom 24C16, použite ostatné adresy, ako som naznačil. Pozrite sa, ako som nastavil zapisovanie do pamäte. Do vyrovnávacej pamäte sa najskôr vloží adresa slave so sadou bitov na čítanie/zápis, potom počiatočná adresa 00, potom 16 bajtov údajov. Funkcia TWI_Start_Read_Write sa volá na zápis údajov (ako predtým) s veľkosťou správy nastavenou na 18. Keď je tlačidlo stlačené, na čítanie údajov použijeme TWI_Start_Random_Read a TWI_Read_Data_From_Buffer. Každý tretí bajt je zobrazený na diódach LED expandéra portov. Nakoniec LED diódy zhasnú, aby čakali na ďalšie stlačenie tlačidla. Možno sa čudujete, prečo som sa rozhodol napísať 16 bajtov. Ak si pozorne prečítate list s údajmi, uvidíte, že 24C16 robí cyklus zápisu vždy, keď prijme 16 bajtov, aj keď sa odosielajú ďalšie bajty. Zdá sa to byť pekné číslo na použitie. Ak sa ho rozhodnete zvýšiť, budete musieť zmeniť veľkosť MESSAGEBUF_SIZE. Budete tiež musieť zmeniť hodnotu TWI_BUFFER_SIZE v TWI_Master.h. Dôvodom je, že ovládač skopíruje údaje z vyrovnávacej pamäte správ na použitie rutinou služby prerušenia. Gratulujem Teraz ste pripravení používať zbernicu I2C vo svojich vlastných projektoch!

Krok 7: Webové zdroje

Tu sú odkazy na listy s údajmi o častiach použitých na experimenty. Ak nič iné nedostanete, určite by ste ich mali dostať. Port ExpanderRamEEPROBE Ako tvorca I2C má NXP (Philips) veľa skvelých vecí. (Vo svojich adresách URL radi používajú hranaté zátvorky, takže ich sem nemôžem správne zahrnúť. Ospravedlňujeme sa.] Ak sa chcete dostať do oblasti I2C, vyberte v zozname Produkty položku Rozhranie. Budete sa môcť dostať na ich stránku I2C a prístup k všetkým údajovým listom a poznámkam k aplikáciám, ktoré ponúkajú. Podrobný popis zbernice I2C a technické detaily sú tu. Získajte katalógové listy ATtiny2313 a ATmega168 (dátové knihy?) od spoločnosti Atmel. Poznámky k aplikácii Atmel sú tu. Pozrite sa na AVR310 a AVR315. Uchopte tiež kód. Pozrite sa sem a pozrite sa na mnoho ďalších vecí z I2C.

Krok 8: Poznámky pre šialencov

Pre skutočného geeka, ktorý chce poznať detaily, je potrebné mať na pamäti niekoľko vecí, ak sa pozriete na poznámky k programu Atmel Apps a kód ovládača:- Spôsob adresovania a ovládania zariadení I2C nie je súčasťou špecifikácií! Iné ako adresa slave a bit na čítanie/zápis, príkazy, režimy atď. Nie sú uvedené a sú špecifické pre dané zariadenie. Aby to bolo úplne zrejmé, všimnite si, že schéma použitá v príklade Atmel sa týka iba tohto príkladu a je do značnej miery neštandardná.- Implementácia USI sa líši od implementácie TWI v niekoľkých dôležitých smeroch. + Pri USI je taktovanie zabezpečené softvérom; s TWI to poskytuje generátor bitových rýchlostí. + Metóda USI nepoužíva prerušenia; TWI áno. To dáva určitý zmysel, pretože rodina Mega (pomocou TWI) môže robiť veľa ďalších vecí a nemala by byť zaťažená prenosmi I2C. Verzia riadená prerušením pre USI je určite možná, len nie je implementovaná v tomto návode. + Hardvér USI nie je optimalizovaný pre I2C a zvládne iba 8 -bitové prenosy. To znamená, že na odoslanie deviateho bitu sú potrebné dva prenosy (buď NACK alebo ACK). Hardvér TWI to zvláda automaticky. Vďaka tomu je implementácia ovládača USI trochu komplikovanejšia. + Detekcia chýb pre TWI je riešená hardvérom. USI vyžaduje spracovanie v softvéri, ktorý veci trochu komplikuje. + Hardvér TWI ovláda konfiguráciu portu priamo. Hardvér USI vyžaduje, aby boli portové bity nakonfigurované skôr, ako bude možné port použiť. Uvidíte to v rutine Master_Initialize pre USI.-Atmel tvrdí, že je možné použiť pull-upy portu AVR pre pull-upy zbernice I2C. Nenašiel som spôsob, ako tento prístup uplatniť. Použitie dvoch externých rezistorov sa zdá byť celkom jednoduchou schémou, takže som nad tým netrávil veľa času.

Odporúča: