Агуулгын хүснэгт:

ATtiny болон ATmega -д зориулсан I2C автобус: 8 алхам
ATtiny болон ATmega -д зориулсан I2C автобус: 8 алхам

Видео: ATtiny болон ATmega -д зориулсан I2C автобус: 8 алхам

Видео: ATtiny болон ATmega -д зориулсан I2C автобус: 8 алхам
Видео: Revell 1/600 TOS Enterprise Build part 7c Arduino control 2024, Арваннэгдүгээр
Anonim
ATtiny болон ATmega -д зориулсан I2C автобус
ATtiny болон ATmega -д зориулсан I2C автобус

Би Atmel AVR микроконтроллерт дуртай! Энэхүү зааварт заасан Гетто хөгжүүлэх системийг бий болгосноос хойш би AVR ATtiny2313 болон ATmega168 -ийг туршиж үзээд хөгжилтэй байсангүй. Би унтраалгыг оролт болгон ашиглах талаар заавар бичих хүртэл явж, Ghetto Development System -ийн ойлголтыг CPLD болгон өргөжүүлсэн. Саяхны төсөлд хяналтын утгыг тохируулах хэд хэдэн унтраалга шаардлагатай болсон. AVR -д хангалттай оролтын/оролтын зүү байхгүй байсан тул би нэг зүйлийг бодох хэрэгтэй болсон. Би гар болон дэлгэцтэй оролтын системийг туршиж үзэх боломжтой байсан ч ATtiny2313 -ийн нөөц дуусах байсан. Аз болоход Атмел нь энгийн хоёр утастай интерфэйс бүхий нэмэлт чипс (санах ой эсвэл оролт гаралтын порт гэх мэт) -ийг холбох боломжтой интерфейсийг оруулснаар энэ асуудлыг шийдэх арга замыг санал болгов. Зөв, AVR дээр ердөө хоёр I/O зүү ашигласнаар бид олон нэмэлт оролт/гаралтын зүү болон бусад нөөцөд хандах боломжтой болно. Энэхүү хоёр утастай интерфэйсийг албан ёсоор Интертегрэйт хэлхээний автобус гэж нэрлэдэг бөгөөд зөвхөн I2C автобус гэж нэрлэдэг бөгөөд үүнийг Philips Semiconductors байхдаа NXP зохион бүтээсэн. Хэрэв та энэ зааврыг уншиж байгаа бол I2C автобусны талаар сонссон байж магадгүй, тэр ч байтугай үүнийг PIC эсвэл бусад микроконтроллер дээр ашиглаж байсан байх. Үзэл баримтлалын хувьд маш энгийн бөгөөд AVR -ийн техник хангамжийн эх үүсвэрээр дэмжигддэг боловч програм хангамжийн драйверууд I2C автобусыг ашиглах шаардлагатай хэвээр байна. Atmel нь Application Notes -ийг өгдөг (энэ зааврын дараагийн эх сурвалжийг үзнэ үү), гэхдээ эдгээр нь бүрэн бус бөгөөд өөр AVR төхөөрөмжтэй харилцахаас өөр жишээ харуулаагүй болно. AVRs. Үүний оронд би ATtiny2313 ба ATmega168 төхөөрөмжүүдийн Atmel драйверуудын өргөтгөсөн хувилбарыг өгөх болно, эдгээрийг ашиглахад тавигдах шаардлага, хязгаарлалтыг тайлбарлаж, I2C төхөөрөмжийн ажиллах жишээг танд үзүүлэх болно. Энэхүү зааварчилгааны дагуу ажилласны дараа та AVR төслүүддээ I2C автобусыг амжилттай ашиглах боломжтой болно. Мэдээжийн хэрэг, хэрэв та зөвхөн нэгийг нь сонирхож байгаа бол жижиг эсвэл 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.8K-аас 10K хооронд байж болно. Би 5.1K -ээр эхэлж, ажиллах хүртэл бага утгыг ашигладаг. Хэрэв та олон төхөөрөмжтэй эсвэл төхөөрөмжүүдийн хооронд урт утас байхгүй бол энэ нь ихэвчлэн асуудал биш юм. I2C автобусны нэрлэсэн өгөгдлийн хурд нь 100Кбит/сек байна. 400Кбит/сек, 1Мбит/сек ба түүнээс дээш хурдтай байх боломжтой боловч энэ зааварт жолооч нар дэмждэггүй. Бүх I2C төхөөрөмжүүд нь 100Кбит/сек хурдтай ажиллах бөгөөд ATtiny2313 ба ATmega168 тус бүр нь I2C автобусыг өөр өөрөөр хэрэгжүүлдэг. ATtiny2313 нь Universal Serial Interface (USI) тоног төхөөрөмжийг ашигладаг бөгөөд үүнийг SPI автобусанд ашиглаж болно. ATmega168 нь Two Wire Interface (TWI) гэгддэг I2C автобусанд зориулагдсан тусгай тоног төхөөрөмжтэй. Драйверуудыг бичсэний дараа эдгээр ялгаа нь хэрэглэгчдэд ил тод байдаг. Програм хангамжийн нэг чухал ялгаа нь: ATmega168 I2C драйвер нь тасалдалтай байдаг бол ATtiny2313 -ийн хувьд тийм биш юм. Энэ нь ATmega168 програм нь I2C өгөгдөл дамжуулахыг хүлээх шаардлагагүй, харин өөр шилжүүлгийг эхлүүлэхээс өмнө эсвэл унших үйл ажиллагаанаас өгөгдөл ирэх хүртэл хүлээх хэрэгтэй гэсэн үг юм. Дараах жишээ, хэлэлцүүлэг нь үүнийг тодорхой болгох ёстой. I2C хаяг нь 7 битийн урттай тул тус бүр нь өвөрмөц хаягтай бол 127 хүртэлх төхөөрөмж автобусанд суух боломжтой. Зураг дээр үзүүлсэн шиг энэхүү 7 битийн хаягийг зүүн тийш нь нэг битээр сольж, хамгийн бага ач холбогдол бүхий битийг тухайн төхөөрөмжийн унших, бичихийг тэмдэглэхэд ашигладаг. Тиймээс бүрэн боолын хаяг нь 8 битийн байт юм. Бодит хаягийг төхөөрөмжийн дотоод хэсэгт хэсэгчлэн тодорхойлдог бөгөөд үүнийг өөрчлөх боломжгүй (хамгийн чухал 4 бит), хэсэгчлэн төхөөрөмжийн зүүтэй холбож болох битүүдээр тодорхойлогддог (хамгийн бага ач холбогдолтой 3 бит), тохируулахын тулд өндөр эсвэл бага холбож болно. тодорхой хаяг. Төөрөгдөлтэй сонсогдож байгаа ч жишээ нь үүнийг тодорхой болгох болно. PCA8574A мэдээллийн хуудас нь I2C хаягийн хамгийн чухал дөрвөн бит нь үргэлж 0111 байх болно гэдгийг харуулж байна. Дараагийн гурван битийг AD0, AD1 ба AD2 зүү дээрх тохиргоонуудаар тодорхойлно. Эдгээр тээглүүрийг 0 эсвэл 1 -ийг илэрхийлэхийн тулд газардуулга эсвэл эерэг хүчдэлийн тэжээлд (5 вольт) холбож болно. Боломжит хаягийн хүрээ нь PCA8574 мэдээллийн хуудасны нөгөө зурагт үзүүлсэн шиг арван зургаатын 38 -аас 3F хүртэл байна. Тиймээс хаягийн битийн тохиргоог өөрчилснөөр I2C автобусанд 8 хүртэл PCA8574A хүртэл байх боломжтой. Хүн бүр зөвхөн өөрийн тодорхой боолын хаягаар хариу өгөх болно. Хэрэв илүү их оролт/гаралтын порт шаардлагатай бол PCA8574 -ийг ашиглаж болно. PCA8574 ба PCA8574A -ийн цорын ганц ялгаа нь PCA8574 -ийн I2C боол хаягийн хүрээ нь 20 -оос 27 хүртэлх арван зургаан талт хэмжээтэй байдаг. Зарим өгөгдлийн хуудсууд унших/бичих битийг төхөөрөмжийн нэг хэсэг гэж үздэг тул тухайн төхөөрөмжийн хаягийг тодорхойлох нь ойлгомжгүй байдаг. хаяг. Мэдээллийн хуудсыг анхааралтай уншиж, боолын хаяг 7 битийн урттай байх болно гэдгийг санаарай. Унших/бичих битийг тусад нь авч үзэх ёстой. Дахин хэлэхэд жишээ нь туслах болно. Бидний туршиж үзэх 24C16 EEPROM -ийн мэдээллийн хуудсанд боолын хаягийн эхний (хамгийн чухал) дөрвөн бит нь 1010 байна. Дараагийн гурван битийг A0, A1, A2; Гэхдээ мэдээллийн хуудас нь жижиг хэмжээтэй EEPROMs болох 24C01 -ээс 24C08 хүртэл хамаарч байгааг анхаарна уу. Өгөгдлийн хүснэгтээс авсан зураг нь хэмжээ нэмэгдэх тусам эдгээр хаягийн битийн тохиргоог үл тоомсорлож, 24C16 -ийн хувьд огт үл тоомсорлож байгааг харуулж байна. Өөрөөр хэлбэл, сүүлийн гурван бит нь хамаагүй бөгөөд 24C16 нь бүх I2C боол хаягийг 50 -аас 57 арван зургаатын хооронд ашигладаг. Боол хаягийн хүрээ нь үнэндээ 24C16 -ийн өөр өөр хэсгүүдийг авч үзэх болно. Эхний 256 байт нь 50h хаяг дээр, дараагийн 256 нь 51h дээр байгаа бөгөөд сүүлийн 256 хүртэл 57h дээр нийт 2K байт байна. Бидний туршиж үзсэн PCF8570 RAM -ийн хаяг энэ мужид байгаа тул 24C16 болон PCF8570 -ийг хамт ашиглах боломжгүй.

Алхам 2: Зарим I2C төхөөрөмжүүдийг захиалаарай

Та I2C Bus -ийн талаар бага зэрэг мэдэж байгаа бөгөөд үүнийг ашиглахыг хүсч байгаа тул програм хангамжийг бэлдэж байх хооронд зарим I2C төхөөрөмжүүдийг туршиж үзээд захиалж болохгүй гэж үү? Тохирох төхөөрөмжүүд нь I/ O Interface Expander (миний дуртай), статик хуц, EEPROM. Өөр олон зүйл бий, гэхдээ энэ бол гайхалтай эхлэл юм. Бидний ашиглах AVR процессор бол ATtiny2313 ба Atmega168 (Arduino -д ашиглагддаг) юм. Хэрэв та эдгээрийг шинээр мэдэрч байгаа бол тэдний талаар сурч, Геттогийн хөгжлийн системийг бий болгохын тулд энэхүү агуу зааварчилгааг үзээрэй. Энэхүү зааварт заасан ATmega168 -ийн схем нь энэхүү процессорын Ghetto Development System -ийг хэрхэн хэрэгжүүлэхийг харуулж байна. Зэрэгцээ порт кабель нь ATtiny2313 кабельтай ижил байна. (Би Ghetto Development System -ийн USB хувилбарыг туршиж үзээгүй болохоор I2C автобусанд хэрхэн нэвтэрч байгааг сайн мэдэхгүй байна. Arduino -ийн хувьд ч мөн адил.) Digigey хэсгийн дугаарууд энд байна. Порт өргөтгөгч: 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 -ийн 1MHz (үндсэн хурд) цагийн хурдтай байхаар бүтээгдсэн болно. Хэрэв та өөр үнээр ажиллахыг хүсч байвал драйверуудын тогтмол байдлыг тохируулах шаардлагатай болно. Хэрэв танд үүнийг хийхэд тусламж хэрэгтэй бол надад имэйл бичээрэй. Та мөн Resources Step дээрх холбоосууд дахь Atmel програмуудын тэмдэглэлээс зарим зөвлөмжийг авах боломжтой. Хөтөлбөр эхлэхэд нэг удаа залгаарай. Энэ нь хүчин төгөлдөр бус байдлыг буцааж өгдөг бөгөөд ямар ч аргумент байхгүй болно. Энэ функц нь зөвхөн алдааны кодыг буцаадаг тул би алдааны LED -ийг асаахын тулд 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 алхам байдаг.1) Боол хаяг болон өгөгдлийн байтыг илгээх эсвэл хүлээн авахын тулд програмынхаа зурвас буферыг зарлана. гарын үсэггүй char messageBuf (MESSAGEBUF_SIZE); 2) Боолын хаягийг буферт эхний байт болгон оруулна уу. Үүнийг нэг жаахан зүүн тийш, OR унших/бичих хэсэгт шилжүүлээрэй. Унших/бичих бит нь уншихад 1, бичихэд 0 байх болно гэдгийг анхаарна уу. Энэ жишээ нь Уншихад зориулагдсан болно. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (ҮНЭН << TWI_READ_BIT); 3) Бичлэг хийхдээ байтыг буфер доторх дараагийн байршилд бичнэ үү. Алдаа гарсан эсэхийг шалгахын тулд буцаасан утгыг (энэ тохиолдолд температурыг) шалгаж болно. Хэрэв тийм бол үүнийг дээр дурдсанчлан зохицуулна. Програмын жишээнүүдийг үзнэ үү 6) Хэрэв уншихыг хүссэн бол байтыг унших нь буферын хоёр дахь байрлалд байх болно. Хэрэв олон байт бичих шаардлагатай бол (санах ойн төхөөрөмж гэх мэт) ижил горимыг ашиглаж болно. Буферийг тохируулах, горимыг дуудах нь арай өөр юм. Буферийн хоёр дахь байт нь бичих санах ойн хаяг байх болно. Бичих өгөгдөл нь дараагийн байтаар бичигдэнэ. Зурвасын хэмжээ нь хүчинтэй бүх өгөгдлийг багтаасан хэмжээтэй байх болно. Хэрэв 6 байт бичих шаардлагатай бол зурвасын хэмжээ 8 байх болно (боол хаяг + санах ойн хаяг + 6 байт өгөгдөл) ямар нэгэн дурсамж. Унших/бичих битийн тохиргоо нь хамаагүй, энэ горимыг ашиглах нь өмнөх горимтой маш төстэй юм. Энэ горимыг дуудах нь унших үйлдлийг үргэлж өдөөх болно. Зурвасын хэмжээ нь 2 байт байх ёстой бөгөөд хэрэв алдаа гараагүй бол өгөгдөл хоёр дахь байрлалаас эхлэн буфер дотор байх болно. ATmega168: Цагны шаардлага: драйверууд нь ATmega168 -ийн 4 МГц давтамжтай ажиллах зориулалттай. Жишээ код нь энэ цагийн хурдыг хэрхэн тохируулахыг харуулж байна. Хэрэв та өөр үнээр ажиллахыг хүсч байвал драйверуудын тогтмол байдлыг тохируулах шаардлагатай болно. TWI_Master_Initialise () Энэ функц нь I2C горимд ажиллах TWI техник хангамжийг эхлүүлдэг. Хөтөлбөр эхлэхэд нэг удаа залгаарай. Энэ нь хүчин төгөлдөр бус байдлыг буцааж өгдөг бөгөөд ямар ч маргаан байхгүй болно. Эхлүүлсний дараа swi () руу залгаж тасалдлыг идэвхжүүлэхээ мартуузай. TWI_Get_State_Info () Энэ функц нь I2C алдааны мэдээллийг буцаах бөгөөд I2C гүйлгээний явцад алдаа гарсан тохиолдолд ашиглагддаг. Энэ функц нь зөвхөн алдааны кодыг буцааж өгдөг тул би алдааны LED -г асаахын тулд TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) функцийг ашигладаг. Алдааны кодыг TWI_Master.h дээр тодорхойлсон боловч алдааны LED дээр дохио өгөх зорилгоор өөрчилсөн болно. Дэлгэрэнгүй мэдээллийг жишээ кодоос үзнэ үү. Үүнийг хэрхэн яаж дуудах вэ: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) I2C гүйлгээ дууссан эсэхийг шалгах (доор тайлбарласан функц), дараа нь дэлхийн статус үгэнд жаахан турших замаар алдааны шалгалт хийгддэг болохыг анхаарна уу. Хоёр функц нь дээр дурдсан харгалзах функцүүдтэй адил ажилладаг боловч хэд хэдэн үл хамаарах зүйлүүд байдаг. Тэд алдааны утгыг буцаадаггүй, өгөгдлийг унших нь буферт шилждэггүй. Үүнийг TWI_Start_Random_Read руу залгахдаа messageSize нь хүссэн өгөгдлийн байтын тоо хоёр биш нэг байх ёстой. Өөрөөр хэлбэл, 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 (эргэн тойронд нь том тасархай хайрцагтай) харуулав. Порт Expander хэлхээг талхны самбар дээр барьсан. Эдгээр зургууд хэрхэн харагдахыг харахын тулд гэрэл зургуудыг үзээрэй. Схемийн ATtiny2313 хэсэг нь гурван анивчсан гэрэл (LED1, 2, 3, дээр нь R4, 5, 6) бүхий Ghetto Хөгжлийн Систем бөгөөд түүн дээр холбогдсон товчлуур (S1) юм. нэмэлт дэлгэрэнгүй. Энэхүү дэлгэрэнгүй мэдээлэл нь I2C автобус SCL ба SDA шугамыг холбохын тулд арилгаж болох холбогч (JP4, 5, 6) юм. Үсрэгчид програмчлах зориулалттай байх ёстой бөгөөд дараа нь SCL болон SDA -ийг холбох боломжтой болно. Гэрэл зургууд нь үсрэгчдийг байрлуулж, салгасныг харуулж байна. Эдгээр үсрэгчийг байрлуулах нь зөвхөн та өөрөө шийдэх болно, хэрэв та I2C автобусыг ашиглахыг хүсвэл Ghetto Development System дээрээ тавих хэрэгтэй. I2C автобусыг салгаж, холбогчийг програмчлалд оруулах ёстой. I2C автобусны хувьд та зөвхөн JP4 болон JP6 -тай холбоотой байх хэрэгтэй гэдгийг анхаарна уу. Хэрэв та SPI автобусыг ашиглахыг хүсч байна гэж бодож байвал JP5 -ийг оруулна уу. Vcc (+5 вольт) ба Gnd (газардуулга) холболтуудыг хийж, AD0, 1, 2 -ыг газардуу холбоно (I2C боолын хаягийг 38 hex болгодог). Дараа нь 4 гэрэл, 4 DIP унтраалга холбоно уу. (Хэрэв танд DIP унтраалга байхгүй бол та зүгээр л утас ашиглаж болно. Сигналыг асаах, унтраахын тулд газар дээр нь уяж эсвэл хөвж яваарай.) Эцэст нь SDA ба SCL-ээс татах эсэргүүцлийг (R11 ба 12) Vcc руу холбоно уу. Эдгээрийг 3.3K хэлбэрээр харуулсан боловч 1.8K -аас 5.1K хүртэлх утга нь ажиллах ёстой (магадгүй 10K хүртэл байж магадгүй, гэхдээ би үүнийг туршиж үзээгүй). ATtiny2313 -ийг програмчилсны дараа та холбогчийг салгаж, SDA ба SCL -ийг холбож туршиж үзэх боломжтой. Энд байгаа цорын ганц үрчлээ нь та энэ процессорт зориулж Гетто хөгжүүлэх системийг бүтээгээгүй байж магадгүй юм. Хэрэв тийм бол миний өгсөн схем (MEGA I2C.pdf) хэрхэн хийхийг танд харуулах болно. Энэ бол зүгээр л ATtiny2313 хувилбарын орлуулалт юм. Хэрэв та урьдчилан төлөвлөж байгаа бол програмчлалын кабель нь хоёр системд тохирох эсэхийг шалгаарай. Гол ялгаа нь C2 ба C3 -ийн нэмэлт юм. Эдгээрийг байрлуулахын тулд зургийг үзнэ үү, тэд чиптэй маш ойрхон байх ёстой; Тэдний нэг нь үнэндээ чипний доор байна. Эдгээр нь дуу чимээг аналогиас тоон хөрвүүлэгч рүү оруулахгүй байхад тусалдаг. Хэрэв та энэ чип дээрх I2C автобусанд шаардлагагүй тул SPI автобусыг ашиглахаар төлөвлөөгүй бол холбогчийг оруулах шаардлагагүй болно. 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 порт дээрх LED 1 нь хоёр удаа анивчих бөгөөд та (S1) товчлуурыг дарах хүртэл өөр юу ч болохгүй. Товчлуур дарагдах бүрт унтраалгыг уншиж, тэдгээрийн тохиргоог PCA8574A -д холбогдсон LED дээр харуулах болно. Шилжүүлэгчдийн утгыг өөрчилж, товчлуурыг дарахад LED нь өөрчлөгдөх ёстой. Ажиллаж байгааг хараад сэтгэл догдлом гартал үүнийг хий. Хэрэв (Бурхан хориглосон!) Бүх зүйл санаснаар болохгүй бол утсаа сайтар шалгаж үзээрэй. I2C алдааг LED3 (PD4) дээр анивчих замаар дохио өгөх бөгөөд энэ нь SDA болон SCL -ийг зөв тээглүүртэй холбосон эсэхийг шалгах хэрэгтэй гэсэн үг юм. Хэрэв ямар нэгэн зүйл ажиллахгүй хэвээр байгаа бол дибаг хийх талаар энэ хэсгийн үлдсэн хэсгийг уншаад одоо буцаж очоод кодыг харцгаая. USI_I2C_Port.c файлыг нээнэ үү. Энэ бол жишээ програмын код юм. (USI_TWI_Master.c ба USI_TWI_Master.h драйверуудыг агуулдаг - хэрэв та сонирхоогүй бол тэдгээрийг үл тоомсорлож болно.) Өөрийнхөө I2C програмыг удирдан чиглүүлэхийн тулд энэ програмыг ашиглаарай. боолын хаяг болон бусад мессежийн буферийг дээшлүүлж, үүнээс өгөгдлийг авах. Та мөн миний товчлуурыг хэрхэн тайлж, while гогцоог тохируулахыг харах болно. Хөтөлбөрийн талаар хэд хэдэн нарийн ширийн зүйлийг дурдах хэрэгтэй. Порт Expander дээрх LED -д бичихээс өмнө унтраалгын өгөгдлийг урвуу байрлуулна гэдгийг анхаарна уу. Порт Expander дээрх оролтын портууд зөв ажиллахын тулд Өндөр гэж бичигдсэн байх ёстойг анхаарна уу. Эдгээр мэдээллийг PCA8574A мэдээллийн хуудсан дээр тайлбарласан болно. Мэдээллийн хуудсыг үргэлж анхааралтай уншаарай! Нөхцөлт дибаг хийх нь илүү их анхаарал татаж байна. Хөтөлбөрийн файлын эхлэлийн ойролцоо мэдэгдэл // #DEBUG -г тодорхойлох бөгөөд #ifdef DEBUG мэдэгдэл бүхий кодоор цацагдана. DEBUG тодорхойлогдоогүй л бол (хоёр ташуу зураас нь мөрийг тайлбар болгож, түүнийг тодорхойлохоос сэргийлдэг) бол #ifdef -ээс #endif -ийн доторх кодыг нэгтгэхгүй. Гэхдээ хэрэв бүх зүйл таны хүссэнээр болохгүй бол кодыг хөрвүүлээд #define DEBUG -ийг тайлбарлаагүйгээр дахин ачаална уу. Та програмынхаа гүйцэтгэлийг дагахын тулд декодлох боломжтой LED -ууд дээр илүү олон удаа анивчих болно. Үнэндээ юу болохыг харахын тулд үүнийг туршиж үзэхийг танд зөвлөж байна. Хөтөлбөрийг гүйцэтгэх явцад LED 2 (PD5 дээр) анивчих болно. Шилжүүлэгчээс уншсан утга нь порт 1 өргөтгөлийн LED дээр харагдахаас өмнө LED 1 (PD6) дээр анивчих болно. Та эдгээр LED -ийг ашиглан програмыг ажиллуулах явцыг хянах боломжтой байх ёстой. Дараа нь бид ATmega168 -тай ажиллах болно; Хэрэв та зөвхөн ATtiny2313 -ийг сонирхож байвал энэ хэсгийг алгасаарай. Надтай хамт байгаа юу? Сайн байна. TWI_I2C фолдер руу зөөж, ажлын лавлахаа IO_Port болгон өөрчилж, TWI_I2C_Port.c -ийг хөрвүүлж ATmega168 -д ачаална уу. SDA ба SCL шугамыг ATtiny2313 -аас салгаад ATmega168 руу холбоно уу. Эрчим хүч, газардуулаад залгаарай. Үйл ажиллагаа ижил байх ёстой! Сэтгэл хөдлөл арилах хүртэл тоглож, кодыг харцгаая. TWI_I2C_Port.c -ийг нээнэ үү. Алдаа засварлах, тасалдсан жолооч нарыг байрлуулахаас бусад тохиолдолд код нь бараг ижил байдаг. Ялгаа нь энд байна: I2C автобус зөв ажиллахын тулд цагийг 4MHz болгож тохируулах ёстойг анхаарна уу. Сэй (); I2C драйверуудыг эхлүүлсний дараа мэдэгдэл нь тасалдлыг асаадаг. Алдаа байгаа эсэхийг шалгахын тулд тодорхой статусын битийг шалгадаг. Унших явцад уншсан өгөгдлийг зурвасын буфер руу шилжүүлэхийн тулд TWI_Read_Data_From_Buffer функцийг дуудах ёстой. Алдааг шалгахаас өмнө дамжуулалт дууссан эсэхийг шалгахын тулд бичих явцад (TWI_Transceiver_Busy ()) ашиглах ёстой. Эдгээр сүүлийн хоёр функцийг драйверуудын тайлбар дээр тайлбарласан болно. Үүнээс гадна код нь ATtiny2313 -тай бараг адилхан юм. Хэрэв та үүнийг туршиж үзэхийг хүсч байвал DEBUG мөн адил ажилладаг.

Алхам 6: I2C санах ойг ашиглах

I2C санах ойг ашиглах
I2C санах ойг ашиглах
I2C санах ойг ашиглах
I2C санах ойг ашиглах
I2C санах ойг ашиглах
I2C санах ойг ашиглах
I2C санах ойг ашиглах
I2C санах ойг ашиглах

I2C автобус ашиглан I/O Port Expander -ийг уншиж, бичиж сурч мэдсэн бол I2C санах ойг RAM, EEPROM хоёуланг нь ашиглахаар явцгаая. Гол ялгаа нь олон байтыг нэг I2C командыг ашиглан санах ойд унших эсвэл бичих боломжтой юм. Эдгээр туршилтанд бэлэн байхын тулд бид тоног төхөөрөмжийг бага зэрэг өөрчилж, талхны самбар дээр хэд хэдэн шинэ хэлхээ бий болгох хэрэгтэй. Порт Expander хэлхээг хадгалж байгаарай, учир нь бид үүнийг санах ойн зарим утгыг харуулахын тулд ашиглах болно. PCA8574A -аас DIP унтраалгыг салгаад тэдгээр тээглүүр дээр анивчсан гэрэл тавь. Хэрэв танд хангалттай гэрэл анивчих гэрэл байхгүй бол P4 -ээс P7 хүртэлх гэрлийг P0 -ээс P3 руу шилжүүлээрэй. (Харуулах утгууд нь хангалттай бага байна.) I2C Ram.pdf схемийг үзээд талбар дээрх PCF8570 -ийг холбоно уу. Зургийг бас үзээрэй. 7 -р зүүг Vcc -тэй холбохоо мартуузай. PCA8574A -аас SDA ба SCL -ийн утсыг ажиллуулна уу. Хэрэв та EEPROM-ийг сонирхож байгаа бол 24C16-ийн I2C EEPROM.pdf програмыг ашиглана уу, гэхдээ жишээ нь ATmega168-ийг ашигладаг гэдгийг анхааруулаарай. Энэ хэлхээ нь үнэхээр энгийн. Дээр дурдсанчлан хаягийн битүүдийг үл тоомсорлох ёстой. Зүгээр л хүчдэл, газардуул. RAM -ийг туршиж дуусаагүй байгаа тул SDA болон SCL -ийг бүү холбоорой, бид санах ойн туршилтаа PCA8574A Port Expander болон PCF8570 Ram -д холбогдсон ATtiny2313 ашиглан эхлүүлэх болно. Програм нь Рам руу хэдэн тоо бичээд дараа нь уншиж, порт Expander дээр харуулна. USI I2C -ийн дагуу ажлын лавлахаа RAM болгон өөрчилнө үү. USI_I2C_RAM.c -ийг эмхэтгэн татаж авахын тулд make файлыг ашиглана уу. I2C драйвер файлууд нь бидний өмнө ашиглаж байсан файлуудтай ижил болохыг анхаарна уу. Цахилгаан тэжээлээ залгаарай, та LED 1 (PD6) дээр ганц удаа анивчихыг харах болно. Өгөгдлийг санах ойн эхний 4 байт руу бичих болно. Товчлуурыг дарахад хоёр байтыг буцааж уншиж харуулна. Та Port Expander (P0) дээр нэг LED гэрэл, хоёр секундын завсарлага, дараа нь хоёр LED гэрэл (P0 ба P1) харах ёстой. Өөр хоёр секундын завсарлага аваад LED нь унтрах ёстой. Дарааллыг дахин эхлүүлэхийн тулд товчлуурыг дахин дарна уу. Дебаг хийх нь дээр дурдсан аргын адил юм. Кодыг авч үзье. USI_I2C_RAM.c -ийг нээнэ үү. Энэ нь өмнөх кодтой нэлээд төстэй байх ёстой. Гол ялгаа нь санах ойг унших, бичих нарийн ширийн зүйл юм. Дуудлага хийхээс өмнө зурвас буфер хэрхэн ачаалагдаж байгааг хараарай. Эхний байт нь унших/бичих битийг зохих ёсоор тохируулсан боолын хаяг юм. Гэхдээ дараагийн байт нь өгөгдөл бичиж эхлэх санах ойн хаяг юм. Дараа нь бидний заасан хаягаас эхлэн санах ойд дараалан ачаалагдах бодит өгөгдлийн байт ирдэг. Бид зурвасын хэмжээг 6 гэж тодорхойлдог. Тиймээс бид 00 хаягаар бичиж эхэлж, 00, 03 хүртэлх санах ойн байршилд 01, 03, 02, 06 гэсэн утгуудыг бичдэг. Өгөгдлийг санах ойгоос уншихын тулд USI_TWI_Start_Random_Read функцийг ашиглах ёстой. Зурвасын буфер нь боолын хаягийг эхний байт, хоёр дахь байтаар эхлэх хаягийг авдаг. Дараа нь унших байтын тоог нэмэхийн тулд зурвасын хэмжээг тохируулсан функцийг дуудаарай. Унших нь үл хамааран хийгдэх тул унших/бичих бит хамаагүй гэдгийг анхаарна уу. Буцаагдсан өгөгдөл нь зурвасын буфер дахь хоёр дахь байрлалаас эхэлнэ. Өгөгдлийг уншсаны дараа үүнийг боомтын өргөтгөл дээр харуулахын тулд урвуу байрлуулж, утгуудын хооронд түр зогсолт хийж нэг байтаар бичнэ. Эцэст нь Port Expander LED -ийг унтраадаг. Порт Expander -д бичсэн захидал нь өмнөх жишээн дээр бичсэнтэй ижил байна. Хөгжилтэй байхын тулд та #define DEBUG мэдэгдлийг дээр дурдсан байдлаар тайлбарлаж, олон тооны анивчсан LED -ийг харж болно. Өөр нэг амжилттай туршилтын дараа сэтгэл догдолж, ATmega168 болон EEPROM руу шилжицгээе. Ажлын лавлахаа TWI I2C дор EEPROM болгон өөрчилнө үү. TWI_I2C_EEPROM.c -ийг эмхэтгэн татаж авахын тулд make файлыг ашиглана уу. I2C драйвер файлууд нь өмнө нь PCA8574A -д ашиглаж байсан файлуудтай адилхан болохыг анхаарна уу. Програмыг туршихын тулд ATtiny2313 -ийг салгаад ATmega168 -ийг холбоно уу. I2C автобусыг Рам руу залгаад орхи. Бид илүү их мэдээлэл бичиж, уншиж байгаа болохоор үр дүн нь өөр байна. PD7 дээрх LED 1 эхлэх үед анивчих ёстой. Товчлуурыг дарахад өгөгдлийг санах ойгоос буцааж уншиж, харуулах болно. PCA8574 дээрх LED нь дараах дарааллыг анивчих ёстой: P1, P0 & P2, (бүгд унтраалттай), P0 & P1, P1 ба P2. Эцэст нь Порт LED нь бүгд унтрах ёстой. Үүнийг давтахын тулд товчлуурыг дахин дарна уу. Энэ програм нь EEPROM -д зориулагдсан юм биш үү? Бид санах ойн төхөөрөмжид нэг I2C хаягаар хандаж байгаа тул ижил програм нь Ram болон EEPROM -ийн аль алинд нь ажилладаг. SDA болон SCL -ийг унтраагаад Ram -ээс EEPROM руу шилжүүлээд програмыг дахин ажиллуулна уу. Энэ нь яг адилхан ажиллах ёстой. EEPROM болон Ram нь ижил хаягтай тул I2C автобусанд нэгэн зэрэг холбогдох боломжгүй болохыг анхаарна уу. (Таны ухаалаг хүмүүс Ram дээр програмчлагдах хаягийн битүүдийг өөрчлөх талаар бодож магадгүй, гэхдээ энэ нь ажиллахгүй хэвээр байна. 24C16 нь Ram -д зориулж програмчилж болох бүх хаягийн блокыг ашигладаг.) За, энэ сүүлийн програмыг авч үзье.. 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 -ийг ашигладаг. Гурав дахь байт бүр Port Expander LED дээр харагдана. Эцэст нь LED товчлуурыг дарахад дараагийн товчлуурыг хүлээнэ үү. Би яагаад 16 байт бичихээр сонгосон юм бол гэж та гайхаж магадгүй юм. Хэрэв та өгөгдлийн хүснэгтийг анхааралтай уншвал 24C16 нь илүү их байт илгээсэн байсан ч гэсэн 16 байт хүлээн авах бүрт бичих цикл хийдэг болохыг харах болно. Тиймээс энэ нь ашиглахад тохиромжтой дугаар шиг санагдсан. Хэрэв та үүнийг нэмэгдүүлэхээр шийдсэн бол MESSAGEBUF_SIZE хэмжээг өөрчлөх шаардлагатай болно. Та TWI_Master.h дээрх TWI_BUFFER_SIZE утгыг өөрчлөх шаардлагатай болно. Учир нь драйвер нь тасалдлын үйлчилгээний горимд ашиглахын тулд мессежийн буфераас өгөгдлийг хуулж авдаг. Баяр хүргэе! Та I2C автобусыг өөрийн төсөлд ашиглахад бэлэн боллоо!

Алхам 7: Вэб нөөц

Туршилтанд ашигласан хэсгүүдийн мэдээллийн хүснэгтийн холбоосыг энд оруулав. Хэрэв та өөр юу ч авахгүй бол эдгээрийг заавал авах ёстой. (Тэд URL хаяандаа дөрвөлжин хаалт ашиглах дуртай байдаг, тиймээс би тэдгээрийг энд зөв оруулж чадахгүй байна. Уучлаарай.) I2C хэсэгт орохын тулд Бүтээгдэхүүний жагсаалтаас Interface -ийг сонгоно уу. Та тэдний I2C сайт руу орох боломжтой болно. I2C автобусны тодорхойлолт, техникийн дэлгэрэнгүй мэдээллийг эндээс авах боломжтой. Atmel -аас ATtiny2313 ба ATmega168 мэдээллийн хуудсыг (өгөгдлийн ном?) эндээс авна уу. Atmel програмын тэмдэглэлийг эндээс үзнэ үү. I2C -ийн бусад зүйлсийг эндээс үзээрэй.

Алхам 8: Geeks -д зориулсан тэмдэглэл

Дэлгэрэнгүй мэдээллийг мэдэхийг хүсч буй жинхэнэ геек хүний хувьд, хэрэв та Atmel Apps Notes болон драйверын кодыг харвал дараах зүйлсийг анхаарах хэрэгтэй:- I2C төхөөрөмжид хандах, комманд өгөх арга нь техникийн үзүүлэлтүүдийн нэг хэсэг биш юм! Боол хаяг болон унших/бичих битээс бусад тушаал, горим гэх мэтийг тодорхой заагаагүй бөгөөд тухайн төхөөрөмжид зориулагдсан болно. Үүнийг маш тодорхой болгохын тулд Атмелийн жишээнд ашигласан схем нь зөвхөн энэ жишээнд хамааралтай бөгөөд стандарт бус байдлаар хийгдсэн болохыг анхаарна уу. + USI -ийн тусламжтайгаар цагийг програм хангамжаар хангадаг; TWI -ийн тусламжтайгаар үүнийг Bit Rate Generator өгдөг. + USI арга нь тасалдал ашигладаггүй; TWI хийдэг. Mega гэр бүл (TWI ашигладаг) бусад олон зүйлийг хийж болох тул I2C дамжуулалтаар дамжуулж болохгүй. USI -ийн тасалдалтай хувилбар нь мэдээж боломжтой бөгөөд энэ зааварт үүнийг хэрэгжүүлээгүй болно. + USI техник хангамж нь I2C -д оновчтой биш бөгөөд зөвхөн 8 битийн дамжуулалтыг зохицуулж чаддаг. Энэ нь ес дэх битийг (NACK эсвэл ACK аль аль нь) илгээхэд хоёр дамжуулалт шаардлагатай гэсэн үг юм. TWI тоног төхөөрөмж үүнийг автоматаар зохицуулдаг. Энэ нь USI драйверын хэрэгжилтийг арай илүү төвөгтэй болгодог. + TWI -ийн алдааг илрүүлэх ажлыг техник хангамжид хийдэг. USI нь зарим зүйлийг төвөгтэй болгодог програм хангамжтай ажиллах шаардлагатай байдаг. + TWI техник хангамж нь портын тохиргоог шууд хянадаг. USI техник хангамж нь портыг ашиглахаас өмнө портын битүүдийг тохируулахыг шаарддаг. Та үүнийг USI-ийн Master_Initialize горимоос харах болно.-Atmel нь I2C автобусыг татахын тулд AVR портыг татах боломжтой гэж мэдэгджээ. Энэ хандлагыг ажил хэрэг болгох арга замыг би олоогүй байна. Хоёр гадаад резистор ашиглах нь маш энгийн схем мэт санагддаг тул би үүнд тийм ч их цаг зарцуулаагүй.

Зөвлөмж болгож буй: