Mundarija:

ATtiny va ATmega uchun I2C avtobus: 8 qadam
ATtiny va ATmega uchun I2C avtobus: 8 qadam

Video: ATtiny va ATmega uchun I2C avtobus: 8 qadam

Video: ATtiny va ATmega uchun I2C avtobus: 8 qadam
Video: LDmicro 14: ЖК-дисплей I2C и часы реального времени DS3231 (программирование лестничной схемы ПЛК микроконтроллера с помощью LDmicro) 2024, Iyul
Anonim
ATtiny va ATmega uchun I2C avtobus
ATtiny va ATmega uchun I2C avtobus

Men Atmel AVR mikrokontrollerlarini yaxshi ko'raman! Ushbu yo'riqnomada tasvirlangan gettoni rivojlantirish tizimini yaratganimdan beri, ayniqsa, AVR ATtiny2313 va ATmega168 bilan tajriba o'tkazishni tugatmadim. Men hatto kalitlarni kirish sifatida ishlatish bo'yicha ko'rsatma yozishgacha bordim va Getto Development System kontseptsiyasini CPLD ga kengaytirdim. AVR -larda kirish -chiqish pinlari etarli emas edi, shuning uchun men nimanidir o'ylab topishga majbur bo'ldim. Men klaviatura va displeyli murakkab kirish tizimini sinab ko'rishim mumkin edi, lekin ATtiny2313 resurslari tugagan bo'lardi. Yaxshiyamki, Atmel oddiy ikkita simli interfeys bilan qo'shimcha chiplarga (xotira yoki kirish -chiqish portlari kabi) ulanadigan interfeysni qo'shib, bu muammoning echimini topdi. To'g'ri, AVR -dagi ikkita kirish -chiqish pinidan foydalanib, biz ko'plab qo'shimcha kirish -chiqish pinlariga va boshqa manbalarga kira olamiz. Bu ikkita simli interfeys rasman Inter-Integrated Circuit Bus yoki I2C avtobus sifatida tanilgan va uni Philips Semiconductors hali NXP ixtiro qilgan. Agar siz ushbu ko'rsatmalarni o'qiyotgan bo'lsangiz, ehtimol siz I2C avtobusini eshitgansiz va hatto uni PIC yoki boshqa mikrokontrolderda ishlatgan bo'lishingiz mumkin. Kontseptual jihatdan juda sodda va AVR -lardagi apparat resurslari bilan qo'llab -quvvatlansa -da, I2C avtobusidan foydalanish uchun dasturiy ta'minot drayverlari hali ham zarur. Atmel ilovalar uchun eslatmalarni taqdim etadi (bu ko'rsatmalarni keyinroq o'qing), lekin ular to'liq emas va boshqa AVR qurilmasi bilan aloqa qilishdan boshqa misollarni ko'rsatmaydi, bu yo'riqnomaning maqsadi hech kimga I2C drayverini yaratishni o'rgatish emas. AVR -lar. Buning o'rniga men ATtiny2313 va ATmega168 qurilmalari uchun Atmel drayverlarining kengaytirilgan versiyalarini taqdim etaman, ulardan foydalanishda qo'llaniladigan talablar va cheklovlarni tushuntiraman va sizga I2C qurilmalarining ishchi misollarini ko'rsataman. Ushbu ko'rsatma bilan ishlagandan so'ng, siz AVR loyihalarida I2C avtobusidan muvaffaqiyatli foydalanishingiz mumkin. Shubhasiz, agar siz ulardan faqat bittasi bilan qiziqsangiz, mayda yoki MEGA drayverlarini e'tiborsiz qoldirishingiz mumkin. I2C avtobusi haqida ko'proq bilishni istaganlar uchun men tegishli materiallarga havolalar beraman.

1 -qadam: I2C -da bu nima?

Qanday bo'lmasin, bu I2C materiallari nima?
Qanday bo'lmasin, bu I2C materiallari nima?
Qanday bo'lmasin, bu I2C materiallari nima?
Qanday bo'lmasin, bu I2C materiallari nima?
Qanday bo'lmasin, bu I2C materiallari nima?
Qanday bo'lmasin, bu I2C materiallari nima?
Qanday bo'lmasin, bu I2C materiallari nima?
Qanday bo'lmasin, bu I2C materiallari nima?

I2C avtobusi-bu bir nechta qurilmalarni bir-biriga ulash va ularga ma'lumot almashish imkonini beradigan oddiy, ikki simli ulanish. Oddiy shaklda bir nechta qul qurilmalar bilan aloqa qiladigan bitta asosiy qurilma mavjud. Barcha qurilmalar I2C avtobusining ikkita simiga parallel ravishda ulanadi. Ikkala sim ham SCL va SDA deb nomlanadi. SCL - bu soat chizig'i va uni asosiy qurilma boshqaradi. SDA-ikki tomonlama ma'lumot uzatish liniyasi. Ma'lumotni uzatish uchun xo'jayin bir bit o'qish/yozish bayrog'i bilan birlashtirilgan xizmat manzilini yuboradi. Agar yozishni xohlasangiz, xo'jayin ma'lumotni manzilga yuboradi. Agar o'qish so'ralsa, qul ma'lumot bilan javob beradi. Tranzaktsiyalarni muvofiqlashtirish uchun SCL va SDA chiziqlari bir nechta shartlarni bildirish uchun usta va qul tomonidan boshqariladi. Bunga START, STOP, ACK (tan olish) va NAK (tan olinmaydi) kiradi. Bu shartlarning tafsilotlari haydovchilar tomonidan hal qilinadi. Sizning orangizdagi haqiqiy geekslar barcha tafsilotlarni ushbu ko'rsatma oxirida berilgan havolalarda bilib olishlari mumkin. Elektr talablari juda oddiy. Xo'jayin va qullar Vcc uchun bir xil darajadan foydalanishi, maydonchalar ulanishi, SCL va SDA chiziqlari Vccgacha tortilishi kerak. Rezistorlarning qiymati avtobusdagi umumiy sig'imga asoslangan hisob-kitob bilan aniqlanadi, lekin deyarli 1,8K va 10K oralig'idagi har qanday qiymat bo'lishi mumkin. Men 5.1K bilan boshlayman va u ishlamaguncha pastroq qiymatlardan foydalanaman. Agar sizda ko'p qurilmalar yoki qurilmalar orasidagi uzun simlar bo'lmasa, bu odatda muammo emas, I2C avtobusidagi nominal ma'lumot uzatish tezligi sekundiga 100Kbit. 400Kbit/soniya, 1Mbit/soniya va undan yuqori tezliklar ham mumkin, lekin bu ko'rsatmada haydovchilar tomonidan qo'llab -quvvatlanmaydi. Barcha I2C qurilmalari sekundiga 100 Kbit tezlikda ishlaydi, ATtiny2313 va ATmega168 har biri I2C avtobusini turlicha amalga oshiradi. ATtiny2313 Universal Serial Interface (USI) uskunasidan foydalanadi - uni SPI avtobusi uchun ham ishlatish mumkin. ATmega168 ikkita simli interfeys (TWI) deb nomlanuvchi I2C avtobusi uchun maxsus jihozlarga ega. Drayvlar yozilgach, bu farqlar asosan foydalanuvchi uchun oshkora bo'ladi. Dasturiy ta'minotdagi muhim farq shundaki, ATmega168 I2C drayveri uzilib qoladi, ATtiny2313 uchun esa bunday emas. Bu shuni anglatadiki, ATmega168 dasturi I2C ma'lumot uzatilishini kutishi shart emas, faqat boshqa uzatishni boshlashdan oldin yoki o'qish operatsiyasidan ma'lumotlar kelguncha kutish kerak. Misollar va munozaralar shuni aniq ko'rsatishi kerakki, I2C manzillari 7 bit uzunlikda, shuning uchun har birining o'ziga xos manzili bo'lsa, avtobusda 127 tagacha qurilma bo'lishi mumkin. Rasmda ko'rsatilgandek, bu 7 bitli manzil bir bit chapga siljiydi va eng kichik bit qurilmani o'qish yoki yozish uchun manzilni belgilash uchun ishlatiladi. Shunday qilib, to'liq qul manzili 8 bitli baytdir. Haqiqiy manzil qisman qurilmada aniqlanadi va uni o'zgartirib bo'lmaydi (4 ta eng muhim bit) va qisman qurilma pinlariga ulanishi mumkin bo'lgan bitlar bilan belgilanadi (3 ta eng muhim bit), ularni baland yoki pastga bog'lab qo'yish mumkin. aniq manzil. Tushunarsiz tovushlar, lekin misol buni aniq ko'rsatib beradi. PCA8574A ma'lumot varaqasi shuni ko'rsatadiki, I2C manzilining to'rtta eng muhim biti har doim 0111 bo'ladi. Keyingi uch bit AD0, AD1 va AD2 pimlarining sozlamalari bilan belgilanadi. Bu pinlar mos ravishda 0 yoki 1 ni ko'rsatish uchun erga yoki musbat kuchlanish manbaiga (5 volt) ulanishi mumkin. PCA8574 ma'lumot varag'ining boshqa rasmida ko'rsatilgandek, mumkin bo'lgan manzillar diapazoni 38 dan 3F gacha o'n oltilik. Manzil bit sozlamalarini o'zgartirib, I2C avtobusida bir vaqtning o'zida 8 tagacha PCA8574A bo'lishi mumkin. Ularning har biri o'ziga xos qul manziliga javob beradi. Agar ko'proq kirish/chiqish portlari kerak bo'lsa, PCA8574 dan foydalanish mumkin. PCA8574 va PCA8574A o'rtasidagi yagona farq shundaki, PCA8574 ning I2C qulli manzillar diapazoni 20 dan 27 gacha o'n oltilikdir. Berilgan qurilmaning manzilini aniqlash chalkash bo'lishi mumkin, chunki ba'zi ma'lumotlar varaqlari o'qish/yozish bitini bir qismi deb hisoblaydi. manzil. Ma'lumotlar varag'ini diqqat bilan o'qing va esda tutingki, qul manzili 7 bit uzunlikda bo'ladi. O'qish/yozish biti alohida ko'rib chiqilishi kerak. Shunga qaramay, misol yordam beradi. Biz tajriba o'tkazadigan 24C16 EEPROM ma'lumot varag'i, qul manzilining birinchi (eng muhim) to'rt biti 1010. keyingi uch bitni A0, A1 va A2 bilan aniqlash mumkin; E'tibor bering, ma'lumotlar varag'i kichikroq o'lchamdagi EEPROM bo'lgan 24C01 dan 24C08 gacha bo'lgan ma'lumotlarni ham o'z ichiga oladi. Ma'lumotlar varag'idagi rasm shuni ko'rsatadiki, bu manzil bitlarining sozlamalari hajmi kattalashgan sari e'tiborga olinmaydi va 24C16 uchun umuman e'tiborga olinmaydi. Ya'ni, oxirgi uchta bit muhim emas va 24C16 chindan ham barcha I2C qul manzillarini 50 dan 57 gacha o'n oltilikda ishlatadi. Qulli manzillarning diapazoni aslida 24C16 doirasidagi turli bo'limlarga murojaat qiladi. Birinchi 256 bayt 50h manzilida, keyingi 256 51hda va hokazo oxirgi 256 gacha 57hda - jami 2K bayt. Biz sinab ko'rgan PCF8570 operativ xotira manzili shu diapazonda bo'lgani uchun, 24C16 va PCF8570 birgalikda ishlatilmaydi.

2 -qadam: Ba'zi I2C qurilmalariga buyurtma bering

Endi siz I2C Bus haqida bir oz ma'lumotga ega bo'lsangiz va undan foydalanmoqchi bo'lsangiz, nega ba'zi I2C qurilmalariga tajriba o'tkazishga buyurtma bermang, shunda ular dasturiy ta'minot tayyorlanayotganda siz tomonda bo'lishi mumkin? O interfeys kengaytiruvchisi (mening sevimli), statik qo'chqor va EEPROM. Ko'p narsa bor, lekin bu ajoyib boshlanish. Biz foydalanadigan AVR protsessorlari ATtiny2313 va Atmega168 (Arduino -da ishlatiladi). Agar siz bu sohada yangi bo'lsangiz, unda ular haqida bilib olish va Gettoni rivojlantirish tizimini yaratish bo'yicha buyuk ko'rsatmalarni ko'rib chiqing. ATmega168 sxemasi hozirgi yo'riqnomada ushbu protsessor uchun Getto ishlab chiqish tizimini qanday amalga oshirish kerakligini ko'rsatadi. Parallel port kabeli ATtiny2313 kabeli bilan bir xil. (Men Getto ishlab chiqish tizimining USB versiyasini sinab ko'rmadim, shuning uchun I2C avtobusiga qanday kirishni bilmayman. Arduino uchun ham xuddi shunday.) Bu erda Digikey qismlari raqamlari. Port kengaytiruvchisi: 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 -qadam: I2C drayverlari

Bu erda I2C avtobusining haydovchi funktsiyalarining tavsifi. Ular yangi boshlanuvchilar uchun Atmel Apps Notes yordamida ishlab chiqilgan. Men buni ularsiz asos qilib qura olmasdim. Ishlab chiqarish WinAVR va gcc C kompilyatori yordamida amalga oshirildi. Har bir protsessor uchun soat tezligi cheklovlari quyida tasvirlangan. Men protsessor ta'mi / soat tezligi kombinatsiyasini sinab ko'rishga qodir emasligim sababli, men sinab ko'rsata oladigan narsalarga sodiq qolaman va cheklovlar va cheklovlarni ko'rsatishga harakat qilaman. Bu erda haydovchi funktsiyalari va ulardan qanday foydalanish kerak. ATtiny2313 uchun: soat talablari: haydovchilar ATtiny2313 uchun 1 MGts (standart tezlik) soat tezligi uchun mo'ljallangan. Agar siz boshqa narxlarda ishlashni xohlasangiz, haydovchilarda doimiyliklarni sozlashingiz kerak bo'ladi. Agar sizga yordam kerak bo'lsa, menga elektron pochta xabarini yuboring. Resurslar qadamidagi havolalardagi Atmel ilovalaridan ba'zi maslahatlar olishingiz mumkin. USI_TWI_Master_Initialise () Bu funksiya USI uskunasini I2C rejimida ishga tushiradi. Dasturning boshida bir marta qo'ng'iroq qiling. Bu bo'shliqni qaytaradi va hech qanday dalillar yo'q. Bu funksiya faqat xato kodini qaytargani uchun men xato LEDini o'chirish uchun TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) funktsiyasidan foydalanaman. Xato kodlari USI_TWI_Master.h da aniqlangan. Buni qanday chaqirish mumkin: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () Bu funksiya bitta baytni I2C qurilmalariga o'qish va yozish uchun ishlatiladi. Bundan tashqari, bir nechta bayt yozish uchun ham ishlatiladi. Bu funktsiyani ishlatishning 6 bosqichi bor.1) Dasturingizda qul manzilini va ma'lumotlar baytini yuborish yoki qabul qilish uchun xabar buferini e'lon qiling. imzosiz char messageBuf (MESSAGEBUF_SIZE); 2) Qul manzilini buferga birinchi bayt qilib qo'ying Uni bir oz chapga siljiting yoki YOQISH/Yozish. E'tibor bering, o'qish/yozish biti o'qish uchun 1 va yozish uchun 0 bo'ladi. Bu misol o'qish uchun. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (HAQIQ << TWI_READ_BIT); 3) Yozish paytida, yoziladigan baytni buferning keyingi joyiga qo'ying. 4) USI_TWI_Start_Read_Write funktsiyasini xabar buferi va argumentlar sifatida xabar hajmi bilan chaqiring.temp = USI_TWI_Start_Read_Write (messageBuf, 2); 5) qaytarilgan qiymat (bu holda temp) xato yuz berganligini tekshirish uchun tekshirilishi mumkin. Agar shunday bo'lsa, u yuqorida muhokama qilinganidek hal qilinadi. 6) Agar o'qish so'ralsa, bayt buferning ikkinchi joyida bo'ladi, agar bir nechta bayt yozilishi kerak bo'lsa (masalan, xotira qurilmasiga), xuddi shu tartibdan foydalanish mumkin. Buferni sozlash va tartibni chaqirish biroz boshqacha. Buferdagi ikkinchi bayt yoziladigan boshlang'ich xotira manzili bo'ladi. Yoziladigan ma'lumotlar keyingi baytlarda bo'ladi. Xabar hajmi barcha haqiqiy ma'lumotlarni o'z ichiga olgan hajmda bo'ladi. Shunday qilib, agar 6 bayt yozilishi kerak bo'lsa, xabar hajmi 8 ga teng bo'ladi (asosiy manzil + xotira manzili + 6 bayt ma'lumot). USI_TWI_Start_Random_Read () Bu funksiya I2C qurilmasidan bir nechta baytlarni o'qish uchun ishlatiladi, odatda bu faqat qandaydir xotira. O'qish/Yozish bitining ahamiyati yo'q, bu tartibni ishlatish, avvalgisiga juda o'xshaydi. Bu tartibni chaqirish har doim o'qish jarayoniga olib keladi. Xabar o'lchami o'qilishi kerak bo'lgan 2 baytdan oshmasligi kerak, agar xato bo'lmasa, ma'lumotlar buferda ikkinchi joydan boshlanadi. ATmega168 uchun: soat talabi: haydovchilar ATmega168 uchun 4 MGts chastotali chastotaga mo'ljallangan. Misol kodi bu soat tezligini qanday o'rnatishni ko'rsatadi. Agar siz boshqa narxlarda ishlashni xohlasangiz, haydovchilarda doimiyliklarni sozlashingiz kerak bo'ladi. Agar buni amalga oshirish kerak bo'lsa, menga elektron pochta xabarini yuboring. Dasturning boshida bir marta qo'ng'iroq qiling. U bo'sh joyni qaytaradi va hech qanday dalillar yo'q. Ishga tushirilgandan so'ng, swi () ni chaqirib, uzilishlarni yoqishni unutmang. TWI_Get_State_Info () Bu funksiya I2C xato ma'lumotlarini qaytaradi va agar I2C tranzaktsiyasi paytida xato ro'y bersa ishlatiladi. Bu funksiya faqat xato kodini qaytargani uchun men xato LEDini o'chirish uchun TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) funktsiyasidan foydalanaman. Xato kodlari TWI_Master.h da aniqlangan, lekin xato LEDida signal berish uchun o'zgartirilgan. Tafsilotlar uchun misol kodini ko'ring. Buni qanday chaqirish mumkin: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) Xatolarni tekshirish I2C tranzaktsiyasi tugallanganligiga ishonch hosil qilish orqali amalga oshiriladi (funksiya quyida tasvirlangan) va keyin global status so'zida bir oz sinab ko'riladi. Ikkita funktsiya yuqorida tavsiflangan funktsiyalar bilan bir xil ishlaydi, lekin bir nechta istisnolardan tashqari, ular hech qanday xato qiymatini qaytarmaydi, ma'lumotlarni o'qish buferga o'tkazilmaydi. TWI_Start_Random_Read -ni chaqirganda, messageSize so'ralgan ma'lumotlar baytlari soni bilan bir emas, balki ikkita bo'lishi kerak. ATmega168 uchun I2C drayveri uzilish bilan boshqariladi. Ya'ni, I2C operatsiyalari boshlanadi va keyin asosiy tartib davom etguncha mustaqil ravishda bajariladi. Agar asosiy tartib I2C tranzaktsiyasidan ma'lumotlarni olishni xohlasa, u ma'lumotlarning mavjudligini tekshirishi kerak. Vaziyat xatolarni tekshirishda ham xuddi shunday. Xatolarni tekshirishdan oldin asosiy tartib I2C tranzaktsiyasi tugallanganligiga ishonch hosil qilishi kerak. Keyingi ikkita funktsiya bu maqsadlar uchun ishlatiladi. Misol dasturlari buni qanday ishlatishni ko'rsatib beradi. Bu funksiya ma'lumotlarni uzatishdan oldin I2C tranzaktsiyasi tugallanganligiga ishonch hosil qiladi. Qiymat bu funktsiya tomonidan qaytarilsa -da, men xato bitini to'g'ridan -to'g'ri tekshirishni ishonchli deb bilaman. Buni qanday chaqirish mumkin. Xabar hajmi kerakli ma'lumotlar bitlari sonidan kattaroq bo'lishi kerak. Ma'lumotlar ikkinchi manzildan boshlab messageBuf -da bo'ladi.temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

4 -qadam: quraylik

Keling, quraylik!
Keling, quraylik!
Keling, quraylik!
Keling, quraylik!
Keling, quraylik!
Keling, quraylik!
Keling, quraylik!
Keling, quraylik!

I2C Schematics.zip faylini yuklab olishdan boshlang. Sxemalar va namuna dastur fayllarini saqlash uchun ish joyingizda I2C papkasini yaratishingiz mumkin. Ushbu katalogdagi sxemalarni oching. Siz I2C Schematics nomli papkani topasiz. Kichik I2C.pdf nomli faylni oching. Ushbu sxemada ATtiny2313 Getto ishlab chiqish tizimi va PCA8574A I/U port kengaytirgichi ko'rsatilgan (atrofida katta chiziqli quti bor). Port Expander sxemasi non panelida qurilgan. Fotosuratlarga qarang, bu sxemalar qanday ko'rinishga ega. ATtiny2313 sxemasining bir qismi - bu uchta yonib -o'chadigan chiroqlar (LED1, 2 va 3, shuningdek R4, 5 va 6) va unga biriktirilgan tugmacha (S1) bo'lgan Getto ishlab chiqish tizimi. qo'shimcha tafsilot. Bu tafsilot - I2C avtobusining SCL va SDA liniyalarini ulash uchun olib tashlanishi mumkin bo'lgan o'tish moslamalari (JP4, 5 va 6). Jumpers dasturlash uchun joyida bo'lishi kerak, keyin SCL va SDA ulanishi uchun olib tashlanishi kerak. Fotosuratlarda jumperlar joyida va olib tashlangani ko'rsatilgan. Ushbu o'tish moslamalarini joylashtirish sizga bog'liq, agar siz I2C avtobusidan foydalanmoqchi bo'lsangiz, ularni Gettoni rivojlantirish tizimiga qo'yishingiz kifoya. I2C avtobusini uzib qo'yish va dasturlash uchun o'tish joylarini qo'yish kerak. E'tibor bering, siz faqat I2C avtobus uchun JP4 va JP6 bilan shug'ullanishingiz kerak. Agar siz SPI avtobusidan foydalanmoqchi bo'lsangiz, JP5 -ni kiriting. Vcc (+5 volts) va Gnd (tuproqli) ulanishlarni ta'minlang va AD0, 1 va 2 ni erga ulang (I2C qul manzilini olti burchakli qiladi). Keyin 4 ta miltillovchi chiroq va 4 ta DIP kalitini ulang. (Agar sizda DIP kalitlari bo'lmasa, siz simlardan foydalanishingiz mumkin. O'z navbatida signalni yoqish yoki o'chirish uchun erga bog'lang yoki suzuvchi qoldiring.) Nihoyat, SDA va SCL dan tortishish rezistorlarini (R11 va 12) Vcc ga ulang. Ular 3,3K sifatida ko'rsatilgan, lekin 1,8K dan 5,1K gacha bo'lgan har qanday qiymat ishlashi kerak (ehtimol 10K gacha, lekin men buni sinab ko'rmaganman). ATtiny2313 -ni dasturlashtirgandan so'ng, siz o'tish moslamalarini olib tashlashingiz va SDA va SCL -ni sinov uchun ulashingiz mumkin. Endi ATmega168 uchun. Bu erdagi yagona ajin - bu protsessor uchun Getto ishlab chiqish tizimini yaratmagan bo'lishingiz mumkin. Agar shunday bo'lsa, men ko'rsatgan sxema (MEGA I2C.pdf) sizga buni ko'rsatib beradi. Bu faqat ATtiny2313 versiyasining o'zgarishi. Agar siz oldindan rejalashtirsangiz, dasturiy kabelingiz ikkala tizimga ham mos kelishiga ishonch hosil qilishingiz mumkin. Asosiy farq C2 va C3 qo'shilishi. Ularni joylashtirish uchun rasmlarga qarang, ular chipga juda yaqin bo'lishi kerak; ulardan biri aslida chip ostida. Bu shovqinni analogdan raqamli konvertorga o'tkazmaslikka yordam beradi. Agar siz SPI avtobusidan foydalanishni rejalashtirmasangiz, o'tish moslamalarini qo'yishingiz shart emas, chunki ular bu chipdagi I2C avtobusiga kerak emas. E'tibor bering, PCA8754A non paneli o'zgarmaydi. Siz faqat SDA va SCLni ulashingiz va ketishingiz mumkin! Osonmi?

5 -qadam: Keling, kodlash va test qilamiz

Keling, kod yozamiz va test qilamiz!
Keling, kod yozamiz va test qilamiz!
Keling, kod yozamiz va test qilamiz!
Keling, kod yozamiz va test qilamiz!
Keling, kod yozamiz va test qilamiz!
Keling, kod yozamiz va test qilamiz!

Haydovchilar va namunali dasturlarni yaratish vaqti keldi. Biz yangi qurilgan ATtiny2313 va PCA8574A taxtasidan boshlaymiz. I2C.zip faylini I2C ish katalogingizga yuklab oling va oching. Sizda I2C deb nomlangan yangi papka bo'ladi. Unda siz USI I2C (ATtiny2313 uchun) va TWI I2C (ATmega168 uchun) ni topasiz. USI I2C -da siz I_O port papkasini topasiz. Bu papkada bizning birinchi namuna dasturimiz kodi va USI I2C drayverlari mavjud. WinAVR -dan foydalanib, kodni ATtiny2313 -ga yuklang va yuklang. Chuqur nafas oling va quvvatni yoqing. Bu erda kutish kerak: Quvvat yoqilganda, ATtiny2313 ning PD6 portidagi LED 1 ikki marta yonadi, tugmani (S1) bosmaguningizcha boshqa hech narsa bo'lmaydi. Har safar tugma bosilganda, kalitlar o'qiladi va ularning sozlamalari PCA8574A ga ulangan LEDlarda ko'rsatiladi. Kalitlarning qiymatini o'zgartiring, tugmani bosing va LEDlar o'zgarishi kerak. Ishni ko'rib, hayajondan qutulmaguningizcha, buni davom ettiring. Agar (Xudo saqlasin!) Ishlar kutilganidek ishlamasa, simlaringizni yaxshilab tekshirib ko'ring. I2C xatolari LED3 (PD4) yonib -o'chib turishi bilan signal beradi va ehtimol siz SDA va SCL to'g'ri pinlarga ulanganligini va to'g'ri tortilganligini tekshirishingiz kerak. Agar ishlar hali ham ishlamasa, disk raskadrovka haqida ma'lumot olish uchun ushbu bo'limning qolgan qismini o'qing. Endi orqaga qayting va kodni ko'rib chiqaylik. USI_I2C_Port.c faylini oching. Bu misol dasturining kodi. (USI_TWI_Master.c va USI_TWI_Master.h drayverlarni o'z ichiga oladi - agar siz qiziqmasangiz, ularni e'tiborsiz qoldirishingiz mumkin.) O'zingizning I2C ilovalaringizga rahbarlik qilish uchun misolni ishlating. Ko'pincha, dastur I2C drayverlarini ishga tushirish va ishlatishni ko'rsatadi. xabar manzilini va xabar buferining qolgan qismini va undan ma'lumotlarni olish. Bundan tashqari, men tugmani qanday o'chirib tashlayotganimni va vaqt oralig'ini qanday o'rnatganimni ko'rasiz. Ta'kidlash joizki, dasturning ba'zi tafsilotlari bor. E'tibor bering, kalitlardan olingan ma'lumotlar port kengaytirgichidagi LEDlarga yozilishidan oldin teskari yo'naltiriladi. Shuni ham unutmangki, Port Expander -dagi kirish portlari to'g'ri ishlashi uchun ular yuqori deb yozilishi kerak. Bu tafsilotlar PCA8574A ma'lumotlar varaqasida tasvirlangan. Har doim ma'lumot varaqlarini diqqat bilan o'qing! Shartli disk raskadrovka usullaridan foydalanish ko'proq qiziqish uyg'otadi. Dastur faylining boshida // #DEBUG ni aniqlang va #ifdef DEBUG bayonotlari kod bo'ylab sepilgan. DEBUG aniqlanmagan ekan (ikkita chiziq chiziqni izohga aylantiradi va uni aniqlashdan saqlaydi), #ifdef dan #endifgacha bo'lgan kodlar tuzilmaydi. Ammo, agar narsalar siz kutgandek ishlamasa, kodni #define DEBUG bilan izohlanmagan holda qayta kompilyatsiya qiling va qayta yuklang. Siz LED -larning yonib -o'chib turishini bilib olasiz, siz ularni dasturning bajarilishini kuzatib borishingiz mumkin va bu noto'g'ri ketayotgan joyni topishga yordam beradi. Aslida, nima bo'lishini ko'rish uchun buni sinab ko'rishingizni maslahat beraman. Ko'rib turganingizdek, LED 2 (PD5 -da) dasturning bajarilishi davomida yonib -o'chib turadi. Kommutatorlardan o'qilgan qiymat 1 -raqamli LEDda (PD6) yonib -o'chib turadi, u port kengaytirgich LEDlarida ko'rsatiladi. Siz bu LEDlar yordamida dasturning ishlashini kuzatib borishingiz kerak. Biz keyingi ATmega168 bilan ishlaymiz; Agar siz faqat ATtiny2313 bilan qiziqsangiz, ushbu bo'limni o'tkazib yuboring. Hali ham men bilanmi? Yaxshi. TWI_I2C papkasiga o'ting, ishchi katalogingizni IO_Port -ga o'zgartiring va TWI_I2C_Port.c -ni kompilyatsiya qiling va ATmega168 -ga yuklang. SDA va SCL liniyalarini ATtiny2313 dan uzing va ularni ATmega168 ga ulang. Quvvat va erni ulang va quvvatlantiring. Operatsiya bir xil bo'lishi kerak! Hayajon yo'qolguncha o'ynang, keyin kodni ko'rib chiqaylik. TWI_I2C_Port.c -ni oching. Kod xatolarga ishlov berish va uzilib qolgan haydovchilarni joylashtirishdan tashqari deyarli bir xil. Bu erda farqlar bor: E2C avtobusining to'g'ri ishlashi uchun soat 4 MGts ga o'rnatilishi kerakligini unutmang. Sei (); I2C drayverlarini ishga tushirgandan so'ng, bayonot uzilishlarni yoqadi. Xatolarni tekshirish uchun ma'lum bir bit bit tekshiriladi. O'qish paytida o'qilgan ma'lumotlarni xabar buferiga o'tkazish uchun TWI_Read_Data_From_Buffer funktsiyasini chaqirish kerak. Yozish paytida (TWI_Transceiver_Busy ()) xatolarni tekshirishdan oldin uzatish tugallanganligiga ishonch hosil qilish uchun ishlatilishi kerak. Bu oxirgi ikkita funksiya yuqorida haydovchilar tavsifida tasvirlangan. Bundan tashqari, kod ATtiny2313 bilan deyarli bir xil. Agar siz tajriba o'tkazmoqchi bo'lsangiz, DEBUG ham xuddi shunday ishlaydi.

6 -qadam: I2C xotirasidan foydalanish

I2C xotirasidan foydalanish
I2C xotirasidan foydalanish
I2C xotirasidan foydalanish
I2C xotirasidan foydalanish
I2C xotirasidan foydalanish
I2C xotirasidan foydalanish
I2C xotirasidan foydalanish
I2C xotirasidan foydalanish

Endi biz kirish -chiqish portini kengaytirgichni o'qish va yozish uchun I2C avtobusidan foydalanishni o'rgandik, keling, RAM va EEPROM kabi I2C xotiralaridan foydalanishga o'tamiz. Asosiy farq shundaki, bir nechta baytlarni bitta I2C buyrug'i bilan xotiralardan o'qish yoki yozish mumkin. Ushbu tajribalarga tayyorgarlik ko'rish uchun biz uskunani biroz o'zgartirishimiz va non panelida bir nechta yangi sxemalarni yaratishimiz kerak. Port kengaytirgich sxemasini saqlang, chunki biz uni ba'zi xotira qiymatlarini ko'rsatish uchun ishlatamiz. PCA8574A -dagi DIP kalitlarini olib tashlang va bu pinlarga miltillovchi chiroqlarni qo'ying. Agar sizda miltillovchi chiroqlar etarli bo'lmasa, P4 -P7 -ni P7 -P3 -ga o'tkazing. (Ko'rsatiladigan qiymatlar etarlicha kichik.) Endi I2C Ram.pdf sxemasini ko'rib chiqing va PCF8570 ni taxtaga ulang. Rasmga ham qarang. 7 -pinni Vccga bog'lab qo'yganingizga ishonch hosil qiling. PCA8574A dan SDA va SCL uchun simlarni o'tkazing. Agar siz EEPROM bilan qiziqsangiz, 24C16 uchun I2C EEPROM.pdf yordamida ushbu sxemani yarating, lekin bu misolda ATmega168 ishlatilgani haqida ogohlantiring. Bu sxema haqiqatan ham oddiy. Yuqorida muhokama qilinganidek, manzil bitlarini e'tiborsiz qoldirish kerak. Faqat kuch va erni ulang. SDA va SCL -ni ulamang, chunki biz Ram bilan tajribani tugatmaganmiz, biz xotira tajribalarini PCA8574A Port Expander va PCF8570 Ramga ulangan ATtiny2313 bilan boshlaymiz. Dastur Ramga ba'zi raqamlarni yozadi, keyin ularni o'qiydi va Port Expander -da ko'rsatadi. Ishchi katalogingizni USI I2C ostida RAMga o'zgartiring. USI_I2C_RAM.c ni kompilyatsiya qilish va yuklab olish uchun make faylidan foydalaning. E'tibor bering, I2C haydovchi fayllari biz ilgari ishlatgan fayllar bilan bir xil. Quvvatni ulang va siz LED 1 (PD6) yonib -o'chib turishini ko'rasiz. Ma'lumotlar xotiraning dastlabki 4 baytiga yoziladi. Tugmani bosing va ikkita bayt o'qiladi va ko'rsatiladi. Port Expander (P0) da bitta LED chiroqni ko'rishingiz kerak, ikki soniya pauza, keyin ikkita LED chirog'i (P0 va P1). Yana ikki soniya pauza va LEDlar o'chishi kerak. Tugmani yana bosing, ketma -ketlikni qaytadan boshlang. Nosozliklarni tuzatish yuqorida tavsiflangan usulga o'xshaydi. Keling, kodni ko'rib chiqaylik. USI_I2C_RAM.c -ni oching. Oldingi kodga juda o'xshash bo'lishi kerak. Asosiy farqlar - o'qish va yozish xotirasining tafsilotlari. Haqiqatan ham yozishni amalga oshiradigan qo'ng'iroqdan oldin, xabar buferi qanday yuklanganiga qarang. Birinchi bayt - bu o'qish/yozish biti to'g'ri o'rnatilgan qul manzili. Ammo keyingi bayt - bu ma'lumotlarni yozishni boshlash uchun xotira manzili. Keyin biz ko'rsatgan manzildan boshlab xotiraga ketma -ket yuklanadigan haqiqiy ma'lumotlar baytlari keladi. Biz xabar hajmini 6 deb belgilaymiz. Shunday qilib, biz 00 manzilidan yozishni boshlaymiz va 00, 03 xotira joylariga 01, 03, 02 va 06 qiymatlarini yozamiz. Ma'lumotlarni xotiradan o'qish uchun USI_TWI_Start_Random_Read funktsiyasidan foydalanish kerak. Xabar buferi birinchi baytda asosiy manzilni va ikkinchi baytda boshlang'ich manzilni oladi. So'ngra o'qiladigan baytlar soniga o'rnatilgan xabar hajmi o'rnatilgan funktsiyaga qo'ng'iroq qiling. O'qish/yozish bitining ahamiyati yo'q, chunki o'qish nima bo'lishidan qat'iy nazar amalga oshiriladi. Qaytgan ma'lumotlar xabarlar buferining ikkinchi joyidan boshlanadi. Ma'lumot o'qilgandan so'ng, u Port Expander -da aks ettirish uchun teskari yo'naltiriladi va qiymatlar orasidagi pauza bilan bir vaqtning o'zida bir baytga yoziladi. Nihoyat, Port Expander LEDlari o'chiriladi. Port Expander -ga yozilgan xabarlar oldingi misollarda bo'lgani bilan bir xil. O'yin -kulgi uchun siz #define DEBUG bayonotini yuqoridagi kabi izohlay olmaysiz va juda ko'p miltillovchi LEDlarni ko'rishingiz mumkin. Yana bir muvaffaqiyatli tajribadan so'ng hayajon bilan yonib, ATmega168 va EEPROMga o'tamiz. Ishchi katalogingizni TWI I2C ostida EEPROM ga o'zgartiring. TWI_I2C_EEPROM.c ni kompilyatsiya qilish va yuklab olish uchun make faylidan foydalaning. E'tibor bering, I2C haydovchi fayllari biz ilgari PCA8574A uchun ishlatilgan fayllar bilan bir xil. Dasturni sinab ko'rish uchun ATtiny2313ni va ATmega168 ni ulang. I2C avtobusini Ramga bog'lab qo'ying va quvvatni yoqing. Natijalar boshqacha, chunki biz ko'proq ma'lumot yozyapmiz va o'qiyapmiz. PD7 -dagi LED 1 ishga tushganda miltillashi kerak. Tugmani bosing va ma'lumotlar xotiradan o'qiladi va ko'rsatiladi. PCA8574 diodli LEDlari quyidagi ketma -ketlikni o'chirib qo'yishi kerak: P1, P0 va P2, (hammasi o'chirilgan), P0 va P1, P1 va P2. Nihoyat, port LEDlarining hammasi o'chishi kerak. Buni takrorlash uchun tugmani yana bosing. Oh, lekin kuting, deysiz. Bu dastur EEPROM uchun emasmi? Biz xotira qurilmasiga bir xil I2C manzilidan kirganimiz uchun, xuddi shu dastur Ram va EEPROM uchun ham ishlaydi. Quvvatni o'chiring va SDA va SCL -ni Ramdan EEPROM -ga o'tkazing va dasturni qayta ishga tushiring. Bu xuddi shunday ishlashi kerak. EEPROM va Ram bir vaqtning o'zida I2C avtobusiga ulanishi mumkin emas, chunki ular bir manzilga ega. (Sizning orangizdagi aqlli odamlar Ramdagi dasturlashtiriladigan manzil bitlarini o'zgartirishni o'ylashlari mumkin, lekin bu hali ham ishlamaydi. 24C16 Ram uchun dasturlash mumkin bo'lgan barcha manzillar blokidan foydalanadi.) OK, bu oxirgi dasturni ko'rib chiqaylik.. TWI_I2C_EEPROM.c -ni oching. E'tibor qilish kerak bo'lgan birinchi narsa, men to'liq 24C16 EEPROMga qanday murojaat qilishni ko'rsatdim. Unga 256 baytli bo'laklarda 8 xil I2C qul manzillarida kirish mumkin. Qarang: MEMORY_ADDR 50 ta o'n oltilikda boshlang'ich manzili sifatida; shuning uchun Ram ishladi. Agar siz 24C16 -ning boshqa bloklariga kirishni xohlasangiz, men ko'rsatgan boshqa manzillardan foydalaning. Xotiraga yozishni qanday sozlaganimni ko'rib chiqing. Avval buferga o'qish/yozish biti o'rnatilgan qul manzili, so'ngra 00 ning boshlang'ich manzili, so'ngra 16 bayt ma'lumot kiritiladi. TWI_Start_Read_Write funktsiyasi ma'lumotlarni yozish uchun chaqiriladi (avvalgidek), xabar hajmi 18 ga o'rnatiladi. Tugma bosilganda biz ma'lumotlarni qayta o'qish uchun TWI_Start_Random_Read va TWI_Read_Data_From_Buffer -dan foydalanamiz. Har uchinchi bayt Port Expander LEDlarida ko'rsatiladi. Nihoyat, LEDlar keyingi tugmani bosilishini kutish uchun o'chiriladi. Siz nima uchun 16 bayt yozishni tanladim deb hayron bo'lishingiz mumkin. Agar siz ma'lumotlar varaqasini diqqat bilan o'qib chiqsangiz, 24C16 16 baytni qabul qilganda yozish davrini bajarishini ko'rasiz, hatto ko'proq bayt yuborilgan bo'lsa ham. Shunday qilib, bu ishlatish uchun yaxshi raqam kabi tuyuldi. Agar siz buni oshirmoqchi bo'lsangiz, MESSAGEBUF_SIZE hajmini o'zgartirishingiz kerak bo'ladi. Bundan tashqari, TWI_Master.h da TWI_BUFFER_SIZE qiymatini o'zgartirishingiz kerak bo'ladi. Buning sababi shundaki, haydovchi uzilish xizmatidan foydalanish uchun xabarlar buferidan ma'lumotlarni nusxa ko'chiradi. Tabriklaymiz! Endi siz o'zingizning loyihalaringizda I2C avtobusidan foydalanishga tayyormiz!

7 -qadam: Internet -resurslar

Bu erda tajribalar uchun ishlatiladigan qismlar uchun ma'lumotlar jadvaliga havolalar. Agar sizda boshqa hech narsa bo'lmasa, siz ularni albatta olishingiz kerak. (Ular o'z URL manzillarida kvadrat qavslardan foydalanishni yaxshi ko'radilar, shuning uchun ularni bu erga to'g'ri kirita olmayman. Kechirasiz.) I2C maydoniga o'tish uchun Mahsulotlar ro'yxatidan Interfeysni tanlang. Siz ularning I2C saytiga kira olasiz va I2C avtobusining tavsifi va texnik tafsilotlari bu erda. Atmel -dan ATtiny2313 va ATmega168 ma'lumotlar jadvallarini (ma'lumotlar kitoblari?) oling. Atmel ilovasi eslatmalari shu erda. Ko'proq I2C -ni toping.

8 -qadam: Geeks uchun eslatmalar

Tafsilotlarni bilishni istagan haqiqiy geek uchun, agar Atmel Apps Notes va haydovchi kodiga qarasangiz, yodda tutish kerak bo'lgan narsalar:- I2C qurilmasiga murojaat qilish va unga buyruq berish usuli texnik xususiyatlarga kirmaydi! Qul manzili va o'qish/yozish bitidan boshqa buyruqlar, rejimlar va boshqalar ko'rsatilmagan va ular ma'lum bir qurilmaga xosdir. Buni aniq tushuntirish uchun, Atmel misolida ishlatilgan sxema faqat shu misol uchun amal qiladi va deyarli nostandart ekanligini e'tiborga oling. + USI yordamida soat dasturiy ta'minot bilan ta'minlanadi; TWI bilan u Bit Rate Generator tomonidan ta'minlanadi. + USI usuli uzilishlardan foydalanmaydi; TWI qiladi. Bu ma'lum darajada mantiqiy, chunki Mega oilasi (TWI yordamida) boshqa ko'p ishlarni amalga oshirishi mumkin edi va I2C o'tkazmalari bilan shug'ullanmaslik kerak. USI uchun uzilishlarga asoslangan versiya, albatta, mumkin, bu ko'rsatmada qo'llanilmagan. + USI apparati I2C uchun optimallashtirilmagan va faqat 8 bitli uzatishni boshqarishi mumkin. Bu shuni anglatadiki, to'qqizinchi bitni (NACK yoki ACK) yuborish uchun ikkita o'tkazish kerak. TWI apparati buni avtomatik tarzda boshqaradi. Bu USI drayverini amalga oshirishni biroz murakkablashtiradi. + TWI uchun xatolarni aniqlash apparatda amalga oshiriladi. USI ba'zi narsalarni murakkablashtiradigan dasturiy ta'minot bilan ishlashni talab qiladi. + TWI apparati to'g'ridan -to'g'ri port konfiguratsiyasini nazorat qiladi. USI apparati portni ishlatishdan oldin port bitlarini sozlashni talab qiladi. Siz buni USI uchun Master_Initialize tartibida ko'rasiz.-Atmelning ta'kidlashicha, I2C avtobusini tortish uchun AVR portini tortib olish mumkin. Men bu yondashuvni ishga solishning yo'lini tushunmadim. Ikkita tashqi rezistorni ishlatish juda oddiy sxemaga o'xshaydi, shuning uchun men bunga ko'p vaqt sarflamadim.

Tavsiya: