- Шта је И2Ц комуникацијски протокол?
- Како функционише И2Ц комуникација?
- Где користити И2Ц комуникацију?
- И2Ц са ПИЦ16Ф877а помоћу КСЦ8 компајлера
- Програмирање помоћу И2Ц заглавних датотека:
- Симулација протеја:
ПИЦ микроконтролери су моћна платформа коју микрочип обезбеђује за уграђене пројекте, због своје свестране природе проналази начине за многе примене, а фаза још увек траје. Ако сте пратили наше ПИЦ туторијале, тада бисте приметили да смо већ покривали широк спектар водича о ПИЦ микроконтролеру, почевши од самих основа. Од сада смо покрили основе како можемо ући у занимљивије ствари попут комуникацијског портала.
У огромном систему уграђених апликација ниједан микроконтролер не може сам да обавља све активности. У некој фази времена мора да комуницира са другим уређајима да би размењивао информације, постоји много различитих врста комуникационих протокола за дељење ових информација, али најчешће коришћени су УСАРТ, ИИЦ, СПИ и ЦАН. Сваки комуникацијски протокол има своју предност и недостатак. За сада се фокусирајмо на ИИЦ део, јер ћемо то научити у овом упутству.
Шта је И2Ц комуникацијски протокол?
Термин ИИЦ означава „ Интер интегрисани кругови “. Обично се означава као И2Ц или И на квадрат Ц или чак као протокол двожичног интерфејса (ТВИ) на неким местима, али све то значи исто. И2Ц је синхрони комуникацијски протокол, што значи да оба уређаја који деле информације морају да деле заједнички сигнал сата. Има само две жице за размену информација од којих се једна користи за сигнал славине, а друга за слање и примање података.
Како функционише И2Ц комуникација?
И2Ц комуникацију је први представио Пхиллипс. Као што је раније речено, има две жице, те две жице ће бити повезане преко два уређаја. Овде се један уређај назива мастер, а други уређај се назива славе. Комуникација треба и увек ће се одвијати између двоје господара и роба. Предност И2Ц комуникације је у томе што се на Мастер може повезати више подређених уређаја.
Комплетна комуникација одвија се кроз ове две жице, наиме, серијски сат (СЦЛ) и серијски подаци (СДА).
Серијски сат (СЦЛ): Дијели сигнал такта који генерира мастер са подређеним уређајем
Серијски подаци (СДА): шаље податке главном и подређеном између и између њих.
У било ком тренутку само ће мастер моћи да започне комуникацију. Будући да је у магистрали више од једног подређеног уређаја, мастер мора да се односи на сваког подређеног користећи другу адресу. Када им се обратите, само ће салве са том адресом одговорити са информацијама, док ће остали наставити да дају отказ. На овај начин можемо користити исту магистралу за комуникацију са више уређаја.
Где користити И2Ц комуникацију?
И2Ц комуникација се користи само за комуникацију на кратким удаљеностима. Свакако је поуздан у одређеној мери јер има синхронизовани импулс сата који га чини паметним. Овај протокол се углавном користи за комуникацију са сензором или другим уређајима који морају да шаљу информације мастеру. Врло је згодно када микроконтролер мора да комуницира са многим другим помоћним модулима користећи најмање само жице. Ако тражите комуникацију на дуге домете, требало би да испробате РС232, а ако тражите поузданију комуникацију требало би да испробате СПИ протокол.
И2Ц са ПИЦ16Ф877а помоћу КСЦ8 компајлера
Довољно је уводних текстова, уђимо у то и научимо како можемо да користимо микроконтролер за обављање И2Ц комуникације. Пре него што почнемо да јасно ставимо до знања да овај водич говори само о И2Ц у ПИЦ16Ф877а користећи КСЦ8 компајлер, поступак ће бити исти и за друге микроконтролере, али можда ће бити потребне незнатне промене. Такође запамтите да за напредне микроконтролере попут серије ПИЦ18Ф сам компајлер може имати уграђену библиотеку која користи И2Ц функције, али за ПИЦ16Ф877А ништа слично не постоји, па хајде да га сами направимо. Библиотека која је овде објашњена биће дата као заглавна датотека за преузимање на дну која се може користити за ПИЦ16Ф877А за комуникацију са другим И2Ц уређајима.
Као и увек најбоље место за започињање било чега је табела података. Потражите детаље о И2Ц у техничком листу и проверите који регистри морају бити конфигурисани. Нећу детаљно објашњавати, јер је табела података то већ учинила за вас. Даље у наставку објаснићу различите функције присутне у заглављу и њихову одговорност у програму.
воид И2Ц_Инитиализе ()
Функција иницијализације користи се да би микроконтролеру рекла да ћемо користити И2Ц протокол. То се може постићи постављањем потребних битова на ССПЦОН и ССПЦОН2 регистар. Први корак би био проглашење ИИЦ пинова као улазних пинова, овде би пинови РЦ3 и РЦ4 требало да се користе за И2Ц комуникацију, па их проглашавамо као улазне пинове. Следеће треба да поставимо ССПЦОН и ССПЦОН2 који је МССП контролни регистар. ПИЦ радимо у ИИЦ мастер режиму са тактном фреквенцијом ФОСЦ / (4 * (ССПАДД + 1)). Погледајте бројеве страница листа података наведених у доњим редовима коментара да бисте разумели зашто је тај регистар постављен тако.
Дакле, следећи пут морамо подесити фреквенцију такта, фреквенција такта за различите апликације може се разликовати, па стога од корисника добијамо избор путем променљиве фек_к и користимо га у нашим формулама за подешавање ССПАДД регистра.
воид И2Ц_Инитиализе (цонст унсигнед лонг фек_К) // Започни ИИЦ као мастер { ТРИСЦ3 = 1; ТРИСЦ4 = 1; // Постави СДА и СЦЛ пинове као улазне пинове ССПЦОН = 0б00101000; // пг84 / 234 ССПЦОН2 = 0б00000000; // пг85 / 234 ССПАДД = (_КСТАЛ_ФРЕК / (4 * фек_К * 100)) - 1; // Подешавање такта пг99 / 234 ССПСТАТ = 0б00000000; // пг83 / 234 }
Празнина И2Ц_Холд ()
Следећа важна функција је функција И2Ц_холд која се користи за задржавање извршења уређаја док се тренутна И2Ц операција не заврши. Морали бисмо да проверимо да ли треба одржати И2Ц операције пре започињања било које нове операције. То се може учинити провером регистра ССПСТАТ и ССПЦОН2. ССПСТАТ садржи информације о статусу И2Ц магистрале.
Програм може изгледати помало компликовано јер укључује операторе „и“ и „или“. Кад га разбијеш као
ССПСТАТ & 0б00000100 ССПЦОН2 & 0б00011111
У
То значи да се бринемо да је други бит на ССПСТАТ нула и слично битови од 0 до 4 су нула на ССПЦОН2. Затим све ово комбинујемо да бисмо проверили да ли је резултат нула. Ако је резултат нула, програм ће наставити ако не, задржаће се тамо док не добије нулу, јер се користи у вхиле петљи.
воид И2Ц_Холд () { вхиле ((ССПЦОН2 & 0б00011111) - (ССПСТАТ & 0б00000100)); // проверите ово на регистрима да бисте били сигурни да ИИЦ није у току }
Воид И2Ц_Бегин () и воид И2Ц_Енд ()
Сваки пут док пишемо или читамо било које податке помоћу И2Ц магистрале требали бисмо започети и прекинути И2Ц везу. Да бисмо започели И2Ц комуникацију, морамо поставити СЕН бит, а да бисмо завршили комуникацију морамо поставити ПЕН статусни бит. Пре пребацивања било ког од ових битова, требало би да проверимо да ли је И2Ц магистрала заузета помоћу функције И2Ц_Холд како је горе речено.
воид И2Ц_Бегин () { И2Ц_Холд (); // Држите програм је И2Ц заузет СЕН = 1; // Почиње ИИЦ пг85 / 234 } воид И2Ц_Енд () { И2Ц_Холд (); // Држите програм је И2Ц заузет ПЕН = 1; // Крај ИИЦ пг85 / 234 }
Празнина И2Ц_Врите ()
Функција писања користи се за слање било каквих података из главног модула у модул салве. Ова се функција обично користи након функције И2Ц почетак, а прати је функција И2Ц Енд. Подаци који морају бити уписани у ИИЦ магистралу пролазе се кроз променљиве података. Ови подаци се затим учитавају у регистар међуспремника ССПБУФ да би их послали преко И2Ц магистрале.
Обично ће се пре писања података написати адреса, тако да ћете морати два пута користити функцију писања, једном за подешавање адресе, а други пут за слање стварних података.
воид И2Ц_Врите (непотписани подаци) { И2Ц_Холд (); // Држите програм је И2Ц заузет ССПБУФ = подаци; // пг82 / 234 }
непотписани кратки И2Ц_Реад ()
Коначна функција коју морамо знати је функција И2Ц_Реад . Ова функција се користи за читање података који су тренутно на И2Ц магистрали. Користи се након што затражи од славе да напише неку вредност у сабирницу. Вредност која се прими биће у ССПБУФ-у , можемо је пренети у било коју променљиву за наш рад.
Током И2Ц комуникације, славе након слања података које је захтевао Мастер, послаће још један бит који је бит потврде, мастер би такође требало да провери да ли је комуникација била успешна. Након провере АЦКДТ бита за потврду, требало би га омогућити подешавањем АЦКЕН бита.
унсигнед схорт И2Ц_Реад (унсигнед схорт ацк) { унсигнед схорт инцоминг; И2Ц_Холд (); РЦЕН = 1; И2Ц_Холд (); долазно = ССПБУФ; // добити податке сачуване у ССПБУФ И2Ц_Холд (); АЦКДТ = (ацк)? 0: 1; // проверимо да ли је бит бит примљен АЦКЕН = 1; // пг 85/234 ретурн инцоминг; }
То је то, ове функције би требале бити довољне за успостављање И2Ц комуникације и писање или читање података са уређаја. Такође имајте на уму да постоје многе друге функције које И2Ц комуникација може да изведе, али ради једноставности овде о њима не разговарамо. Увек можете упутити табелу података како бисте знали комплетан рад
Комплетни код са датотеком заглавља за комуникацију ПИЦ16Ф877А И2Ц можете преузети са везе.
Програмирање помоћу И2Ц заглавних датотека:
Сад кад смо сазнали како функционише И2Ц комуникација и како можемо да користимо датотеку заглавља створену за њу, направимо једноставан програм у којем ћемо користити датотеку заглавља и уписати неке вредности у И2Ц линије. Затим ћемо симулирати овај програм и проверити да ли су ове вредности записане на магистрали.
Као и увек програм започиње подешавањем конфигурационих битова и подешавањем фреквенције такта на 20 МХз, као што је приказано доле
#прагма цонфиг ФОСЦ = ХС // Битови за одабир осцилатора (ХС осцилатор) #прагма цонфиг ВДТЕ = ОФФ // Бит Ватцхер Енабле бит (ВДТ дисаблед) #прагма цонфиг ПВРТЕ = ОН // Повер-уп Тимер Енабле бит (ПВРТ енаблед) # прагма цонфиг БОРЕН = ОН // Бригхт-оут Ресет Енабле бит (БОР енаблед) #прагма цонфиг ЛВП = ОФФ // Бит за омогућавање серијског програмирања у кругу ниског напона (једно напајање) (РБ3 је дигитални И / О, укључен ХВ МЦЛР се мора користити за програмирање) #прагма цонфиг ЦПД = ОФФ // Бит заштите података ЕЕПРОМ меморијског кода (заштита ЕЕПРОМ кода података искључена) #прагма цонфиг ВРТ = ОФФ // Фласх програмирање меморије Омогућавање битова (Заштита записа; сва програмска меморија може се уписати на ЕЕЦОН контролу) #прагма цонфиг ЦП = ОФФ // Бит програма за заштиту меморијског кода Фласх програма (заштита кода искључена) #дефине _КСТАЛ_ФРЕК 20000000
Следећи корак био би додавање датотеке заглавља о којој смо управо разговарали. Датотека заглавља је названа ПИЦ16Ф877а_И2Ц.х и може се преузети са везе о којој смо претходно разговарали. Обавезно додајте датотеку заглавља у датотеку заглавља листе пројеката, структура датотеке пројекта треба да изгледа овако
Након што се уверите да је датотека заглавља додата у датотеку пројекта, додајте датотеку заглавља у главну датотеку Ц.
#инцлуде
Унутар вхиле петље започињемо И2Ц комуникацију уписујемо неколико случајних вредности у И2Ц магистралу, а затим завршавамо И2Ц комуникацију. Случајне вредности које сам изабрао су Д0, 88 и ФФ. Можете да унесете било коју вредност коју желите. Али запамтите те вредности јер ћемо их верификовати у нашој симулацији.
вхиле (1) { И2Ц_Бегин (); И2Ц_Врите (0кД0); И2Ц_Врите (0к88); И2Ц_Врите (0кФФ); И2Ц_Енд (); __делаи_мс (1000); }
Комплетан програм се може наћи на дну странице, можете га користити или преузети комплетан зип фајл програма одавде. Након добијања програма компајлирајте га и припремите се за симулацију.
Симулација протеја:
Протеус има леп инструмент назван И2Ц програм за отклањање погрешака који се може користити за читање података на И2Ц магистрали, па направимо склоп помоћу њега и проверимо да ли се подаци успешно записују. Комплетна шема кола приказана је доле
Учитајте хек датотеку коју је генерисао наш програм двоструким кликом на микроконтролер. Затим симулирајте програм. Приметићете искачући прозор који ће приказивати све информације о И2Ц магистрали. Прозор за наш програм приказан је испод.
Ако пажљиво погледате податке који се записују, приметићете да су исти као и ми у нашем програму. Вредности су Д0, 88 и ФФ. Вредности се записују сваке 1 секунде, па се време такође ажурира као што је приказано доле. Плава стрелица означава да је записано од господара до подређеног да би у супротном смеру било усмерено. Детаљнији приказ података који се шаљу приказан је у наставку.
Ово је само увид у то шта И2Ц може да уради, такође може да чита и уписује податке на више уређаја. Више о И2Ц ћемо обрадити у нашим предстојећим водичима повезивањем различитих модула који раде са И2Ц протоколом.
Надам се да сте разумели пројекат и научили нешто корисно из њега. Ако сумњате, објавите их у одељку за коментаре испод или користите форуме за техничку помоћ.
Комплетни код је дат у наставку; датотеке заглавља са свим кодовима можете преузети одавде.