Mündəricat:

ATtiny və ATmega üçün I2C Avtobusu: 8 addım
ATtiny və ATmega üçün I2C Avtobusu: 8 addım

Video: ATtiny və ATmega üçün I2C Avtobusu: 8 addım

Video: ATtiny və ATmega üçün I2C Avtobusu: 8 addım
Video: Как использовать SSD1306 128x32 OLED-дисплей I2C с кодом Arduino 2024, Iyul
Anonim
ATtiny və ATmega üçün I2C Avtobus
ATtiny və ATmega üçün I2C Avtobus

Atmel AVR mikrokontrolörlərini sevirəm! Bu Təlimat kitabında təsvir olunan Getto İnkişaf Sistemini qurduğumdan bəri, xüsusilə AVR ATtiny2313 və ATmega168 ilə sınaqdan keçməyim sona çatmadı. Hətta keçidləri giriş kimi istifadə etmək üçün bir Təlimat yazmağa qədər getdim və Getto İnkişaf Sistemi konsepsiyasını CPLD -ə qədər genişləndirdim. Son bir layihə zamanı nəzarət dəyərlərini təyin etmək üçün bir neçə açarlara ehtiyacım var idi. AVR -lərdə kifayət qədər I/O pinləri olmadığından bir şey düşünmək məcburiyyətində qaldım. Klaviatura və ekranı olan kompleks bir giriş sistemini sınaya bilərdim, amma ATtiny2313 -ün resursları tükənərdi. Xoşbəxtlikdən, Atmel, sadə iki telli bir interfeys ilə əlavə çiplərə (yaddaş və ya I/O portları kimi) keçid edə biləcək bir interfeys daxil edərək bu problemin həllini təmin etdi. Doğrudur, bir AVR -də yalnız iki G/Ç pinindən istifadə edərək bir çox əlavə G/Ç pininə və digər mənbələrə daxil ola bilərik. Bu iki telli interfeys rəsmi olaraq İnteqrasiya edilmiş Dövrə avtobusu və ya yalnız I2C avtobusu olaraq bilinir və hələ Philips Semiconductors olduğu zaman NXP tərəfindən icad edilmişdir. Bu Təlimatı oxuyursanız, ehtimal ki, I2C avtobusu haqqında eşitmisiniz və hətta bir PIC və ya digər mikro nəzarət cihazında istifadə etmiş ola bilərsiniz. Konseptual olaraq çox sadə olsa da və AVR -lərdəki hardware qaynaqları tərəfindən dəstəklənsə də, I2C avtobusundan istifadə etmək üçün hələ də proqram sürücülərinə ehtiyac var. Atmel Tətbiq Qeydləri təqdim edir (bu Təlimatdakı Sonrakı mənbələrə baxın), lakin bunlar tamamlanmamışdır və başqa bir AVR cihazı ilə ünsiyyət qurmaqdan başqa heç bir nümunə göstərmir. AVR -lər. Əksinə, ATtiny2313 və ATmega168 cihazları üçün Atmel sürücülərinin genişləndirilmiş versiyalarını təqdim edəcəyəm, bunları istifadə edərkən tətbiq olunan tələbləri və məhdudiyyətləri izah edəcəyəm və sizə I2C cihazlarının iş nümunələrini göstərəcəyəm. Bu Təlimatla işlədikdən sonra AVR layihələrinizdə I2C avtobusundan uğurla istifadə edə biləcəksiniz. Aydındır ki, onlardan yalnız biri ilə maraqlanırsınızsa, ya kiçik, ya da MEGA üçün sürücüləri göz ardı edə bilərsiniz. I2C avtobusu haqqında daha çox öyrənmək istəyənlər üçün uyğun materiallara bağlantılar verəcəyəm.

Addım 1: Bütün bunlara baxmayaraq I2C məhsulları nədir?

Hər halda bu I2C materialları nədir?
Hər halda bu I2C materialları nədir?
Hər halda bu I2C materialları nədir?
Hər halda bu I2C materialları nədir?
Bütün bu I2C materialları nədir?
Bütün bu I2C materialları nədir?
Hər halda bu I2C materialları nədir?
Hər halda bu I2C materialları nədir?

I2C avtobusu, birdən çox cihazı birləşdirə bilən və məlumat mübadiləsinə imkan verən sadə iki telli bir əlaqədir. Ən sadə formada birdən çox qul cihazı ilə əlaqə quran bir əsas cihaz var. Bütün cihazlar I2C avtobusunun iki telinə paralel olaraq bağlanır. İki tel SCL və SDA olaraq bilinir. SCL saat xəttidir və əsas cihaz tərəfindən idarə olunur. SDA ikitərəfli məlumat xəttidir. Məlumat ötürmək üçün usta, bir az oxu/yaz bayrağı ilə birlikdə kölə ünvanı göndərir. Yazı istənirsə, usta məlumatı ünvanlı kölə göndərməyə davam edəcək. Oxumaq tələb olunarsa, qul məlumatlarla cavab verəcək. Əməliyyatları əlaqələndirmək üçün SCL və SDA xətləri bir neçə şərtləri bildirmək üçün usta və qul tərəfindən idarə olunur. Bunlara START, STOP, ACK (onay) və NAK (təsdiq yoxdur) daxildir. Bu şərtlərin detalları sürücülər tərəfindən həll olunur. Aranızdakı əsl geekslər, bütün detalları bu Təlimatın sonunda verilən bağlantılardan öyrənə bilərsiniz. Elektrik tələbləri olduqca sadədir. Usta və qullar Vcc üçün eyni səviyyədən istifadə etməli, sahələr bağlanmalı və SCL və SDA xətləri Vcc -ə qədər çəkilməlidir. Çəkmə rezistorlarının dəyəri avtobusdakı ümumi tutuma əsaslanan bir hesablama ilə dəqiq müəyyən edilir, lakin praktiki olaraq 1.8K ilə 10K arasında hər hansı bir dəyər ola bilər. 5.1K ilə başlayıram və işləyənə qədər daha aşağı dəyərlərdən istifadə edirəm. Cihazlar arasında çoxlu cihaz və ya uzun tellər olmadıqda, bu ümumiyyətlə problem deyil. I2C avtobusundakı nominal məlumat sürəti 100Kbit/saniyədir. 400Kbit/saniyə, 1Mbit/saniyə və daha yüksək sürətlər də mümkündür, lakin bu Təlimatdakı sürücülər tərəfindən dəstəklənmir. Bütün I2C cihazları 100Kbit/saniyədə işləyəcək ATTiny2313 və ATmega168 hər biri I2C avtobusunu fərqli şəkildə tətbiq edir. ATtiny2313, SPI avtobusu üçün də istifadə edilə bilən Universal Serial Interface (USI) aparatından istifadə edir. ATmega168, İki Telli İnterfeys (TWI) kimi tanınan I2C avtobusu üçün xüsusi təchizata malikdir. Sürücülər yazıldıqdan sonra bu fərqlər əsasən istifadəçi üçün şəffaf olur. Proqramda əhəmiyyətli bir fərq var: ATmega168 I2C sürücüsü kəsilir, ATtiny2313 üçün isə belə deyil. Bu o deməkdir ki, bir ATmega168 proqramı I2C məlumat ötürülməsini gözləməli deyil, yalnız başqa bir köçürmə başlamazdan əvvəl və ya oxunan əməliyyatdan məlumatlar gələnə qədər gözləmək lazımdır. İzləniləcək nümunələr və müzakirə bunu aydınlaşdırmalıdır. I2C ünvanları 7 bit uzunluğundadır, buna görə də hər birinin unikal ünvanı varsa 127 -ə qədər cihaz avtobusda ola bilər. Şəkildə göstərildiyi kimi, bu 7 bitlik ünvan bir bit sola köçürülür və ən az əhəmiyyətli ünvan, cihazın oxunmasını və ya yazılmasını qeyd etmək üçün istifadə olunur. Beləliklə, tam kölə ünvanı 8 bit baytdır. Həqiqi ünvan cihazın içərisində qismən müəyyən edilir və dəyişdirilə bilməz (ən əhəmiyyətli 4 bit) və qismən qurmaq üçün yüksək və ya aşağı bağlana bilən cihaz pinlərinə (3 ən az əhəmiyyətli bit) bağlana bilən bitlərlə müəyyən edilir. müəyyən bir ünvan. Çaşqın səslənir, amma bir nümunə bunu aydınlaşdıracaq. PCA8574A məlumat vərəqi göstərir ki, I2C ünvanının ən əhəmiyyətli dörd biti həmişə 0111 olacaq. Növbəti üç bit AD0, AD1 və AD2 sancaqlardakı parametrlərlə müəyyən edilir. Bu sancaqlar sırasıyla 0 və ya 1 -i təmsil etmək üçün yerə və ya müsbət gərginlik təchizatına (5 volt) bağlana bilər. PCA8574 məlumat vərəqindəki digər şəkildə göstərildiyi kimi, mümkün ünvanlar aralığı 38 ilə 3F arasında onaltılıqdır. Ünvan bit parametrlərini dəyişdirərək, I2C avtobusunda eyni anda 8 PCA8574A -a qədər ola bilər. Hər biri yalnız öz xüsusi kölə ünvanına cavab verəcək. Daha çox I/O portuna ehtiyac olarsa, PCA8574 istifadə edilə bilər. PCA8574 ilə PCA8574A arasındakı yeganə fərq, PCA8574 -ün I2C kölə ünvan aralığının 20 ilə 27 arasında onaltılıq olmasıdır. Bəzi məlumat vərəqlərində oxu/yazma bitinin bir hissəsi olduğunu düşündüyündən müəyyən bir cihazın ünvanını təyin etmək çaşdırıcı ola bilər. ünvan. Məlumat vərəqini diqqətlə oxuyun və qul ünvanının 7 bit uzunluğunda olacağını unutmayın. Oxuma/yazma biti ayrıca işlənməlidir. Yenə bir nümunə kömək edəcək. Təcrübə edəcəyimiz 24C16 EEPROM üçün məlumat vərəqəsi, qul ünvanının ilk (ən əhəmiyyətli) dörd bitinin 1010 olduğunu söyləyir. Növbəti üç bit A0, A1 və A2 ilə müəyyən edilə bilər; Ancaq unutmayın ki, məlumat vərəqəsi daha kiçik ölçülü EEPROM olan 24C01 ilə 24C08 -i də əhatə edir. Məlumat vərəqindəki rəqəm, ölçü artdıqca bu ünvan bitlərinin parametrlərinin nəzərə alınmadığını və 24C16 üçün tamamilə nəzərə alınmadığını göstərir. Yəni, son üç bitin heç bir əhəmiyyəti yoxdur və 24C16, həqiqətən, bütün I2C kölə ünvanlarını 50 ilə 57 arasında onaltılıqdan istifadə edir. Kölə ünvanlarının aralığı, həqiqətən də 24C16 daxilində fərqli bölmələri əhatə edəcək. İlk 256 bayt 50h ünvanında, sonrakı 256 51hdə və sair 576da son 256 -ya qədər - cəmi 2K baytdır. Təcrübə etdiyimiz PCF8570 RAM -in ünvanı bu aralığa düşdüyündən 24C16 və PCF8570 birlikdə istifadə edilə bilməz.

Addım 2: Bəzi I2C Cihazları Sifariş edin

İndi I2C Avtobus haqqında bir az bildiyinizdən və ondan istifadə etmək istədiyinizə görə, nəyə görə bəzi I2C cihazlarını sınaqdan keçirtməyinizi əmr etməyəsiniz ki, onlar proqramı hazırlayarkən sizə gedə bilsinlər? O Interface Expander (ən sevdiyim), Statik Ram və EEPROM. Daha çox şey var, amma bunlar əla bir başlanğıcdır. İstifadə edəcəyimiz AVR prosessorları ATtiny2313 və Atmega168 (Arduinoda istifadə olunur). Əgər bunlarla yeni tanışsınızsa, onda bunları öyrənmək və Getto İnkişaf Sisteminizi qurmaq üçün bu böyük Təlimata baxın. Hazırkı Təlimatdakı ATmega168 -in sxemi, bu prosessor üçün Getto İnkişaf Sisteminin necə tətbiq olunacağını göstərir. Paralel port kabeli ATtiny2313 üçün olan kabel ilə eynidır. (Getto İnkişaf Sisteminin USB versiyasını sınamamışam, buna görə də I2C avtobusuna necə daxil olduğunu bilmirəm. Arduino üçün eyni.) Digikey hissə nömrələri. Port Genişləndiricisi: 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

Addım 3: I2C Sürücüləri

Burada I2C avtobusu üçün sürücü funksiyalarının təsvirləri verilmişdir. Bunlar yeni başlayanlar üçün Atmel Apps Qeydləri istifadə edərək hazırlanmışdır. Onları qurmaq üçün bir baza olmadan edə bilməzdim. İnkişaf WinAVR və gcc C kompilyatoru istifadə edərək edildi. Hər bir prosessor üçün saat dərəcəsi məhdudiyyətləri aşağıda təsvir edilmişdir. Mümkün olan bütün prosessor ləzzət / saat dərəcəsi kombinasiyalarını sınaqdan keçirə bilmədiyim üçün, əslində test edə biləcəyimə sadiq qalacağam və məhdudiyyətləri və məhdudiyyətləri göstərməyə çalışacağam. Burada sürücü funksiyaları və onlardan necə istifadə olunacağı göstərilir. Zəhmət olmasa daha ətraflı məlumat üçün nümunələrə baxın və tam proqramlarda istifadə olunan funksiyaları görün. ATtiny2313 üçün: Saat Tələbi: Sürücülər ATtiny2313 üçün 1MHz (standart nisbət) saat tezliyi üçün hazırlanmışdır. Başqa qiymətlərlə çalışmaq istəyirsinizsə, sürücülərdə sabitləri düzəltməlisiniz. Bunu etmək üçün kömək lazımdırsa mənə e -poçt göndərin. Resurslar Adımındakı bağlantılardakı Atmel tətbiq qeydlərindən bəzi ipuçları da əldə edə bilərsiniz. Proqramın əvvəlində bir dəfə zəng edin. Void -i qaytarır və heç bir arqument yoxdur. Bu funksiya yalnız bir səhv kodu qaytardığından, səhv LEDini yandırmaq üçün TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) funksiyasından istifadə edirəm. Səhv kodları USI_TWI_Master.h -də müəyyən edilmişdir. Buna necə zəng etmək olar: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () Bu funksiya I2C cihazlarına tək bayt oxumaq və yazmaq üçün istifadə olunur. Çox bayt yazmaq üçün də istifadə olunur. Bu funksiyanı istifadə etmək üçün 6 addım var.1) Proqramınızda kölə ünvanı və göndəriləcək və ya alınacaq məlumat baytını saxlamaq üçün bir mesaj buferini elan edin. imzasız char messageBuf (MESSAGEBUF_SIZE); 2) Kölə Ünvanı tamponun ilk baytı olaraq qoyun. Bir az sola və ya Oxu/Yaz bitinə sürüşdürün. Oxuyun/Yazın biti Oxu üçün 1, Yazmaq üçün 0 olacaq. Bu nümunə Oxumaq üçündür. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (DOĞRU << TWI_READ_BIT); 3) Bir Yazı edərkən, yazılacaq baytı tampondakı növbəti yerə qoyun. 4) USI_TWI_Start_Read_Write funksiyasını mesaj tamponu və mesaj ölçüsü ilə arqument olaraq çağırın.temp = USI_TWI_Start_Read_Write (messageBuf, 2); 5) The qaytarılmış dəyər (bu vəziyyətdə temp) bir səhvin olub olmadığını yoxlamaq üçün sınaqdan keçirilə bilər. Əgər belədirsə, yuxarıda müzakirə edildiyi kimi işlənir. Proqramlardakı nümunələrə baxın. 6) Oxunması tələb olunarsa, bayt oxunması buferin ikinci yerində olacaq. Birdən çox bayt yazılacaqsa (məsələn, yaddaş cihazına), eyni qaydada istifadə edilə bilər. Tamponun qurulması və rutinin çağırılması bir az fərqlidir. Tampondakı ikinci bayt, yazılacaq başlanğıc yaddaş ünvanı olacaq. Yazılacaq məlumatlar sonrakı baytlarda olacaq. Mesajın ölçüsü bütün etibarlı məlumatlar daxil olmaqla ölçüsü olacaq. 6 bayt yazılacaqsa, mesajın ölçüsü 8 (kölə ünvan + yaddaş ünvanı + 6 bayt məlumat) olacaq. bir növ xatirə. Bu rutinin istifadəsi, iki istisna olmaqla, əvvəlki rejimə çox oxşardır. Oxu/Yaz bitinin parametrinin heç bir əhəmiyyəti yoxdur. Bu rutinin çağırılması həmişə Oxu əməliyyatına səbəb olacaq. Mesajın ölçüsü 2 -dən çox olmalı və oxunacaq bayt sayından çox olmalıdır. Heç bir səhv baş vermədikdə, məlumatlar ikinci yerdən başlayaraq buferdə olacaq. ATmega168 üçün: Saat Tələbi: Sürücülər, ATmega168 üçün 4MHz tezliyi üçün hazırlanmışdır. Nümunə kodu bu saat sürətinin necə qurulacağını göstərir. Başqa tariflərlə çalışmaq istəyirsinizsə, sürücülərdə sabitləri tənzimləməlisiniz. Bunu etmək üçün mənə e -poçt göndərin. Proqramın əvvəlində bir dəfə zəng edin. Boşluğu qaytarır və heç bir mübahisə yoxdur. Başladıqdan sonra swi () çağıraraq kəsilmələri aktiv etdiyinizə əmin olun. TWI_Get_State_Info () Bu funksiya I2C səhv məlumatlarını qaytarır və I2C əməliyyatı zamanı bir səhv baş verərsə istifadə olunur. Bu funksiya yalnız bir səhv kodu qaytardığından, səhv LEDini yandırmaq üçün TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) funksiyasından istifadə edirəm. Səhv kodları TWI_Master.h -də müəyyən edilmişdir, lakin səhv LED -də siqnal vermək üçün dəyişdirilmişdir. Ətraflı məlumat üçün nümunə koda baxın. Buna necə zəng etmək olar: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) I2C əməliyyatının tamamlandığından əmin olmaq (aşağıda təsvir olunan funksiya) və sonra qlobal status sözündə bir az test edilməklə səhv yoxlamanın aparıldığını unutmayın. iki funksiya yuxarıda təsvir edilən müvafiq funksiyalarla eyni işləyir, lakin bir neçə istisna istisna olmaqla, heç bir səhv dəyərini qaytarmır. Verilənlərin oxunması buferə köçürülmür. TWI_Start_Random_Read -ə zəng edilərkən, messageSize tələb olunan məlumat baytlarının sayı artı bir deyil, iki deyil, ATmega168 üçün I2C sürücüsü fasilə ilə idarə olunur. Yəni, I2C əməliyyatları başlayır və sonra əsas qaydalar davam edərkən müstəqil olaraq icra edilir. Əsas rutin başladığı I2C əməliyyatından məlumat istədikdə, məlumatların olub olmadığını yoxlamalıdır. Vəziyyət səhv yoxlama ilə eynidir. Əsas rutin, səhvləri yoxlamadan əvvəl I2C əməliyyatının tamamlandığından əmin olmalıdır. Növbəti iki funksiya bu məqsədlər üçün istifadə olunur. TWI_Transceiver_Busy () Səhvləri yoxlamadan əvvəl I2C əməliyyatının tamamlandığını görmək üçün bu funksiyaya zəng edin. Nümunə proqramlar bunun necə istifadə olunacağını göstərir. Bu funksiya, məlumatları ötürməzdən əvvəl I2C əməliyyatının tamamlandığından əmin olacaq. Bir dəyər bu funksiya ilə qaytarılsa da, səhvin bitini yoxlamağı daha etibarlı hesab edirəm. Buna necə zəng etmək olar. Mesajın ölçüsü, istədiyiniz məlumat bitlərinin sayından bir böyük olmalıdır. Məlumatlar ikinci yerdən başlayaraq messageBuf -da olacaq.temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

Addım 4: Gəlin Quraq

Gəlin Quraq!
Gəlin Quraq!
Gəlin Quraq!
Gəlin Quraq!
Gəlin Quraq!
Gəlin Quraq!
Gəlin Quraq!
Gəlin Quraq!

I2C Schematics.zip faylını yükləyərək başlayın. Şemaları və nümunə proqram fayllarını saxlamaq üçün iş sahənizdə bir I2C qovluğu yaratmaq istəyə bilərsiniz. Sxemləri bu qovluğa açın. I2C Schematics adlı bir qovluq tapa bilərsiniz. Kiçik I2C.pdf adlı faylı açın. Bu sxem ATtiny2313 Getto İnkişaf Sistemini və PCA8574A G/Ç Portu Genişləndiricisini (ətrafında böyük kəsikli qutuya malikdir) göstərir. Port Expander dövrəsi bir çörək taxtası üzərində qurulmuşdur. Bu sxemlərin necə göründüyünü görmək üçün fotoşəkillərə baxın. Sxemanın ATtiny2313 hissəsi, üç yanıb -sönən işıq (LED1, 2 və 3, üstəgəl R4, 5 və 6) və ona bağlanan bir düymə (S1) olan Getto İnkişaf Sistemidir. əlavə detal. Bu detal, I2C avtobus SCL və SDA xətlərinin bağlanmasına imkan vermək üçün çıxarıla bilən atlayıcıların (JP4, 5 və 6) əlavə edilməsidir. Jumpers proqramlaşdırma üçün yerində olmalıdır, sonra SCL və SDA -nın bağlanması üçün çıxarılmalıdır. Fotoşəkillərdə tullananların yerində olduğu və çıxarıldığı göstərilir. Bu tullananların yerləşdirilməsi sizin ixtiyarınızdadır, yalnız I2C avtobusundan istifadə etmək istəyirsinizsə onları Getto İnkişaf Sisteminizə qoymalısınız. I2C avtobusu ayrılmalı və keçidlər proqramlaşdırma üçün yerinə qoyulmalıdır. Qeyd edək ki, I2C avtobusu üçün yalnız JP4 və JP6 ilə maraqlanmalısınız. Əgər SPI avtobusundan istifadə etmək istədiyinizi düşünürsünüzsə JP5 -ə qoyun. PCA8574A I/O Port Expander -dən istifadə etmək çox asandır. Vcc (+5 volt) və Gnd (torpaq) əlaqələri təmin edin və AD0, 1 və 2 -ni yerə bağlayın (I2C kölə ünvanını 38 hex edir). Sonra 4 yanıb -sönən işıq və 4 DIP açarını bağlayın. (DIP açarlarınız yoxdursa, sadəcə tellərdən istifadə edə bilərsiniz. Siqnal vermək üçün yerə bağlayın və ya üzən vəziyyətdə buraxın.) Nəhayət, SDA və SCL-dən Vcc-ə çəkmə rezistorlarını (R11 və 12) qoşun. Bunlar 3.3K olaraq göstərilir, lakin 1.8K -dan 5.1K -a qədər olan hər hansı bir dəyər işləməlidir (bəlkə də 10K -a qədərdir, amma bunu sınamamışam). ATtiny2313 -ü proqramlaşdırdıqdan sonra atlayıcıları çıxarıb SDA və SCL -ni sınaq üçün bağlaya bilərsiniz. İndi ATmega168 üçün. Buradakı yeganə qırış, bu prosessor üçün bir Getto İnkişaf Sistemi qurmadığınızdır. Əgər belədirsə, təqdim etdiyim sxem (MEGA I2C.pdf) sizə bunu necə göstərəcək. Bu yalnız ATtiny2313 versiyasının bir dəyişməsidir. Əvvəlcədən planlaşdırırsınızsa, proqramlaşdırma kabelinizin hər iki sistemə uyğun olacağından əmin ola bilərsiniz. Əsas fərq C2 və C3 -ün əlavə edilməsidir. Bunların yerləşdirilməsi üçün şəkillərə baxın, çipə çox yaxın olmalıdır; onlardan biri əslində çipin altındadır. Bunlar səs -küyün analoqdan rəqəmsal çeviriciyə çevrilməməsinə kömək edir. Bu çipdəki I2C avtobusu üçün lazım olmadığı üçün SPI avtobusundan istifadə etməyi planlaşdırmırsınızsa, atlayıcıları taxmağa ehtiyac yoxdur. Qeyd edək ki, PCA8754A çörək taxtası dəyişməyəcək. Yalnız SDA və SCL -ni bağlayacaqsınız və gedəcəksiniz! Asan, hə?

Addım 5: Kodlaşdıraq və Test edək

Kodlaşdıraq və Test Edək!
Kodlaşdıraq və Test Edək!
Kodlaşdıraq və Test Edək!
Kodlaşdıraq və Test Edək!
Kodlaşdıraq və Test Edək!
Kodlaşdıraq və Test Edək!

Sürücüləri və nümunə proqramları qurmağın vaxtı gəldi. Yeni qurduğumuz ATtiny2313 və PCA8574A çörək taxtasından başlayacağıq. I2C.zip faylını I2C iş kataloqunuza yükləyin və açın. I2C adlı yeni bir qovluğunuz olacaq. Burada USI I2C (ATtiny2313 üçün) və TWI I2C (ATmega168 üçün) tapa bilərsiniz. USI I2C -də I_O Port qovluğunu tapa bilərsiniz. Bu qovluq ilk nümunə proqramımızın kodunu və USI I2C sürücülərini ehtiva edir. WinAVR istifadə edərək kodu tərtib edin və ATtiny2313 -ə yükləyin. Dərin bir nəfəs alın və gücü açın. Gözləmək lazım olan budur: Açıldıqda ATtiny2313 -ün PD6 portundakı LED 1 iki dəfə yanıb -sönür, düyməni (S1) basana qədər başqa heç nə olmayacaq. Hər dəfə düyməyə basıldıqda açarlar oxunur və onların parametrləri PCA8574A -ya qoşulmuş LED -lərdə göstəriləcək. Açarların dəyərini dəyişdirin, düyməni basın və LEDlər dəyişməlidir. İşlədiyini görən həyəcanı aşana qədər bunu etməyə davam edin. (Allah qorusun!) İşlər gözlənildiyi kimi işləmirsə, naqillərinizi diqqətlə yoxlayın. I2C səhvləri LED3 (PD4) üzərindəki yanıb -sönmə ilə siqnal veriləcək və ehtimal ki, SDA və SCL -nin düzgün sancaqlara qoşulduğunu və düzgün çəkildiyini yoxlamaq lazımdır. İşlər hələ də işləmirsə, ayıklama haqqında öyrənmək üçün bu hissənin qalan hissəsini oxuyun. İndi geri qayıdın və kodu nəzərdən keçirək. USI_I2C_Port.c faylını açın. Bu nümunə proqramın kodudur. (USI_TWI_Master.c və USI_TWI_Master.h sürücüləri ehtiva edir - maraqlanmadığınız halda onları görməzdən gələ bilərsiniz.) Öz I2C tətbiqlərinizi istiqamətləndirmək üçün nümunəni istifadə edin. Çoğunlukla, proqram I2C sürücülərini necə işə salmağı və istifadə etməyi göstərir. kölə ünvanını və mesaj tamponunun qalan hissəsini yoxlayın və məlumatları oradan çıxarın. Düyməni necə çıxardacağımı və while döngüsünü necə qurduğumu da görəcəksiniz. Proqramın bir neçə detalını qeyd etmək lazımdır. Diqqət yetirin ki, açarlardan gələn məlumatlar Port Genişləndiricidəki LED -lərə yazılmadan əvvəl tərsinə çevrilir. Diqqət yetirin ki, Port Genişləndiricisindəki giriş portlarının düzgün işləməsi üçün Yüksək olaraq yazılmalıdır. Bu məlumatlar PCA8574A məlumat vərəqində təsvir edilmişdir. Məlumat vərəqələrini həmişə diqqətlə oxuyun! Daha çox maraq doğuran şərtli ayıklama istifadə etməkdir. Proqram faylının başlanğıcına yaxın ifadəsi var # #DEBUG -ı təyin edin və kod boyunca səpilən #ifdef DEBUG ifadələridir. DEBUG təyin olunmadığı müddətcə (iki kəsik xətti şərhə çevirir və müəyyən edilməsinə mane olur), #ifdef -dən #endif ifadələrinə daxil olan kod tərtib edilməyəcək. Ancaq işlər gözlədiyiniz kimi işləmirsə, kodu yenidən yazın və #define DEBUG ilə şərh edin. Proqramınızın icrasını izləmək üçün kodunu aça biləcəyiniz LED -lərdə daha çox yanıb -sönəcək və işlərin nəyin səhv getdiyini tapmaqda sizə kömək edəcəksiniz. Əslində nə olduğunu görmək üçün bunu sınamağı məsləhət görürəm. Gördüyünüz budur ki, LED 2 (PD5 -də) proqramın icrası zamanı yanıb -sönəcək. Açarlardan oxunan dəyər, Port Genişləndirici LED -lərində görünməzdən əvvəl LED 1 -də (PD6) yanıb -sönəcək. Bu LED -lərdən istifadə edərək proqramı izləyə bilməlisiniz. Növbəti ATmega168 ilə işləyəcəyik; yalnız ATtiny2313 ilə maraqlanırsınızsa bu bölməni atlayın. Hələ mənimlə? Yaxşı. TWI_I2C qovluğuna keçin, iş kataloqunuzu IO_Port olaraq dəyişdirin və TWI_I2C_Port.c -ni tərtib edərək ATmega168 -ə yükləyin. SDA və SCL xətlərini ATtiny2313 -dən ayırın və ATmega168 -ə qoşun. Güc və zəmini bağlayın və gücə qoyun. Əməliyyat eyni olmalıdır! Həyəcan azalana qədər oynayın, sonra koda baxaq. TWI_I2C_Port.c açın. Kod, səhvlərin idarə edilməsi və kəsilən sürücülərin yerləşdirilməsi istisna olmaqla, demək olar ki, eynidır. Fərqlər budur: I2C avtobusunun düzgün işləməsi üçün saatın 4MHz -ə qurulması lazım olduğunu unutmayın. Sei (); ifadəsi, I2C sürücülərinin işə salınmasından sonra kəsilmələri açır. Səhvləri yoxlamaq üçün xüsusi bir status biti sınanır. Oxunarkən, oxunan məlumatları mesaj buferinə köçürmək üçün TWI_Read_Data_From_Buffer funksiyası çağırılmalıdır. Yazma zamanı, (TWI_Transceiver_Busy ()) səhvləri yoxlamadan əvvəl köçürmənin tamamlandığından əmin olmaq üçün istifadə edilməlidir. Bu son iki funksiya yuxarıda sürücülərin təsvirində təsvir edilmişdir. Bundan başqa, kod ATtiny2313 ilə demək olar ki eynidir. Bunu sınamaq istəyirsinizsə, DEBUG eyni şəkildə işləyir.

Addım 6: I2C Yaddaşından istifadə

I2C Yaddaşından istifadə
I2C Yaddaşından istifadə
I2C Yaddaşından istifadə
I2C Yaddaşından istifadə
I2C Yaddaşından istifadə
I2C Yaddaşından istifadə
I2C Yaddaşından istifadə
I2C Yaddaşından istifadə

I/O Port Genişləndiricisini oxumaq və yazmaq üçün I2C avtobusundan istifadə etməyi öyrəndikdən sonra, həm RAM, həm də EEPROM olan I2C yaddaşlarından istifadə etməyə davam edək. Əsas fərq, çoxlu baytların tək bir I2C əmri ilə xatirələrə oxunması və ya yazılmasıdır. Bu təcrübələrə hazırlaşmaq üçün aparatı bir az dəyişdirməliyik və çörək lövhəsində bir neçə yeni sxem qurmalıyıq. Bəzi yaddaş dəyərlərini göstərmək üçün istifadə edəcəyimiz üçün Port Genişləndirici sxemini saxlayın. PCA8574A -dan DIP açarlarını çıxarın və bu pinlərə yanıb -sönən işıqlar qoyun. Kifayət qədər yanıb -sönən işıqlarınız yoxdursa, P4 -dən P7 -dəkiləri P0 -dan P3 -ə keçirin. (Göstəriləcək dəyərlər kifayət qədər kiçikdir.) İndi sxematik I2C Ram.pdf -ə baxın və PCF8570 -ni çörək taxtasına bağlayın. Şəkilə də baxın. 7 pinini Vcc ilə bağladığınızdan əmin olun. PCA8574A -dan SDA və SCL üçün tellər çəkin. EEPROM ilə də maraqlanırsınızsa, bu dövrəni 24C16 üçün I2C EEPROM.pdf istifadə edərək qurun, ancaq nümunədə ATmega168 istifadə edildiyi barədə xəbərdar olun. Bu sxem həqiqətən sadədir. Yuxarıda müzakirə edildiyi kimi, ünvan bitləri nəzərə alınmamalıdır. Yalnız güc və zəmini bağlayın. RAM ilə təcrübəni bitirmədiyimiz üçün SDA və SCL -ni hələ bağlamayın, yaddaş təcrübələrimizi PCA8574A Port Genişləndiricisinə və PCF8570 Ram -a qoşulmuş ATtiny2313 ilə başlayacağıq. Proqram Ram -a bəzi nömrələr yazacaq, sonra onları oxuyacaq və Port Expander -də göstərəcək. USI_I2C_RAM.c tərtib etmək və yükləmək üçün make faylından istifadə edin. Qeyd edək ki, I2C sürücü faylları əvvəllər istifadə etdiyimiz fayllarla eynidir. Gücü bağlayın və LED 1 -də (PD6) bir dəfə yanıb -sönən görməli olursunuz. Məlumat ilk 4 bayt yaddaşa yazılacaq. Düyməni basın və iki bayt geri oxunacaq və göstəriləcək. Liman Genişləndiricisində (P0) bir LED işığı, iki saniyəlik fasilə, sonra iki LED işığı (P0 və P1) görməlisiniz. Başqa iki saniyəlik fasilə və LEDlər sönməlidir. Ardıcıllığı yenidən başlamaq üçün düyməni yenidən basın. Hata ayıklama yuxarıda təsvir edilən üsula bənzəyir. Koda nəzər salaq. USI_I2C_RAM.c açın. Əvvəlki koda çox bənzəyir. Əsas fərqlər oxuma və yazma yaddaşının detallarıdır. Mesaj buferinin həqiqətən yazan zəngdən əvvəl necə yükləndiyinə baxın. İlk bayt, oxu/yazma bitinin uyğun şəkildə qurulduğu kölə ünvanıdır. Ancaq növbəti bayt, məlumat yazmağa başlayacağımız yaddaş ünvanıdır. Sonra göstərdiyimiz ünvandan başlayaraq ardıcıl olaraq yaddaşa yüklənəcək faktiki məlumat baytları gəlir. Mesajın ölçüsünü 6 olaraq təyin edirik. Beləliklə, 00 ünvanından yazmağa başlayırıq və 01, 03, 02 və 06 dəyərlərini 00 -dan 03 -ə qədər olan yaddaş yerlərinə yazırıq. Veriləri yaddaşdan geri oxumaq üçün USI_TWI_Start_Random_Read funksiyasından istifadə etməliyik. Mesaj tamponu birinci baytda kölə ünvanını, ikinci baytdakı başlanğıc ünvanını alır. Daha sonra oxumaq üçün bayt sayına əlavə olaraq mesaj ölçüsü olan funksiyanı çağırın. 2 oxumaqdan asılı olmayaraq oxu/yazma bitinin heç bir əhəmiyyəti olmadığını unutmayın. Geri qaytarılmış məlumatlar mesaj tamponunda ikinci yerdə başlayacaq. Məlumatlar oxunduqdan sonra Liman Genişləndiricisində göstərilmək üçün tərsinə çevrilir və dəyərlər arasında fasilə ilə bir bayt yazılır. Nəhayət, Port Genişləndirici LEDləri söndürülür. Port Expander -ə yazılanlar əvvəlki nümunələrdə edilənlərlə eynidir. Əylənmək üçün #define DEBUG ifadəsini yuxarıdakı kimi şərh edə bilərsiniz və çox sayda yanıb -sönən LEDləri görə bilərsiniz. Başqa bir uğurlu təcrübədən sonra həyəcanla yuyulur, ATmega168 və EEPROM -a keçək. İş kataloqunuzu TWI I2C altında EEPROM olaraq dəyişdirin. TWI_I2C_EEPROM.c tərtib etmək və yükləmək üçün make faylını istifadə edin. Qeyd edək ki, I2C sürücü faylları əvvəllər PCA8574A üçün istifadə etdiyimiz fayllarla eynidir. Proqramı sınamaq üçün ATtiny2313 -ü ayırın və ATmega168 -ə qoşun. I2C avtobusunu Ram'a bağlayın və işə salın. Daha çox məlumat yazdığımız və oxuduğumuz üçün nəticələr fərqlidir. Başladıqda PD7 üzərindəki LED 1 yanıb -sönməlidir. Düyməni basın və məlumatlar yaddaşdan geri oxunacaq və göstəriləcək. PCA8574 üzərindəki LEDlər aşağıdakı ardıcıllıqla yanıb -sönməlidir: P1, P0 & P2, (hamısı sönmüş), P0 və P1, P1 və P2. Nəhayət Liman LED -lərinin hamısı sönməlidir. Bunu təkrar etmək üçün düyməni yenidən basın. Oh, amma gözləyin deyirsən. Bu proqram EEPROM üçün deyilmi? Eyni I2C ünvanında bir yaddaş cihazına daxil olduğumuz üçün eyni proqram həm Ram, həm də EEPROM üçün işləyir. SDA və SCL -ni Ramdan EEPROM -a endirin və proqramı yenidən işə salın. Tam olaraq eyni şəkildə işləməlidir. Qeyd edək ki, eyni ünvanı paylaşdıqları üçün EEPROM və Ram eyni vaxtda I2C avtobusuna qoşula bilməz. (Aranızdakı ağıllılar Ramdakı proqramlaşdırıla bilən ünvan bitlərini dəyişdirməyi düşünə bilər, amma bu hələ də işləməyəcək. 24C16, Ram üçün proqramlaşdırıla bilən bütün ünvan blokunu istifadə edir.) OK, bu son proqrama baxaq. TWI_I2C_EEPROM.c açın. Diqqət etməli olduğunuz ilk şey, tam 24C16 EEPROM -a necə müraciət edəcəyimi göstərdiyimdir. 8 fərqli I2C kölə ünvanda 256 baytlıq hissələrdə əldə edilə bilər. MEMORY_ADDR -in 50 hexadecimaldakı başlanğıc ünvanı olaraq necə təyin olunduğuna baxın; bu səbəbdən Ram işləyirdi. 24C16 -nın digər bloklarına daxil olmaq istəyirsinizsə, göstərdiyim kimi digər ünvanlardan istifadə edin. Yaddaşı yazmaq üçün necə qurduğuma baxın. Əvvəlcə tamponda oxu/yaz bit dəsti ilə kölə ünvanı, sonra başlanğıc ünvanı 00, sonra 16 bayt məlumat daxil edilir. TWI_Start_Read_Write funksiyası 18 (mesaj ölçüsü) olaraq verilənləri yazmaq üçün çağırılır (əvvəlki kimi). Düymə basıldıqda, məlumatları geri oxumaq üçün TWI_Start_Random_Read və TWI_Read_Data_From_Buffer istifadə edirik. Hər üçüncü bayt Port Expander LED -lərində göstərilir. Nəhayət, növbəti düyməni basmağı gözləmək üçün LEDlər söndürülür. Niyə 16 bayt yazmağı seçdiyimi düşünə bilərsiniz. Məlumat vərəqini diqqətlə oxusanız, daha çox bayt göndərilsə belə 24C16 -nın 16 bayt aldığı zaman bir yazma dövrü gördüyünü görəcəksiniz. Yəni istifadə etmək çox gözəl bir rəqəm kimi görünürdü. Bunu artırmağı seçsəniz, MESSAGEBUF_SIZE ölçüsünü dəyişdirməlisiniz. TWI_Master.h -də TWI_BUFFER_SIZE dəyərini də dəyişdirməlisiniz. Bunun səbəbi, sürücünün fasilə xidmət qaydasında istifadə etmək üçün məlumat buferindən məlumatları kopyalamasıdır. Təbrik edirik! Artıq öz layihələrinizdə I2C avtobusundan istifadə etməyə hazırsınız!

Addım 7: Veb mənbələri

Təcrübələr üçün istifadə olunan hissələr üçün məlumat cədvəlinə bağlantılar. Başqa bir şey əldə etməsəniz, bunları mütləq almalısınız. (URL -lərində kvadrat mötərizədən istifadə etməyi sevirlər, buna görə də bura düzgün daxil edə bilmirəm. Üzr istəyirik.) I2C sahəsinə daxil olmaq üçün Məhsullar siyahısından İnterfeys seçin. Onların I2C saytına daxil ola bilərsiniz və təklif etdikləri bütün məlumat cədvəllərinə və tətbiq qeydlərinə daxil olmaq. Xüsusilə I2C avtobus təsviri və texniki detallar burada. Atmel -dən ATtiny2313 və ATmega168 məlumat cədvəllərini (məlumat kitabları?) alın. Atmel tətbiq qeydləri burada. AVR310 və AVR315 -ə baxın. Kodu da götürün. Daha çox I2C məhsulları üçün buraya baxın.

Addım 8: Geeks üçün qeydlər

Detalları bilmək istəyən əsl geek üçün, Atmel Apps Qeydlərinə və sürücü koduna baxsanız, yadda saxlamalı olduğunuz bəzi şeylər var:- I2C cihazına müraciət etmək və əmr vermək üsulu spesifikasiyanın bir hissəsi deyil! Qul ünvanı və oxumaq/yazmaq bitindən başqa, əmrlər, rejimlər və s. Göstərilmir və müəyyən bir cihaza xasdır. Bunu çox aydın etmək üçün, Atmel nümunəsində istifadə olunan sxemin yalnız bu nümunəyə aid olduğunu və olduqca qeyri-standart olduğunu unutmayın.- USI tətbiqi TWI tətbiqindən bir neçə vacib cəhətdən fərqlənir. + USI ilə, saat proqram təminatı ilə təmin edilir; TWI ilə Bit Rate Generator tərəfindən təmin edilir. + USI metodu fasilələrdən istifadə etmir; TWI edir. Mega ailəsi (TWI istifadə edərək) bir çox başqa şeylər edə biləcəyi və I2C köçürmələri ilə əlaqələndirilməməsi lazım olduğu üçün bu, müəyyən məna kəsb edir. USI üçün fasiləyə əsaslanan bir versiya əlbəttə mümkündür, bu Təlimat kitabında tətbiq edilməmişdir. + USI aparatı I2C üçün optimallaşdırılmamışdır və yalnız 8 bit köçürmələri idarə edə bilir. Bu o deməkdir ki, doqquzuncu biti (NACK və ya ACK) göndərmək üçün iki köçürmə tələb olunur. TWI aparatı bunu avtomatik idarə edir. Bu, USI sürücüsünün tətbiqini bir az daha çətinləşdirir. + TWI üçün səhv aşkarlanması aparatda aparılır. USI, işləri bir qədər çətinləşdirən proqram təminatı ilə işləməyi tələb edir. + TWI aparatı birbaşa limanın konfiqurasiyasına nəzarət edir. USI aparatı, port istifadə edilməzdən əvvəl port bitlərinin konfiqurasiya edilməsini tələb edir. Bunu USI üçün Master_Initialize rutinində görəcəksiniz.-Atmel, I2C avtobus çəkmələri üçün AVR portu çəkmələrinin istifadə edilə biləcəyini iddia edir. Bu yanaşmanı işə salmağın yolunu düşünmədim. İki xarici rezistordan istifadə etmək olduqca sadə bir sxem kimi görünür, buna görə çox vaxt sərf etmədim.

Tövsiyə: