Мазмұны:

ATtiny және ATmega үшін I2C автобусы: 8 қадам
ATtiny және ATmega үшін I2C автобусы: 8 қадам

Бейне: ATtiny және ATmega үшін I2C автобусы: 8 қадам

Бейне: ATtiny және ATmega үшін I2C автобусы: 8 қадам
Бейне: Регулятор температуры 2024, Шілде
Anonim
ATtiny және ATmega үшін I2C автобусы
ATtiny және ATmega үшін I2C автобусы

Мен Atmel AVR микроконтроллерлерін жақсы көремін! Осы нұсқаулықта сипатталған гетто даму жүйесін құрғаннан бері менде AVR ATtiny2313 және ATmega168 -мен тәжірибе жасаудың соңы болмады. Мен тіпті коммутаторларды енгізу ретінде Нұсқаулық жазуға дейін бардым және Ghetto Development System тұжырымдамасын CPLD -ге дейін кеңейте алдым. Соңғы жоба кезінде маған басқару мәндерін орнату үшін бірнеше қосқыш қажет болды. АВР -да енгізу -шығару түйреуіштері жеткіліксіз болды, сондықтан мен бірдеңе ойлауға мәжбүр болдым. Мен пернетақтасы мен дисплейі бар күрделі енгізу жүйесін қолдана алар едім, бірақ ATtiny2313 ресурстары таусылған болар еді. Бақытымызға орай, Atmel қарапайым екі сымды интерфейсі бар қосымша чиптерге (мысалы, жад немесе енгізу -шығару порттары) қосыла алатын интерфейсті қосу арқылы бұл мәселені шешуге мүмкіндік берді. Дұрыс, AVR -де екі енгізу -шығару түйреуішін қолдану арқылы біз көптеген қосымша енгізу -шығару түйреуіштеріне және басқа ресурстарға қол жеткізе аламыз. Бұл екі сымды интерфейс ресми түрде интегралды схема шинасы немесе I2C шинасы ретінде белгілі және оны Philips Semiconductors кезінде NXP ойлап тапқан. Егер сіз осы Нұсқаулықты оқып жатсаңыз, онда сіз I2C шинасы туралы естіген шығарсыз және оны PIC немесе басқа микроконтроллерде қолданған боларсыз. Концептуалды түрде өте қарапайым және AVR -дегі аппараттық ресурстармен қамтамасыз етілгенімен, бағдарламалық қамтамасыз ету драйверлері I2C шинасын пайдалану үшін әлі де қажет. Atmel қосымшалар туралы ескертулер береді (кейінірек осы нұсқаулықтағы ресурстарды қараңыз), бірақ олар толық емес және басқа AVR құрылғысымен байланысудан басқа мысалдарды көрсетпейді. AVR. Мен ATtiny2313 және ATmega168 құрылғыларына арналған Atmel драйверлерінің кеңейтілген нұсқаларын ұсынамын, мен оларды қолдануда қолданылатын талаптар мен шектеулерді түсіндіремін және I2C құрылғыларының жұмыс мысалдарын көрсетемін. Осы нұсқаулықпен жұмыс жасағаннан кейін сіз I2C шинасын AVR жобаларында сәтті пайдалана аласыз. Әлбетте, егер сіз олардың біреуіне ғана қызығушылық танытсаңыз, кішкентай немесе MEGA драйверлерін елемеуге болады. I2C автобусы туралы көбірек білгісі келетіндер үшін мен тиісті материалға сілтеме беремін.

1 -қадам: Бұл I2C заттарының бәрі неде?

Қалай болғанда да, бұл I2C заттары неде?
Қалай болғанда да, бұл I2C заттары неде?
Қалай болғанда да, бұл I2C заттары неде?
Қалай болғанда да, бұл I2C заттары неде?
Қалай болғанда да, бұл I2C заттары неде?
Қалай болғанда да, бұл I2C заттары неде?
Қалай болғанда да, бұл I2C заттары неде?
Қалай болғанда да, бұл I2C заттары неде?

I2C шинасы-бұл бірнеше құрылғыны бір-бірімен байланыстыра алатын және оларға ақпарат алмасуға мүмкіндік беретін екі сымды қарапайым байланыс. Қарапайым түрде бірнеше қосалқы құрылғылармен байланысатын бір басты құрылғы бар. Барлық құрылғылар I2C шинасының екі сымына параллель қосылған. Екі сым SCL және SDA ретінде белгілі. SCL - бұл сағаттық желі және оны негізгі құрылғы басқарады. SDA-екі бағытты деректер желісі. Деректерді беру үшін мастер бір ағынды оқу/жазу жалаушасымен біріктірілген қосалқы адрес жібереді. Егер жазу қажет болса, шебер деректерді адресатқа жіберуді жалғастырады. Егер оқу сұралса, құл деректермен жауап береді. Транзакцияларды үйлестіру үшін SCL және SDA сызықтары бірнеше шарттарды хабарлау үшін мастер мен бағынышты басқарады. Оларға START, STOP, ACK (мойындау) және NAK (растау жоқ) кіреді. Бұл шарттардың егжей -тегжейін жүргізушілер басқарады. Сіздердің араларыңыздағы нағыз геиктер барлық егжей -тегжейлерді осы нұсқаулықтың соңында берілген сілтемелерден біле аласыз. Электрлік талаптар өте қарапайым. Мастер мен құлдар Vcc үшін бірдей деңгейді қолдануы керек, алаңдар қосылуы керек, SCL және SDA желілері Vcc дейін тартылуы керек. Тартылатын резисторлардың мәні автобустың жалпы сыйымдылығына негізделген есептеумен дәл анықталады, бірақ іс жүзінде 1,8К мен 10К арасындағы кез келген шамада болуы мүмкін. Мен 5.1K -дан бастаймын және ол жұмыс істемейінше төменгі мәндерді қолданамын. Егер сізде көптеген құрылғылар болмаса немесе құрылғылар арасындағы сымның ұзындығы болмаса, бұл мәселе емес. I2C шинасындағы номиналды деректер жылдамдығы секундына 100 Кбит құрайды. 400Кбит/секунд, 1Мбит/секунд және одан жоғары жылдамдықтар да мүмкін, бірақ бұл нұсқаулықта драйверлер қолдау көрсетпейді. Барлық I2C құрылғылары секундына 100 Кбит жұмыс істейді, ATtiny2313 және ATmega168 әрқайсысы I2C шинасын әр түрлі қолданады. ATtiny2313 әмбебап сериялық интерфейс (USI) аппаратурасын қолданады - оны SPI шинасы үшін де қолдануға болады. ATmega168 екі сымды интерфейс (TWI) деп аталатын I2C шинасына арналған арнайы жабдыққа ие. Драйверлер жазылғаннан кейін бұл айырмашылықтар негізінен пайдаланушыға ашық болады. Бағдарламалық жасақтамада бір маңызды айырмашылық бар: ATmega168 I2C драйвері үзіліспен басқарылады, ал ATtiny2313 үшін олай емес. Бұл ATmega168 бағдарламасы I2C деректерді беруді күтуді қажет етпейді, тек басқа тасымалдауды бастамас бұрын немесе оқу операциясынан деректер келгенше күту керек дегенді білдіреді. Мысалдар мен талқылау мұны анық көрсетуі керек. I2C адрестерінің ұзындығы 7 бит, сондықтан олардың әрқайсысының бірегей мекен -жайы болса, автобуста 127 құрылғы болуы мүмкін. Суретте көрсетілгендей, бұл 7 биттік адрес бір битке солға жылжиды, ал ең аз бит адресте құрылғының оқылуын немесе жазылуын белгілеу үшін қолданылады. Осылайша, толық адрес - 8 биттік байт. Нақты адрес іштей құрылғыда анықталады және оны өзгерту мүмкін емес (ең маңызды 4 бит) және ішінара құрылғы түйреуіштеріне қосылатын биттермен анықталады (ең аз 3 бит), оны жоғары немесе төмен байланыстыруға болады нақты мекенжай. Бұл түсініксіз болып көрінеді, бірақ мысал мұны анық көрсетеді. PCA8574A мәліметтер парағы I2C адресінің ең маңызды төрт биті әрқашан 0111 болатынын көрсетеді. Келесі үш бит AD0, AD1 және AD2 түйреуіштерінің параметрлерімен анықталады. Бұл түйреуіштерді жерге немесе оң кернеуге қосуға болады (5 вольт) сәйкесінше 0 немесе 1. Мүмкін адрестер диапазоны PCA8574 мәліметтер парағындағы басқа суретте көрсетілгендей он алтылық 38 -ден 3F дейін. Адрестік биттік параметрлерді өзгерту арқылы I2C шинасында бір уақытта 8 PCA8574A дейін болуы мүмкін. Әрқайсысы өзінің нақты қызметші мекенжайына ғана жауап береді. Егер одан да көп енгізу -шығару порттары қажет болса, PCA8574 пайдалануға болады. PCA8574 пен PCA8574A арасындағы жалғыз айырмашылық - PCA8574 -тің I2C қосалқы адрестерінің диапазоны 20 -дан 27 -ге дейінгі он алтылық. Бұл құрылғының мекен -жайын анықтау шатастыруы мүмкін, себебі кейбір деректер парақтары оқу/жазу битін бір бөлігі деп санайды. мекен -жайы. Деректер парағын мұқият оқып шығыңыз және құлдық адрестің ұзындығы 7 бит болатынын есте сақтаңыз. Оқу/жазу битіне бөлек қарау керек. Тағы да, мысал көмектеседі. Біз тәжірибе жүргізетін 24C16 EEPROM -дің деректер парағында қосалқы адрестің бірінші (ең маңызды) төрт биті 1010 деп айтылады. Келесі үш бит A0, A1 және A2 арқылы анықталуы мүмкін; Ескеріңіз, бұл мәліметтер парағы кішірек EEPROM болып табылатын 24C01 мен 24C08 аралығын қамтиды. Деректер парағындағы суретте бұл мекен -жай биттерінің параметрлері өлшемі ұлғайған сайын еленбейтінін және 24C16 үшін мүлдем еленбейтінін көрсетеді. Яғни, соңғы үш бит маңызды емес және 24C16 шынымен барлық I2C қосалқы мекенжайларын 50 -ден 57 -ге дейінгі он алтылықта қолданады. Құлдар адрестерінің ауқымы 24C16 ішіндегі әр түрлі бөлімдерді қарастырады. Алғашқы 256 байт 50h мекенжайы бойынша, келесі 256 51сағатта және т.с.с 256 дейін 57 сағ - барлығы 2K байт. PCF8570 жедел жадының мекенжайы осы диапазонда болғандықтан, 24C16 мен PCF8570 бірге қолданыла алмайды.

2 -қадам: Кейбір I2C құрылғыларына тапсырыс беріңіз

Енді сіз I2C Bus туралы аздап білетін болсаңыз және оны қолданғыңыз келсе, неге кейбір I2C құрылғыларына тәжірибе жасауға тапсырыс бермеске, олар сізге бағдарламалық қамтамасыз етуді дайындап жатқан кезде сізге баруға мүмкіндік береді? O Interface Expander (менің сүйікті), статикалық коч және EEPROM. Тағы көп нәрсе бар, бірақ бұл керемет бастама. Біз қолданатын AVR процессорлары ATtiny2313 және Atmega168 (Arduino -да қолданылады). Егер сіз бұларды жаңадан білетін болсаңыз, онда олар туралы білуге және геттоның даму жүйесін құруға арналған керемет нұсқаулықты қараңыз. Осы нұсқаулықтағы ATmega168 схемасы осы процессорға гетто әзірлеу жүйесін қалай енгізу керектігін көрсетеді. Параллель порт кабелі ATtiny2313 кабелімен бірдей. (Мен Ghetto Development жүйесінің USB нұсқасын қолданған жоқпын, сондықтан I2C автобусына қалай кіруге болатынын білмеймін. Arduino үшін де дәл солай.) Міне Digikey бөлшектерінің нөмірлері. Портты кеңейтуші: 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 -қадам: I2C драйверлері

Мұнда I2C шинасы үшін драйвер функцияларының сипаттамасы берілген. Олар жаңадан бастаушыларға арналған Atmel Apps Notes көмегімен әзірленді. Мен мұны олар үшін негіз ретінде жасай алмас едім. Әзірлеу WinAVR және gcc C компиляторы көмегімен жасалды. Әр процессор үшін сағат жылдамдығының шектеулері төменде сипатталған. Мен процессордың дәм / сағат жиілігінің барлық комбинациясын тексере алмайтындықтан, мен тестілеуге болатын нәрсеге сүйеніп, шектеулер мен шектеулерді көрсетуге тырысамын. Міне, драйвер функциялары мен оларды пайдалану. Қосымша мәліметтер алу үшін және толық бағдарламаларда қолданылатын функцияларды көру үшін мысалдарды қараңыз. ATtiny2313 үшін: Сағатқа қойылатын талаптар: Драйверлер ATtiny2313 үшін 1 МГц жиілікке (әдепкі жылдамдық) арналған. Егер сіз басқа тарифтермен жұмыс жасағыңыз келсе, онда драйверлердегі тұрақтылықты реттеу қажет болады. Мұны істеу үшін сізге көмек қажет болса, маған электрондық хат жіберіңіз. Сондай -ақ, ресурстар қадамындағы сілтемелердегі Atmel қосымшаларының жазбаларынан кейбір кеңестер алуға болады. USI_TWI_Master_Initialise () Бұл функция I2C режимі үшін USI аппаратурасын инициализациялайды. Бағдарламаның басында бір рет қоңырау шалыңыз. Ол void мәнін қайтарады және ешқандай аргументтер жоқ. Бұл функция тек қате кодын қайтаратындықтан, мен қате жарық диодын жыпылықтау үшін TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) функциясын қолданамын. Қате кодтары USI_TWI_Master.h ішінде анықталған. Оны қалай атайды: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () Бұл функция I2C құрылғыларына бір байтты оқу және жазу үшін қолданылады. Ол бірнеше байтты жазу үшін де қолданылады. Бұл функцияны қолдану үшін 6 қадам бар. белгісіз char messageBuf (MESSAGEBUF_SIZE); 2) Құл мекенжайды буфердегі бірінші байт ретінде қойыңыз. Оны бір аз солға жылжытыңыз немесе НЕМЕ ОҚУ/ЖАЗУ битінде. Назар аударыңыз, оқу/жазу биті оқу үшін 1, жазу үшін 0 болады. Бұл мысал оқу үшін. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (РАС << TWI_READ_BIT); 3) Жазу кезінде байтты буфердегі келесі орынға қойыңыз. 4) USI_TWI_Start_Read_Write функциясын хабарлама буферімен және хабарлама өлшемімен аргументтер ретінде шақырыңыз.temp = USI_TWI_Start_Read_Write (messageBuf, 2); 5) қайтарылған мәнді (бұл жағдайда уақытша) қате болғанын тексеру үшін тексеруге болады. Олай болса, ол жоғарыда талқыланғандай өңделеді. Бағдарламалардағы мысалдарды қараңыз. 6) Егер оқуға сұраныс болса, байтты оқу буфердегі екінші орында болады. Егер бірнеше байтты жазу керек болса (мысалы, жад құрылғысына), дәл осы тәртіпті қолдануға болады. Буферді орнату мен процедураны шақыру сәл өзгеше. Буфердегі екінші байт жазылатын бастапқы жад адресі болады. Жазылатын деректер келесі байттарда болады. Хабарлама өлшемі барлық жарамды деректерді қамтитын өлшем болады. Егер 6 байт жазу керек болса, онда хабарлама көлемі 8 болады (қосалқы адрес + жады адресі + 6 байт деректер). USI_TWI_Start_Random_Read () Бұл функция I2C құрылғысынан бірнеше байтты оқу үшін қолданылады, әдетте бұл тек қандай да бір естелік. Бұл процедураны қолдану бұрынғы тәртіпке өте ұқсас, екі жағдайды қоспағанда. Оқу/Жазу битінің параметрі маңызды емес. Бұл процедураны шақыру әрқашан оқу операциясын тудырады. Хабарлама өлшемі оқылатын байт санынан 2 -ге артық болуы керек, егер қате болмаса, деректер буферде екінші орыннан басталады. ATmega168 үшін: Сағат талаптары: драйверлер ATmega168 үшін 4 МГц жиілік жиілігіне арналған. Мысал коды осы сағатты қалай орнату керектігін көрсетеді. Егер сіз басқа тарифтермен жұмыс жасағыңыз келсе, онда драйверлердегі тұрақтылықты реттеу қажет болады. Егер сізге бұл қажет болса, маған электрондық пошта арқылы хабар жіберіңіз. Бағдарламаның басында бір рет қоңырау шалыңыз. Ол жарамсыздықты қайтарады және ешқандай дәлел жоқ. Инициализациядан кейін swi () шақыру арқылы үзілістерді қосуды ұмытпаңыз. TWI_Get_State_Info () Бұл функция I2C қате туралы ақпаратты қайтарады және егер I2C транзакция кезінде қате пайда болса, қолданылады. Бұл функция тек қате кодын қайтаратындықтан, мен қате жарық диодын жыпылықтау үшін TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) функциясын қолданамын. Қате кодтары TWI_Master.h ішінде анықталған, бірақ қате жарық диодты сигнал беру үшін өзгертілген. Мәліметтер алу үшін мысал кодын қараңыз. Мұны қалай атауға болады: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) I2C транзакциясы аяқталғанына көз жеткізу арқылы қатені тексеру орындалатынын ескеріңіз (функция төменде сипатталған), содан кейін жаһандық мәртебе сөзінде біраз тестілеу жүргізіледі. екі функция жоғарыда сипатталған сәйкес функциялармен бірдей жұмыс істейді, бірақ кейбір ерекшеліктермен олар қате мәндерін қайтармайды, деректерді оқу буферге берілмейді. Бұл келесіде сипатталған функциямен орындалады. TWI_Start_Random_Read шақыру кезінде messageSize екі емес, бір емес, сұралған деректер байттарының саны болуы керек. ATmega168 үшін I2C драйвері үзіліспен басқарылады. Яғни, I2C транзакциялары басталады, содан кейін негізгі жұмыс жалғасуда өз бетінше орындалады. Егер негізгі тәртіп I2C транзакциясынан деректерді алғысы келсе, ол деректердің бар -жоғын тексеруі керек. Қатені тексеруге қатысты жағдай бірдей. Негізгі тәртіп қателерді тексермес бұрын I2C транзакциясы аяқталғанына сенімді болуы керек. Келесі екі функция осы мақсаттар үшін пайдаланылады. Мысал бағдарламалар мұны қалай пайдалану керектігін көрсетеді. Бұл функция деректерді жібермес бұрын I2C транзакциясы аяқталғанына көз жеткізеді. Мән осы функциямен қайтарылса, мен қате битін сенімді түрде тексеремін. Міне, оны қалай атауға болады. Хабардың өлшемі қажетті бит биттерінің санынан бір үлкен болуы керек. Деректер екінші мекенжайдан бастап messageBuf болады. Temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

4 -қадам: Құрайық

Құрайық!
Құрайық!
Құрайық!
Құрайық!
Құрайық!
Құрайық!
Құрайық!
Құрайық!

I2C Schematics.zip файлын жүктеуден бастаңыз. Сіз жұмыс аймағында I2C қалтасын құрғыңыз келуі мүмкін, ол үшін схемалар мен бағдарлама файлдарының үлгісі сақталады. Схемаларды осы каталогқа ашыңыз. Сіз I2C Schematics деп аталатын қалтаны таба аласыз. I2C.pdf деп аталатын файлды ашыңыз. Бұл схемада ATtiny2313 Ghetto Development System және PCA8574A I/O Port Expander (айналасында үлкен үзік жәшік бар) көрсетілген. Port Expander схемасы тақтаға салынған. Фотосуреттерге қарап, бұл тізбектердің қандай болатынын біліңіз. Сызбаның ATtiny2313 бөлігі - бұл жыпылықтайтын үш шамы (LED1, 2, 3, плюс R4, 5 және 6) мен оған қосылған түйме (S1) бар Ghetto Development System. қосымша мәліметтер. Бұл бөлшек I2C шинасының SCL және SDA желілерін қосуға мүмкіндік беретін алып тастауға болатын секіргіштердің қосындысы (JP4, 5 және 6). Секіргіштер бағдарламалау үшін орнында болуы керек, содан кейін SCL мен SDA қосылу үшін жойылады. Фотосуреттерде секіргіштердің орнында және жойылғандығы көрсетілген. Бұл секіргіштерді орналастыру сізге байланысты, егер сіз I2C автобусын қолданғыңыз келсе, оларды гетто дамыту жүйесіне енгізуіңіз керек. I2C шинасы ажыратылуы керек және бағдарламалау үшін секіргіштерді орнына қою керек. Есіңізде болсын, I2C шинасы үшін JP4 және JP6 туралы қамқорлық қажет. Егер сіз SPI шинасын қолданғыңыз келеді деп ойласаңыз, JP5 қойыңыз. Vcc (+5 вольт) және Gnd (жер) байланысын қамтамасыз етіңіз және AD0, 1 және 2 жерге қосыңыз (I2C қосалқы мекенжайы 38 шекс). Содан кейін 4 шамды және 4 DIP қосқышын қосыңыз. (Егер сізде DIP қосқыштары болмаса, сіз тек сымдарды қолдана аласыз. Жерге байлаңыз немесе сигналды қосу немесе өшіру үшін қалқымалы күйде қалдырыңыз.) Соңында SDA мен SCL тартқыш резисторларын (R11 және 12) Vcc-ке қосыңыз. Олар 3.3K ретінде көрсетілген, бірақ 1.8K -тан 5.1K -ге дейінгі кез келген мән жұмыс істеуі керек (мүмкін 10K -ға дейін, бірақ мен мұны істемедім). ATtiny2313 бағдарламаланғаннан кейін, сіз секіргіштерді алып тастай аласыз және тестілеу үшін SDA мен SCL қосасыз. Енді ATmega168 үшін. Мұндағы жалғыз әжім - сіз бұл процессорға гетто әзірлеу жүйесін құрмаған шығарсыз. Егер бұлай болса, онда мен ұсынған схема (MEGA I2C.pdf) сізге қалай болатынын көрсетеді. Бұл ATtiny2313 нұсқасының жай ғана ауыстырылуы. Егер сіз алдын ала жоспарласаңыз, бағдарламалау кабелі екі жүйеге де сәйкес келетініне көз жеткізіңіз. Негізгі айырмашылық - С2 мен С3 қосылуы. Оларды орналастыру үшін суреттерді қараңыз, олар чипке өте жақын болуы керек; олардың біреуі чиптің астында орналасқан. Бұл шуды аналогтық цифрлық түрлендіргіштен сақтауға көмектеседі. Егер сіз SPI шинасын пайдалануды жоспарламасаңыз, секіргіштерді салудың қажеті жоқ, себебі олар бұл чипте I2C шинасына қажет емес. PCA8754A тақтасы өзгермейтінін ескеріңіз. Сіз жай ғана SDA мен SCL қосасыз және кетесіз! Оңай, а?

5 -қадам: Код жасайық және тексереміз

Код жасайық және тексерейік!
Код жасайық және тексерейік!
Код жасайық және тексерейік!
Код жасайық және тексерейік!
Код жасайық және тексерейік!
Код жасайық және тексерейік!

Драйверлер мен мысал бағдарламаларды құрудың уақыты келді. Біз ATtiny2313 мен PCA8574A жаңа тақтасынан бастаймыз. I2C.zip файлын I2C жұмыс каталогына жүктеңіз және оны ашыңыз. Сізде I2C деп аталатын жаңа қалта болады. Онда сіз USI I2C (ATtiny2313 үшін) және TWI I2C (ATmega168 үшін) таба аласыз. USI I2C -те I_O порт қалтасын табасыз. Бұл қалтада біздің бірінші үлгі бағдарламамыздың коды мен USI I2C драйверлері бар. WinAVR көмегімен кодты ATtiny2313 ішіне құрастырып, жүктеңіз. Терең дем алып, қуатты қосыңыз. Міне күтуге болады: Қуат кезінде ATtiny2313 PD6 портындағы 1 жарық диоды екі рет жыпылықтайды, түймені (S1) басқанша басқа ештеңе болмайды. Түйме басылған сайын қосқыштар оқылады және олардың параметрлері PCA8574A жалғанған светодиодтарда көрсетіледі. Қосқыштардың мәнін өзгертіңіз, түймені басыңыз, светодиодтар өзгеруі керек. Мұның жұмысының қызығын көргенше, осылай жалғастыра беріңіз. Егер (Құдай сақтасын!) Заттар күткендегідей жұмыс істемесе, сымдарды мұқият тексеріңіз. I2C қателері LED3 (PD4) жыпылықтауы арқылы белгі береді және бұл SDA мен SCL дұрыс түйреуіштерге қосылғанын және дұрыс тартылғанын тексеру керек дегенді білдіреді. Егер бәрібір жұмыс істемесе, жөндеуді үйрену үшін осы бөлімнің қалған бөлігін оқыңыз. Енді қайтып оралыңыз және кодты қарастырайық. USI_I2C_Port.c файлын ашыңыз. Бұл бағдарлама үлгісі үшін код. (USI_TWI_Master.c және USI_TWI_Master.h драйверлерді қамтиды - егер сіз қызықпасаңыз, оларды елемеуге болады.) Өзіңіздің жеке I2C қосымшаларыңызды басқару үшін мысалды қолданыңыз. Көбінесе, бағдарлама I2C драйверлерін баптауды қалай қосуға болатынын көрсетеді. қосымша адресті және хабарлама буферінің қалған бөлігін жоғарылату және одан деректерді алу. Сіз сондай -ақ түймені қалай шығарып тастайтынымды және уақытша циклды қалай орнататынымды көресіз. Бағдарламаның бірнеше егжей -тегжейлері бар. Коммутаторлардағы деректер порт экспандеріндегі жарықдиодты шамдарға жазылмай тұрып, кері аударылатынын ескеріңіз. Сондай -ақ, Port Expander -дегі кіріс порттары олардың дұрыс жұмыс істеуі үшін жоғары деп жазылуы керек екенін ескеріңіз. Бұл мәліметтер PCA8574A мәліметтер парағында сипатталған. Әрқашан мәліметтер парағын мұқият оқып шығыңыз! Шартты түрде жөндеуді қолдану көбірек қызығушылық тудырады. Бағдарлама файлының басталуына жақын // #DEBUG анықтау және #ifdef DEBUG мәлімдемелері код бойынша таратылады. Егер DEBUG анықталмаса (екі қиғаш сызық жолға түсініктеме береді және оны анықтаудан сақтайды), #ifdef - #endif операторларындағы код құрастырылмайды. Бірақ егер сіз ойлағандай жұмыс істемесе, кодты #define DEBUG түсініктемесімен қайта құрастырыңыз және қайта жүктеңіз. Бағдарламаның орындалуын қадағалау үшін кодты шешуге болатын светодиоды көп жыпылықтайды және қай жерде қате кеткенін анықтауға көмектеседі. Шын мәнінде, мен сізге не болатынын көру үшін осы әрекетті орындауға кеңес беремін. Бағдарламаның орындалу барысына қарай LED 2 (PD5 -те) жыпылықтайды. Коммутаторлардан оқылатын мән 1 -ші жарық диодында (PD6) жыпылықтайды, ол порт кеңейту светодиодтарында көрсетілмес бұрын. Бағдарламаның жұмыс істеуін осы жарықдиодты бақылау арқылы бақылау керек. Біз келесіде ATmega168 -мен жұмыс жасаймыз; Егер сіз тек ATtiny2313 -ке қызығушылық танытсаңыз, бұл бөлімді өткізіп жіберіңіз. Әлі де менімен? Жақсы. TWI_I2C қалтасына өтіңіз, жұмыс каталогыңызды IO_Port етіп өзгертіңіз және TWI_I2C_Port.c файлын ATmega168 -ге жүктеңіз. SDA және SCL желілерін ATtiny2313 -тен ажыратып, оларды ATmega168 -ге қосыңыз. Қуат пен жерді қосыңыз және қосыңыз. Операция бірдей болуы керек! Қуаныш басылғанша ойнаңыз, содан кейін кодты қарастырайық. TWI_I2C_Port.c ашыңыз. Код қателерді өңдеуді және үзіліспен басқарылатын драйверлерді қоспағанда, шамамен бірдей. Міне, айырмашылықтар: I2C шинасының дұрыс жұмыс істеуі үшін сағатты 4 МГц -ке орнату керек екенін ескеріңіз. Sei (); I2C драйверлері инициализацияланғаннан кейін үзіліс қосылады. Қателерді тексеру үшін белгілі бір мәртебелік бит тексеріледі. Оқу кезінде TWI_Read_Data_From_Buffer функциясын оқу буферіне оқылған деректерді беру үшін шақыру қажет. Жазу кезінде (TWI_Transceiver_Busy ()) қатені тексермес бұрын тасымалдаудың аяқталғанына сенімді болу үшін қолданылуы керек. Бұл соңғы екі функция драйверлердің сипаттамасында жоғарыда сипатталған. Бұдан басқа, код ATtiny2313 үшін өте ұқсас. Егер сіз эксперимент жасағыңыз келсе, DEBUG дәл осылай жұмыс істейді.

6 -қадам: I2C жадын пайдалану

I2C жадын қолдану
I2C жадын қолдану
I2C жадын қолдану
I2C жадын қолдану
I2C жадын қолдану
I2C жадын қолдану
I2C жадын қолдану
I2C жадын қолдану

Енді I2C шинасын енгізу -шығару портын кеңейту құралын оқуды және жазуды үйрендік, енді I2C жадысын қолдануға көшейік, RAM де, EEPROM де. Негізгі айырмашылығы - бірнеше байтты I2C бір командасымен естеліктерге оқуға немесе жазуға болады. Бұл эксперименттерге дайын болу үшін бізге аппараттық құралдарды сәл өзгерту керек және тақтада бірнеше жаңа схемалар құру керек. Портты кеңейту схемасын сақтаңыз, өйткені біз оны кейбір жад мәндерін көрсету үшін қолданамыз. PCA8574A DIP қосқыштарын алып тастаңыз және сол түйреуіштерге жыпылықтайтын шамдарды қойыңыз. Егер сізде жарық шамдары жеткіліксіз болса, P4 -тен P7 -ге дейінгі шамдарды P0 -ден P3 -ке жылжытыңыз. (Көрсетілетін мәндер жеткілікті аз.) Енді I2C Ram.pdf сұлбасын қарап, PCF8570 тақтасына қосыңыз. Суретке де қараңыз. 7 -істікті Vcc -ке байлауды ұмытпаңыз. PCA8574A -дан SDA және SCL сымдарын өткізіңіз. Қосымша тартылатын резисторлар қажет емес, егер сізді EEPROM қызықтырса, 24C16 үшін I2C EEPROM.pdf көмегімен осы схеманы құрыңыз, бірақ бұл мысалда ATmega168 қолданылатыны туралы ескертіңіз. Бұл схема шынымен де қарапайым. Жоғарыда айтылғандай, адрестік биттерді елемеу керек. Тек қуат пен жерге қосыңыз. SDA мен SCL -ді қоспай -ақ қойыңыз, өйткені біз Ram -мен тәжірибені аяқтаған жоқпыз, біз PCA8574A Port Expander -ге және PCF8570 Ram -ге қосылған ATtiny2313 -пен жады эксперименттерін бастаймыз. Бағдарлама Рамға бірнеше сандарды жазады, содан кейін оларды оқиды және порт кеңейткіште көрсетеді. USI I2C астында жұмыс каталогын жедел жадқа өзгертіңіз. USI_I2C_RAM.c құрастыру және жүктеу үшін make файлын пайдаланыңыз. I2C драйверінің файлдары бұрын қолданылған файлдарға ұқсас екенін ескеріңіз. Қуат көзін қосыңыз, сонда сіз LED 1 (PD6) жыпылықтағанын көресіз. Деректер жадының алғашқы 4 байтына жазылады. Түймені басыңыз, сонда екі байт қайта оқылады және көрсетіледі. Порт кеңейткішінде (P0) бір жарықдиодты шам, екі секундтық үзіліс, содан кейін екі жарық диоды (P0 және P1) көру керек. Тағы екі секундтық үзіліс және жарық диодтары сөнуі керек. Ретті қайта бастау үшін түймені қайтадан басыңыз. Түзету жоғарыда сипатталған әдіске ұқсас. Келіңіздер, кодты қарастырайық. USI_I2C_RAM.c ашыңыз. Ол алдыңғы кодқа өте ұқсас болуы керек. Негізгі айырмашылықтар - есте сақтау мен жазудың егжей -тегжейлері. Хабарлама буферінің шын мәнінде жазуды жүзеге асыратын қоңырауға дейін жүктелу жолын қараңыз. Бірінші байт - оқу/жазу биті сәйкес орнатылған қосалқы адрес. Бірақ келесі байт - бұл деректерді жазуды бастау үшін жад адресі. Содан кейін біз көрсеткен мекен -жайдан бастап жадыға дәйекті түрде жүктелетін нақты деректер байттары келеді. Біз хабарлама өлшемін 6 деп көрсетеміз. Сондықтан біз 00 адресінен жазуды бастаймыз және 00, 03 жады орындарына 01, 03, 02 және 06 мәндерін жазамыз. Деректерді жадтан қайта оқу үшін USI_TWI_Start_Random_Read функциясын қолдану керек. Хабарлама буфері бірінші байтта қосалқы адресті алады, ал екінші байтта бастапқы адресті алады. Одан кейін оқу көлемі байт санына орнатылған хабарлама өлшемі бар функцияға қоңырау шалыңыз. Оқу/жазу битінің маңызды емес екенін ескеріңіз, себебі оқу қарамастан орындалады. Қайтарылған деректер хабарламалар буферіндегі екінші орында басталады. Деректер оқылғаннан кейін, ол Port Expander -де көрсету үшін төңкеріледі және оған мәндердің арасындағы үзіліспен бір байт жазылады. Соңында, Port Expander жарық диодтары өшіріледі. Port Expander -ге жазулар алдыңғы мысалдарда жазылғандармен бірдей. Көңіл көтеру үшін сіз #define DEBUG мәлімдемесін жоғарыдағыдай түсіндіре аласыз және көптеген жыпылықтайтын жарық диодтарын көре аласыз. Басқа сәтті эксперименттен кейін толқып, ATmega168 мен EEPROM -ге көшейік. Жұмыс каталогын TWI I2C астында EEPROM етіп өзгертіңіз. TWI_I2C_EEPROM.c құрастыру және жүктеу үшін жасау файлын пайдаланыңыз. I2C драйверінің файлдары біз бұрын PCA8574A үшін пайдаланылған файлдармен бірдей екенін ескеріңіз. Бағдарламаны тексеру үшін ATtiny2313 ажыратыңыз және ATmega168 қосыңыз. I2C автобусын Рамға қосулы күйде қалдырыңыз және оны қосыңыз. Нәтижелер әр түрлі, өйткені біз қазір көбірек деректерді жазамыз және оқимыз. ИНДИАЛИЦИЯ кезінде PD7 -дегі LED 1 жыпылықтауы керек. Түймені басыңыз, сонда деректер жадтан оқылады және көрсетіледі. PCA8574 светодиодтары келесі ретпен жыпылықтауы керек: P1, P0 & P2, (барлығы өшірулі), P0 & P1, P1 & P2. Соңында порттағы жарық диодтары сөнуі керек. Бұл әрекетті қайталау үшін түймені қайтадан басыңыз. Бұл бағдарлама EEPROM үшін емес пе? Біз бір I2C адресі бойынша жад құрылғысына кіретіндіктен, сол бағдарлама Ram үшін де, EEPROM үшін де жұмыс істейді. SDA мен SCL -ді өшіріп, Ram -ден EEPROM -ге жылжытыңыз және бағдарламаны қайтадан іске қосыңыз. Ол дәл осылай жұмыс істеуі керек. EEPROM мен Ram бір уақытта I2C шинасына қосыла алмайтынын ескеріңіз, себебі олар бір мекенжайды бөліседі. (Араларыңыздағы ақылдылар Ram -да бағдарламаланатын мекен -жай биттерін өзгертуді қарастыруы мүмкін, бірақ бұл әлі де жұмыс істемейді. 24C16 Рамға бағдарламаланатын адрестердің барлық блогын қолданады.) Жарайды, осы соңғы бағдарламаны қарастырайық.. TWI_I2C_EEPROM.c ашыңыз. Біріншіден, мен толық 24C16 EEPROM -ге қалай қарау керектігін айттым. Оған 8 түрлі I2C қосалқы мекенжайлары бойынша 256 байт бөліктерінде қол жеткізуге болады. MEMORY_ADDR 50 он алтылықтағы бастапқы адрес ретінде қалай анықталғанын қараңыз; сондықтан Рам жұмыс істеді. Егер сіз 24C16 басқа блоктарына кіргіңіз келсе, мен көрсеткендей басқа мекенжайларды пайдаланыңыз. Менің жадқа қалай жазуға болатынын қараңыз. Алдымен буферге оқу/жазудың биттік жиынтығы бар қосалқы адрес, содан кейін 00 -дің бастапқы мекенжайы, содан кейін 16 байт деректер енгізіледі. TWI_Start_Read_Write функциясы деректерді жазу үшін шақырылады (бұрынғыдай) хабар өлшемі 18 -ге орнатылған. Түйме басылғанда, біз деректерді кері оқу үшін TWI_Start_Random_Read және TWI_Read_Data_From_Buffer қолданамыз. Әрбір үшінші байт порт кеңейту светодиодында көрсетіледі. Соңында, жарықдиодты сөндіріледі, келесі батырманы басуды күтеді. Неліктен 16 байт жазуды таңдадым деп ойлайтын шығарсыз. Егер сіз деректер парағын мұқият оқып шықсаңыз, онда 24C16 16 байтты алған кезде, тіпті егер көп байт жіберілсе де, жазу циклін орындайтынын көресіз. Сондықтан бұл жақсы нөмір сияқты көрінді. Егер сіз оны ұлғайтуды таңдасаңыз, MESSAGEBUF_SIZE өлшемін өзгертуге тура келеді. TWI_Master.h ішінде TWI_BUFFER_SIZE мәнін өзгерту қажет болады. Бұл драйвер хабарлама буферіндегі деректерді үзіліс қызмет көрсету тәртібінде пайдалану үшін көшіреді. Құттықтаймын! Сіз енді I2C автобусын өз жобаларыңызда пайдалануға дайынсыз!

7 -қадам: веб -ресурстар

Мұнда эксперименттер үшін пайдаланылатын бөліктерге арналған мәліметтер кестесіне сілтемелер берілген. Порт ExpanderRamEEPROM I2C құрушысы бола отырып, NXP (Philips) көптеген керемет нәрселерге ие. (Олар өздерінің URL мекенжайларында төртбұрышты жақшаларды қолданғанды ұнатады, сондықтан мен оларды бұл жерге дұрыс енгізе алмаймын. Кешіріңіз.) I2C аймағына жету үшін Өнімдер тізімінен Интерфейсті таңдаңыз. Сіз олардың I2C сайтына кіре аласыз. I2C шинасының сипаттамасы мен техникалық мәліметтері мына жерде. Atmel -ден ATtiny2313 және ATmega168 деректер кестелерін (деректер кітаптары) алыңыз. Atmel қосымшасының ескертпелері мына жерде. Сондай -ақ, кодты алыңыз. Көптеген басқа I2C материалдарын қараңыз.

8 -қадам: Geeks үшін ескертулер

Мәліметтерді білгісі келетін нағыз геик үшін Atmel Apps Notes пен драйвер кодына қарайтын болсаңыз, мынаны есте ұстаған жөн:- I2C құрылғысына адрестеу және оған бұйрық беру әдісі техникалық сипаттамаларға кірмейді! Қосымша адрестен және оқу/жазу битінен басқа, командалар, режимдер және т.б. көрсетілмеген және берілген құрылғыға тән. Мұны түсінікті ету үшін, Atmel мысалында қолданылатын схема тек осы мысалға ғана қолданылатынын және стандартты емес екенін ескеріңіз.- USI енгізу TWI енгізуден бірнеше маңызды жолмен ерекшеленеді. + USI көмегімен сағатты бағдарламалық қамтамасыз ету қамтамасыз етеді; TWI көмегімен ол бит жылдамдығының генераторымен қамтамасыз етілген. + USI әдісінде үзіліс қолданылмайды; TWI жасайды. Бұл белгілі бір мағынаға ие, өйткені Mega отбасы (TWI көмегімен) көптеген басқа нәрселерді жасай алады және I2C трансферттерімен айналысудың қажеті жоқ. USI үшін үзіліс тудыратын нұсқа, әрине мүмкін, бұл нұсқаулықта енгізілмеген. + USI аппараттық құралы I2C үшін оңтайландырылмаған және тек 8 биттік тасымалдауларды өңдей алады. Бұл тоғызыншы бит (NACK немесе ACK) жіберу үшін екі трансферт қажет екенін білдіреді. TWI аппараттық құралы мұны автоматты түрде басқарады. Бұл USI драйверін енгізуді сәл қиындатады. + TWI қатесін анықтау аппараттық құралдарда өңделеді. USI біршама күрделендіретін бағдарламалық қамтамасыз етуді қолдануды талап етеді. + TWI аппараттық құралы порттың конфигурациясын тікелей басқарады. USI аппараттық құралы портты қолданар алдында порт биттерін конфигурациялауды талап етеді. Сіз мұны USI үшін Master_Initialize процедурасынан көресіз.-Atmel I2C шинасын тарту үшін AVR портын тартуды қолдануға болатынын айтады. Мен бұл әдісті қалай жұмыс істейтінін білмедім. Екі сыртқы резисторды қолдану өте қарапайым схемаға ұқсайды, сондықтан мен оған көп уақыт жұмсамадым.

Ұсынылған: