Բովանդակություն:

I2C ավտոբուս ATtiny- ի և ATmega- ի համար. 8 քայլ
I2C ավտոբուս ATtiny- ի և ATmega- ի համար. 8 քայլ

Video: I2C ավտոբուս ATtiny- ի և ATmega- ի համար. 8 քայլ

Video: I2C ավտոբուս ATtiny- ի և ATmega- ի համար. 8 քայլ
Video: LDmicro 11: Serial LCD Temperature Controller (Microcontroller PLC Ladder Programming with LDmicro) 2024, Հուլիսի
Anonim
I2C ավտոբուս ATtiny- ի և ATmega- ի համար
I2C ավտոբուս ATtiny- ի և ATmega- ի համար

Ես սիրում եմ Atmel AVR միկրոկոնտրոլերները: Այս հրահանգում նկարագրված Ghetto Development System- ի ստեղծումից ի վեր, ես զվարճալի ավարտ չեմ ունեցել AVR ATtiny2313 և մասնավորապես ATmega168 փորձարկումների ժամանակ: Ես նույնիսկ այնքան հեռու գնացի, որ անջատիչներ որպես մուտքեր օգտագործելու վերաբերյալ հրահանգ գրեցի, և ընդլայնեցի Ghetto Development System- ի հայեցակարգը CPLD- ներին: Վերջերս կատարված նախագծի ընթացքում ինձ անհրաժեշտ էին մի քանի անջատիչներ `կառավարման արժեքներ սահմանելու համար: AVR- ները չունեին բավարար I/O կապում, այնպես որ ես ստիպված էի ինչ -որ բան մտածել: Ես կարող էի փորձել ստեղնաշարով և դիսփլեյով մուտքի բարդ համակարգ, բայց ATtiny2313- ը ռեսուրսներ չէր ունենա: Բարեբախտաբար, Atmel- ը այս խնդրի շուրջ միջոց է գտել `ներառելով ինտերֆեյս, որը կարող է կապել լրացուցիչ չիպերի (օրինակ` հիշողության կամ մուտքի/ելքի նավահանգիստների) պարզ երկալար ինտերֆեյսով: Rightիշտ է, օգտագործելով AVR- ի ընդամենը երկու մուտքի/ելքային կապ, մենք կարող ենք մուտք գործել բազմաթիվ լրացուցիչ մուտքի/ելքային կապեր, ինչպես նաև այլ ռեսուրսներ: Այս երկու մետաղալար ինտերֆեյսը պաշտոնապես հայտնի է որպես Ինտեգրված շղթայի ավտոբուս, կամ պարզապես I2C ավտոբուս և ստեղծվել է NXP- ի կողմից, երբ այն դեռ Philips կիսահաղորդիչներ էր: Եթե կարդում եք այս Instructable- ը, ապա հավանաբար լսել եք I2C ավտոբուսի մասին և գուցե նույնիսկ օգտագործել եք այն PIC- ի կամ այլ միկրոկոնտրոլերի վրա: Թեև հայեցակարգային առումով շատ պարզ է և աջակցվում է AVR- ների ապարատային ռեսուրսներով, ծրագրային ապահովման վարորդները դեռ անհրաժեշտ են I2C ավտոբուսից օգտվելու համար: Atmel- ը տրամադրում է Դիմումի գրառումներ (տե՛ս սույն Հրահանգի հետագայում ռեսուրսները), սակայն դրանք թերի են և այլ AVR սարքի հետ շփվելուց բացի որևէ օրինակ չեն ցուցադրում: Այս Հրահանգի նպատակը չէ որևէ մեկին սովորեցնել, թե ինչպես ստեղծել I2C վարորդներ AVR- ներ: Ավելի շուտ, ես ATmy2313 և ATmega168 սարքերի համար կտրամադրեմ Atmel վարորդների ընդլայնված տարբերակները, կբացատրեմ այն պահանջներն ու սահմանափակումները, որոնք կիրառվում են դրանք օգտագործելիս և ձեզ ցույց կտամ I2C սարքերի աշխատանքային օրինակներ: Այս Instructable- ի միջոցով աշխատելուց հետո դուք կկարողանաք հաջողությամբ օգտագործել I2C ավտոբուսը ձեր AVR նախագծերում: Ակնհայտ է, որ դուք կարող եք անտեսել վարորդներին կամ փոքր կամ MEGA- ի համար, եթե ձեզ հետաքրքրում է դրանցից միայն մեկը: Նրանց համար, ովքեր հետաքրքրված են ավելին իմանալու I2C ավտոբուսի մասին, ես կտրամադրեմ համապատասխան նյութի հղումներ:

Քայլ 1. Ինչի՞ց է այս ամենը I2C- ի պարագաներ:

Ինչ է այս ամենը I2C- ի պարագաներ
Ինչ է այս ամենը I2C- ի պարագաներ
Ինչի՞ց է այս ամենը I2C- ի նյութը
Ինչի՞ց է այս ամենը I2C- ի նյութը
Ինչի՞ց է այս ամենը I2C- ի նյութը
Ինչի՞ց է այս ամենը I2C- ի նյութը
Ինչի՞ց է այս ամենը I2C- ի նյութը
Ինչի՞ց է այս ամենը I2C- ի նյութը

I2C ավտոբուսը պարզ, երկալար կապ է, որը կարող է միացնել բազմաթիվ սարքեր միմյանց և թույլ տալ նրանց փոխանակել տվյալներ: Իր ամենապարզ ձևով կա մեկ հիմնական սարք, որը հաղորդակցվում է բազմաթիվ ստրուկ սարքերի հետ: Բոլոր սարքերը միացված են I2C ավտոբուսի երկու լարերին զուգահեռ: Երկու լարերը հայտնի են որպես SCL և SDA: SCL- ը ժամացույցի գիծ է և վերահսկվում է հիմնական սարքի կողմից: SDA- ն երկկողմանի տվյալների գիծ է: Տվյալները փոխանցելու համար վարպետը ուղարկում է ստրուկի հասցե ՝ մեկ բիթ կարդալ/գրելու դրոշի հետ միասին: Եթե ցանկանում եք գրել, վարպետը կշարունակի տվյալներ ուղարկել հասցեագրված ստրուկին: Եթե պահանջվում է ընթերցում, ստրուկը կպատասխանի տվյալներով: Գործարքները համակարգելու համար SCL և SDA տողերը շահարկվում են վարպետի և ստրուկի կողմից ՝ ազդանշան տալով մի քանի պայմանների: Դրանք ներառում են START, STOP, ACK (ճանաչել) և NAK (չընդունել): Այս պայմանների մանրամասները վարում են վարորդները: Ձեր մեջ իսկական գեյերը կարող են սովորել բոլոր մանրամասները սույն Հրահանգի վերջում տրված հղումներում: Էլեկտրական պահանջները բավականին պարզ են: Վարպետը և ստրուկները պետք է օգտագործեն նույն մակարդակը Vcc- ի համար, հիմքերը պետք է միացված լինեն, և SCL և SDA գծերը պետք է քաշվեն մինչև Vcc: Ձգվող ռեզիստորների արժեքը ճշգրիտ որոշվում է ավտոբուսի ընդհանուր հզորության վրա հիմնված հաշվարկով, բայց գործնականում կարող է լինել գրեթե ցանկացած արժեք 1.8K- ից մինչև 10K: Ես սկսում եմ 5.1K- ով և օգտագործում եմ ավելի ցածր արժեքներ, մինչև այն աշխատի: Սովորաբար դա խնդիր չէ, եթե սարքերի միջև շատ սարքեր կամ երկար մետաղալարեր չկան: I2C ավտոբուսի տվյալների անվանական արագությունը 100 Կբիթ/վրկ է: Հնարավոր են նաև 400 Կբիթ/վայրկյան, 1 Մբիթ/վայրկյան և ավելի բարձր դրույքաչափեր, սակայն սույն Հրահանգի վարորդները չեն ապահովում դրանք: Բոլոր I2C սարքերը կաշխատեն 100 Կբիթ/վրկ: ATtiny2313- ը և ATmega168- ը յուրաքանչյուրը տարբեր կերպ են իրականացնում I2C ավտոբուսը: ATtiny2313- ն օգտագործում է Universal Serial Interface (USI) սարքավորում, որը կարող է օգտագործվել նաև SPI ավտոբուսի համար: ATmega168- ը սարքավորում է հատկացրել I2C ավտոբուսի համար, որը հայտնի է որպես երկու լարային միջերես (TWI): Վարորդները գրվելուց հետո այս տարբերությունները հիմնականում թափանցիկ են օգտագործողի համար: Significantրագրային ապահովման մեջ էական տարբերություն կա. ATmega168 I2C վարորդն անջատված է, իսկ ATtiny2313- ի դեպքում `ոչ: Սա նշանակում է, որ ATmega168 ծրագիրը պետք չէ սպասել I2C տվյալների փոխանցումների իրականացմանը, այլ միայն պետք է սպասել ՝ նախքան մեկ այլ փոխանցում նախաձեռնելը, կամ մինչև տվյալները կհասնեն ընթերցված գործողությունից: Օրինակները և քննարկումները, որոնք պետք է հետևել, պետք է հստակեցնեն: I2C հասցեները 7 բիթ են, ուստի մինչև 127 սարք կարող է լինել ավտոբուսում, եթե յուրաքանչյուրն ունի յուրահատուկ հասցե: Ինչպես ցույց է տրված նկարում, այս 7 բիթանոց հասցեն տեղափոխվում է մեկ բիթ ձախ և ամենաքիչ նշանակալի բիթը օգտագործվում է հասցեում սարքի ընթերցման կամ գրման նշման համար: Այսպիսով, ստրուկի ամբողջական հասցեն 8 բիթ բայթ է: Փաստացի հասցեն մասամբ որոշվում է սարքի ներքին մասում և չի կարող փոխվել (4 առավել նշանակալի բիթ), և մասամբ որոշվում է բիտերով, որոնք կարող են կապված լինել սարքի կապումներին (3 նվազագույն նշանակալի բիթ), որոնք կարող են բարձր կամ ցածր կապվել կոնկրետ հասցե: Շփոթեցնող է հնչում, բայց օրինակով դա պարզ կդառնա: PCA8574A տվյալների թերթիկը ցույց է տալիս, որ I2C հասցեի չորս ամենանշանակալից բիթերը միշտ կլինեն 0111. Հաջորդ երեք բիթերը որոշվում են AD0, AD1 և AD2 կապում տեղադրված պարամետրերով: Այս կապումները կարող են կապված լինել գետնին կամ դրական լարման մատակարարմանը (5 վոլտ) `համապատասխանաբար 0 կամ 1: Այսպիսով, հնարավոր հասցեների տիրույթը 38 -ից 3F տասնվեցական է, ինչպես ցույց է տրված PCA8574 տվյալների թերթի մյուս նկարում: Այսպիսով, փոխելով հասցեի բիթի կարգավորումները, I2C ավտոբուսում միաժամանակ կարող է լինել մինչև 8 PCA8574A: Յուրաքանչյուրը կպատասխանի միայն իր հատուկ ստրուկի հասցեին: Եթե նույնիսկ ավելի շատ I/O նավահանգիստներ են անհրաժեշտ, PCA8574- ը կարող է օգտագործվել: PCA8574- ի և PCA8574A- ի միջև միակ տարբերությունն այն է, որ PCA8574- ի I2C ստրուկի հասցեների տիրույթը 20 -ից 27 տասնվեցական է: Տվյալ սարքի հասցեի որոշումը կարող է շփոթեցնել, քանի որ որոշ տվյալների թերթեր ընթերցման/գրելու բիթը համարում են մաս հասցեն: Ուշադիր կարդացեք տվյալների թերթիկը և հիշեք, որ ստրուկի հասցեն կլինի 7 բիթ: Կարդալու/գրելու բիթը պետք է վերաբերվի առանձին: Կրկին, օրինակը կօգնի: 24C16 EEPROM- ի տվյալների թերթիկը, որով մենք փորձարկելու ենք, ասում է, որ ստրուկի հասցեի առաջին (ամենանշանակալից) չորս բիթերը 1010 -ն են: Հաջորդ երեք բիթերը կարող են որոշվել A0, A1 և A2- ով; սակայն նշեք, որ տվյալների թերթիկը ներառում է նաև 24C01- ից 24C08- ը, որոնք ավելի փոքր չափի EEPROM- ներ են: Տվյալների թերթիկի նկարը ցույց է տալիս, որ այս հասցեի բիթերի պարամետրերն անտեսվում են չափերի մեծացման հետ և ամբողջությամբ անտեսվում են 24C16- ի համար: Այսինքն, վերջին երեք բիթերը նշանակություն չունեն, և 24C16- ն իսկապես օգտագործում է I2C ստրուկի բոլոր հասցեները 50 -ից մինչև 57 տասնվեցական: Ստրուկ հասցեների շրջանակը փաստացի կանդրադառնա 24C16- ի շրջանակներում տարբեր հատվածների: Առաջին 256 բայթերը գտնվում են 50 ժամ հասցեում, հաջորդ 256 -ը ՝ 51 ժամ, և այսպես շարունակ մինչև վերջին 256 -ը ՝ 57 ժ, ընդհանուր 2K բայթ: Քանի որ PCF8570 RAM- ի հասցեն, որի հետ մենք նույնպես փորձարկում ենք, այս տիրույթում է, 24C16- ը և PCF8570- ը չեն կարող օգտագործվել միասին:

Քայլ 2: Պատվիրեք որոշ I2C սարքեր

Այժմ, երբ դուք մի փոքր գիտեք I2C ավտոբուսի մասին և ցանկանում եք այն օգտագործել, ինչու՞ չպատվիրել որոշ I2C սարքեր փորձարկել այժմ, որպեսզի նրանք կարողանան ձեզ մոտ լինել, երբ դուք պատրաստում եք ծրագրակազմը: Համապատասխան սարքերը ներառում են I/ O Interface Expander (իմ սիրածը), Static Ram և EEPROM: Շատ ավելին կան, բայց դրանք հիանալի սկիզբ են: AVR պրոցեսորները, որոնք մենք կօգտագործենք, ATtiny2313 և Atmega168 են (օգտագործվում են Arduino- ում): Եթե դուք նորեկ եք դրանցից, ապա նայեք այս հիանալի հրահանգին ՝ դրանց մասին սովորելու և ձեր գետտոյի զարգացման համակարգը կառուցելու համար: Սույն Instructable- ի ATmega168- ի սխեման ցույց է տալիս, թե ինչպես կարելի է կիրառել Ghetto Development System- ը այս պրոցեսորի համար: Parallelուգահեռ նավահանգստի մալուխը նույնն է, ինչ ATtiny2313- ի համար: (Ես չեմ փորձել Ghetto Development System- ի USB տարբերակը, ուստի վստահ չեմ, թե ինչպես է դրան հասանելի I2C ավտոբուսը: Նույնը Arduino- ի համար): Ահա Digikey- ի մասերի համարները: EXPANDER 568-4236-5-NDRam: IC SRAM 256X8 W/I2C 568-1071-5-NDEEPROM: IC EEPROM SERIAL 16K CAT24C16LI-G-ND

Քայլ 3: I2C վարորդներ

Ահա I2C ավտոբուսի վարորդի գործառույթների նկարագրությունները: Դրանք մշակվել են ՝ սկսնակների համար Atmel Apps Notes- ի միջոցով: Ես չէի կարող դա անել առանց նրանց, որպես հիմք կառուցելու համար: Մշակումը կատարվել է WinAVR- ի և gcc C կոմպիլյատորի միջոցով:. Ամացույցի արագության սահմանափակումները նկարագրված են ստորև ՝ յուրաքանչյուր պրոցեսորի համար: Քանի որ ես ի վիճակի չեմ փորձարկել պրոցեսորի համի / ժամացույցի արագության հնարավոր բոլոր համակցությունները, ես պարզապես կառչեմ այն ամենից, ինչ իրականում կարող եմ ստուգել և կփորձեմ նշել սահմանափակումներն ու սահմանափակումները: Ահա վարորդի գործառույթները և ինչպես օգտագործել դրանք: Խնդրում ենք նայել օրինակներին ՝ ավելի մանրամասն և ամբողջական ծրագրերում օգտագործվող գործառույթները տեսնելու համար: ATtiny2313- ի համար. Ժամացույցի պահանջ. Վարորդները նախատեսված են ATtiny2313- ի համար 1 ՄՀց հաճախականությամբ (կանխադրված արագությամբ): Եթե ցանկանում եք աշխատել այլ տեմպերով, ապա դուք պետք է կարգավորեք կայունները վարորդների մեջ: Եթե դա անելու համար օգնության կարիք ունեք, ուղարկեք ինձ էլ. Կարող եք նաև որոշ ակնարկներ ստանալ Atmel հավելվածների նշումներից ՝ Resources Step- ի հղումներում: USI_TWI_Master_Initialise () Այս գործառույթը I2C ռեժիմի աշխատանքի համար նախաստորագրում է USI ապարատը: Onceանգահարեք այն մեկ անգամ ծրագրի սկզբում: Այն անվավեր է վերադառնում և փաստարկներ չկան: Քանի որ այս գործառույթը վերադարձնում է միայն սխալի կոդը, ես օգտագործում եմ TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) ֆունկցիան ՝ սխալի LED լուսավորելու համար: Սխալի կոդերը սահմանվում են USI_TWI_Master.h- ում: Ահա թե ինչպես կարելի է այն անվանել. Այն օգտագործվում է նաև մի քանի բայթ գրելու համար: Այս գործառույթն օգտագործելու 6 քայլ կա. անստորագիր char messageBuf (MESSAGEBUF_SIZE); 2) Տեղադրեք Slave հասցեն որպես առաջին բայթ բուֆերում: Տեղափոխեք այն մի քիչ ձախ և ԿԱՄ ՝ կարդալու/գրելու բիթում: Ուշադրություն դարձրեք, որ կարդալու/գրելու բիթը կարդալու համար կլինի 1, իսկ գրելու համար `0: Այս օրինակը կարդալու համար է: messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (TRԻՇՏ << TWI_READ_BIT); 3) Երբ գրում եք, բայթը գրելու համար տեղադրեք բայֆերի հաջորդ վայրում: 4) Callանգահարեք USI_TWI_Start_Read_Write գործառույթը ՝ հաղորդագրության բուֆերով և հաղորդագրության չափով որպես արգումենտներ: temp = USI_TWI_Start_Read_Write (messageBuf, 2); 5) վերադարձված արժեքը (այս դեպքում ջերմաստիճանը) կարող է ստուգվել `արդյոք սխալ է տեղի ունեցել: Եթե այո, ապա այն վարվում է այնպես, ինչպես քննարկվեց վերևում: 6) Եթե Read- ը պահանջվում էր, ապա բայտի ընթերցումը կլինի երկրորդ տեղում բուֆերում: Եթե մի քանի բայթ պետք է գրվի (օրինակ ՝ հիշողության սարքի վրա), ապա այս նույն ռեժիմը կարող է օգտագործվել: Բուֆերի տեղադրումը և ռեժիմը կանչելը փոքր -ինչ տարբերվում են: Բուֆերի երկրորդ բայթը կլինի սկզբնական հիշողության հասցեն, որին պետք է գրել: Գրվելիք տվյալները կլինեն հաջորդ բայթերում: Հաղորդագրության չափը կլինի այն չափը, որը կներառի բոլոր վավեր տվյալները: Այսպիսով, եթե պետք է գրվի 6 բայթ, ապա հաղորդագրության չափը կլինի 8 (ստրուկի հասցե + հիշողության հասցե + տվյալների 6 բայթ): USI_TWI_Start_Random_Read () Այս գործառույթը օգտագործվում է I2C սարքից մի քանի բայթ կարդալու համար, մի տեսակ հիշողություն: Այս ռեժիմի օգտագործումը շատ նման է նախորդ առօրյային ՝ երկու բացառությամբ: Կարդալու/գրելու բիտի կարգավորումը նշանակություն չունի: Այս ռեժիմին կանչելը միշտ կառաջացնի Read գործողություն: Հաղորդագրության չափը պետք է լինի 2 գումարած կարդալու բայթերի քանակը: Եթե սխալներ տեղի չեն ունեցել, տվյալները կլինեն երկրորդ վայրում սկսվող բուֆերում: ATmega168: ockամացույցի պահանջը. վարորդները նախատեսված են ATMega168- ի համար 4 ՄՀց հաճախականությամբ: Օրինակի կոդը ցույց է տալիս, թե ինչպես կարելի է կարգավորել ժամացույցի այս արագությունը: Եթե ցանկանում եք աշխատել այլ տեմպերով, ապա դուք պետք է կարգավորեք կայունները վարորդների մեջ: Եթե անհրաժեշտ է դա անել, ինձ էլ. Onceանգահարեք այն մեկ անգամ ծրագրի սկզբում: Այն անվավեր է վերադառնում և փաստարկներ չկան: Անպայման միացրեք ընդհատումները ՝ նախաստորագրելուց հետո զանգահարելով swi (): TWI_Get_State_Info () Այս գործառույթը վերադարձնում է I2C սխալի մասին տեղեկությունները և օգտագործվում է, եթե I2C գործարքի ընթացքում սխալ է տեղի ունեցել: Քանի որ այս գործառույթը վերադարձնում է միայն սխալի կոդը, ես օգտագործում եմ TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) ֆունկցիան ՝ սխալի LED լուսավորելու համար: Սխալի կոդերը սահմանվում են TWI_Master.h- ում, սակայն փոփոխված են սխալի LED ազդանշանի համար: Մանրամասների համար տե՛ս օրինակի կոդը: Ահա թե ինչպես կարելի է այն անվանել. երկու գործառույթ նույնն են, ինչ վերը նկարագրված համապատասխան գործառույթները, բայց մի քանի բացառություններով: Նրանք չեն վերադարձնում սխալի որևէ արժեք: Տվյալների ընթերցումը չի փոխանցվում բուֆերի մեջ: Դա կանենք հաջորդ նկարագրված գործառույթով: TWI_Start_Random_Read զանգահարելիս հաղորդագրության չափը պետք է լինի պահանջվող տվյալների բայթերի գումարած մեկ գումարած ոչ թե երկու: ATmega168- ի I2C վարորդը ընդհատվում է: Այսինքն, I2C գործարքները սկսվում են, այնուհետև կատարվում են ինքնուրույն, մինչ հիմնական ռեժիմը շարունակում է գործել: Երբ հիմնական ռեժիմը ցանկանում է տվյալներ, որոնք սկսվել է I2C գործարքից, այն պետք է ստուգի ՝ արդյոք տվյալները հասանելի են: Նույն իրավիճակն է սխալների ստուգման դեպքում: Հիմնական առօրյան պետք է համոզված լինի, որ I2C գործարքն ավարտված է ՝ սխալները ստուգելուց առաջ: Այս նպատակների համար օգտագործվում են հաջորդ երկու գործառույթները: Օրինակ ծրագրերը ցույց են տալիս, թե ինչպես օգտագործել դա: TWI_Read_Data_From_Buffer () Callանգահարեք այս գործառույթը ՝ I2C վարորդի ստացման բուֆերից տվյալները փոխանցելու հաղորդագրության բուֆերին: Այս գործառույթը կապահովի, որ տվյալները փոխանցելուց առաջ I2C գործարքն ավարտված լինի: Մինչ այս ֆունկցիան մի արժեք է վերադարձնում, ես համարում եմ, որ սխալի բիթը ուղղակիորեն ստուգելը ավելի հուսալի է: Ահա թե ինչպես կարելի է այն անվանել: Հաղորդագրության չափը պետք է լինի մեկով ավելի մեծ, քան ցանկալի տվյալների բիթերի քանակը: Տվյալները կլինեն messageBuf- ում ՝ սկսած երկրորդ վայրից: temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

Քայլ 4: Եկեք կառուցենք:

Եկեք Կառուցենք!
Եկեք Կառուցենք!
Եկեք Կառուցենք!
Եկեք Կառուցենք!
Եկեք Կառուցենք!
Եկեք Կառուցենք!
Եկեք Կառուցենք!
Եկեք Կառուցենք!

Սկսեք ներբեռնելով I2C Schematics.zip ֆայլը: Հնարավոր է, որ ցանկանաք ստեղծել I2C թղթապանակ ձեր աշխատանքային տարածքում `սխեմաներն ու օրինակելի ծրագրի ֆայլերը պահելու համար: Բացեք սխեմաները այս գրացուցակում: Դուք կգտնեք մի թղթապանակ, որը կոչվում է I2C Schematics: Բացեք փոքրիկ I2C.pdf անունով ֆայլը: Այս սխեմատիկ պատկերը ցույց է տալիս ATtiny2313 գետտոյի զարգացման համակարգը և PCA8574A I/O նավահանգստի ընդլայնիչը (դրա շուրջը գտնվում է մեծ գծանշված տուփը): Port Expander- ի սխեման կառուցված է հացահատիկի վրա: Նայեք լուսանկարներին ՝ տեսնելու, թե ինչ տեսք ունեն այս սխեմաները: Նրանք իսկապես բավականին պարզ են: Սխեմատիկայի ATtiny2313 հատվածը հենց Գետտոյի զարգացման համակարգն է `երեք լուսավորիչով (LED1, 2 և 3, գումարած R4, 5 և 6) և դրան միացված մի կոճակ (S1), գումարած մեկ լրացուցիչ մանրամասներ: Այդ դետալը թռիչքների (JP4, 5 և 6) ավելացումն է, որը կարելի է հեռացնել ՝ թույլ տալով միացնել I2C ավտոբուսի SCL և SDA գծերը: Թռիչքները ծրագրավորման համար պետք է տեղում լինեն, այնուհետև հանվեն, որպեսզի SCL- ն և SDA- ն միացվեն: Լուսանկարներում պատկերված են թռչկոտողները տեղում և հեռացված: Այս թռիչքների տեղադրումը ձերն է, դուք պարզապես պետք է դրանք տեղադրեք ձեր Ghetto զարգացման համակարգի վրա, եթե ցանկանում եք օգտագործել I2C ավտոբուսը: I2C ավտոբուսը պետք է անջատվի, և թռիչքները տեղադրվեն ծրագրավորման համար: Նկատի ունեցեք, որ I2C ավտոբուսի համար ձեզ իսկապես պետք է մտահոգել JP4- ը և JP6- ը: Տեղադրեք JP5, եթե կարծում եք, որ երբևէ կցանկանաք օգտագործել SPI ավտոբուսը: PCA8574A I/O Port Expander- ի տախտակ տեղադրելը շատ պարզ է: Ապահովեք Vcc (+5 վոլտ) և Gnd (հող) միացումները և միացրեք AD0, 1 և 2 -ը գետնին (I2C ստրուկի հասցեն դարձնում է 38 վեցանկյուն): Այնուհետև միացրեք 4 թարթիչ և 4 DIP անջատիչ: (Եթե դուք չունեք DIP անջատիչներ, կարող եք պարզապես օգտագործել լարերը: Կապեք գետնին կամ համապատասխանաբար միացրեք կամ անջատեք ազդանշանը): Վերջապես, SDA- ից և SCL- ից միացրեք ձգվող դիմադրիչները (R11 և 12) Vcc- ին: Սրանք ցուցադրվում են որպես 3.3K, բայց 1.8K- ից մինչև 5.1K ցանկացած արժեք պետք է աշխատի (գուցե մինչև 10K, բայց ես դա չեմ փորձել): ATtiny2313- ը ծրագրավորելուց հետո կարող եք հեռացնել թռիչքները և միացնել SDA- ն և SCL- ը փորձարկման համար: Այժմ ATmega168- ի համար: Այստեղ միակ կնճիռն այն է, որ գուցե դուք չեք կառուցել Ghetto զարգացման համակարգ այս պրոցեսորի համար: Եթե դա այդպես է, ապա իմ տրամադրած սխեմատիկան (MEGA I2C.pdf) ցույց կտա ձեզ, թե ինչպես: Սա պարզապես ATtiny2313 տարբերակի փոփոխություն է: Եթե նախապես պլանավորում եք, կարող եք համոզվել, որ ձեր ծրագրավորման մալուխը կհամապատասխանի երկու համակարգերին: Հիմնական տարբերությունը C2- ի և C3- ի ավելացումն է: Դրանք տեղադրելու համար տես նկարները, դրանք պետք է շատ մոտ լինեն չիպին; նրանցից մեկն իրականում չիպի տակ է: Դրանք օգնում են աղմուկը պահել հատկապես անալոգային թվային փոխարկիչից: Անհրաժեշտ չէ թռիչքներ տեղադրել, եթե չեք նախատեսում օգտագործել SPI ավտոբուսը, քանի որ դրանք անհրաժեշտ չեն այս չիպի վրա I2C ավտոբուսի համար: Նշենք, որ PCA8754A տախտակը անփոփոխ կլինի: Դուք պարզապես կկապեք SDA- ն և SCL- ը և կհեռանաք: Հեշտ, հա՞

Քայլ 5: Եկեք ծածկագրենք և փորձարկենք:

Եկեք ծածկագրենք և փորձարկենք
Եկեք ծածկագրենք և փորձարկենք
Եկեք ծածկագրենք և փորձարկենք
Եկեք ծածկագրենք և փորձարկենք
Եկեք ծածկագրենք և փորձարկենք
Եկեք ծածկագրենք և փորձարկենք

It'sամանակն է կառուցել վարորդներն ու օրինակելի ծրագրերը: Մենք կսկսենք ATtiny2313- ով և PCA8574A տախտակով, որը մենք նոր ենք կառուցել: Ներբեռնեք I2C.zip ֆայլը ձեր I2C աշխատանքային գրացուցակում և բացեք այն: Դուք կունենաք նոր թղթապանակ, որը կոչվում է I2C: Դրանում դուք կգտնեք USI I2C (ATtiny2313- ի համար) և TWI I2C (ATmega168- ի համար): USI I2C- ում կգտնեք I_O Port պանակը: Այդ թղթապանակը պարունակում է մեր առաջին ծրագրի ծրագրի ծածկագիրը և 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 ծրագրերը ղեկավարելու համար: Հիմնականում ծրագիրը ցույց է տալիս, թե ինչպես սկսել և օգտագործել I2C վարորդները, ներառյալ կարգավորումը: բարձրացրեք ստրուկի հասցեն և հաղորդագրության բուֆերի մնացած մասը և դրանից դուրս բերեք տվյալները: Դուք նաև կտեսնեք, թե ինչպես եմ ես հանում կոճակը և կարգավորում while հանգույցը: Theրագրի մի քանի մանրամասներ կան, որոնք արժանի են հիշատակման: Ուշադրություն դարձրեք, որ անջատիչներից ստացված տվյալները շրջված են նախքան Port Expander- ի LED- ների վրա գրելը: Նաև նկատի ունեցեք, որ Port Expander- ի մուտքային նավահանգիստները պետք է գրվեն որպես բարձր, որպեսզի դրանք ճիշտ աշխատեն: Այդ մանրամասները նկարագրված են PCA8574A տվյալների թերթիկում: Միշտ ուշադիր կարդացեք տվյալների թերթերը: Առավել հետաքրքրական է պայմանական վրիպազերծման օգտագործումը: Fileրագրի ֆայլի սկզբին մոտ է հայտարարությունը // #define DEBUG- ը և ծածկագրով ցանված են #ifdef DEBUG- ի հայտարարությունները: Քանի դեռ DEBUG- ը սահմանված չէ (երկու շեղ գծերը դարձնում են տողը մեկնաբանություն և պահում այն սահմանումից), #ifdef- ից #endif հայտարարությունների ծածկագիրը չի կազմվի: Բայց եթե ամեն ինչ չաշխատի այնպես, ինչպես դուք էիք սպասում, վերամշակեք և վերաբեռնեք կոդը #define DEBUG- ով ՝ առանց մեկնաբանության: Դուք ավելի շատ թարթում կստանաք LED- ների վրա, որոնք կարող եք վերծանել ՝ հետևելու ձեր ծրագրի կատարմանը և կօգնեն ձեզ գտնել այն, որտեղ ամեն ինչ սխալ է: Իրականում ես խորհուրդ եմ տալիս փորձել սա պարզապես տեսնելու համար, թե ինչ է տեղի ունենում: Այն, ինչ կտեսնեք, այն է, որ LED 2 -ը (PD5- ի վրա) կթարթվի ծրագրի կատարման ընթացքի ընթացքում: Անջատիչներից կարդացած արժեքը կթարթվի LED 1 -ի (PD6) վրա, նախքան այն ցուցադրվի Port Expander LED- ների վրա: Դուք պետք է կարողանաք հետևել ծրագրին, երբ այն աշխատում է ՝ օգտագործելով այս LED- ները: Հաջորդը մենք կաշխատենք ATmega168- ի հետ. բաց թողեք այս բաժինը, եթե ձեզ հետաքրքրում է միայն ATtiny2313- ը: Դեռ ինձ հետ? Լավ Տեղափոխվեք TWI_I2C թղթապանակ, փոխեք աշխատանքային գրացուցակը IO_Port և կազմեք և բեռնեք TWI_I2C_Port.c ATmega168- ում: Անջատեք SDA և SCL գծերը ATtiny2313- ից և միացրեք դրանք ATmega168- ին: Միացրեք ուժը և հողը, և միացեք: Գործողությունը պետք է լինի նույնը: Խաղացեք մինչև հուզմունքն անհետանա, ապա եկեք նայենք ծածկագրին: Բացեք TWI_I2C_Port.c: Կոդը գրեթե նույնական է, բացառությամբ սխալների մշակման և ընդհատված վարորդների տեղավորման: Ահա տարբերությունները. Նկատի ունեցեք, որ I2C ավտոբուսը ճիշտ աշխատելու համար ժամացույցը պետք է սահմանվի 4 ՄՀց: Sei (); հայտարարությունը միացնում է ընդհատումները I2C վարորդների սկզբնականացումից հետո: Սխալները ստուգելու համար ստուգվում է որոշակի կարգավիճակի բիթ: Ընթերցման ընթացքում TWI_Read_Data_From_Buffer գործառույթը պետք է կանչվի `ընթերցված տվյալները հաղորդագրության բուֆերում փոխանցելու համար: Գրելու ընթացքում, մինչ (TWI_Transceiver_Busy ()) պետք է օգտագործվի ՝ սխալները ստուգելուց առաջ համոզված լինելու, որ փոխանցումն ավարտված է: Այս վերջին երկու գործառույթները վերը նկարագրված են վարորդների նկարագրության մեջ: Բացի այդ, ծածկագիրը գրեթե նույնն է, ինչ ATtiny2313- ի համար: DEBUG- ը նույնն է գործում նաև, եթե ցանկանում եք դրա հետ փորձարկել:

Քայլ 6: Օգտագործելով I2C հիշողություն

Օգտագործելով I2C հիշողություն
Օգտագործելով I2C հիշողություն
Օգտագործելով I2C հիշողություն
Օգտագործելով I2C հիշողություն
Օգտագործելով I2C հիշողություն
Օգտագործելով I2C հիշողություն
Օգտագործելով I2C հիշողություն
Օգտագործելով I2C հիշողություն

Այժմ, երբ մենք սովորեցինք օգտագործել I2C ավտոբուսը `I/O Port Expander կարդալու և գրելու համար, եկեք անցնենք I2C հիշողությունների օգտագործմանը` ինչպես RAM, այնպես էլ EEPROM: Հիմնական տարբերությունն այն է, որ մի քանի բայթ կարելի է կարդալ կամ գրել հիշողություններից մեկ I2C հրամանով: Այս փորձերին պատրաստվելու համար մենք պետք է փոքր -ինչ փոփոխենք սարքավորումները և մի քանի նոր սխեմաներ ստեղծենք սեղանի վրա: Պահպանեք Port Expander- ի սխեման, քանի որ այն կօգտագործենք հիշողության որոշ արժեքներ ցուցադրելու համար: Հեռացրեք DIP անջատիչներն PCA8574A- ից և այդ կապում տեղադրեք թարթիչներ: Եթե դուք չունեք բավականաչափ լուսարձակող լուսարձակներ, P4- ից P7- ով տեղադրվածները տեղափոխեք P0- ից մինչև P3: (Displayedուցադրվող արժեքները բավական փոքր են): Այժմ նայեք սխեմատիկ I2C Ram.pdf- ին և միացրեք PCF8570- ը սեղանի վրա: Նայեք նաև նկարին: Համոզվեք, որ կապում եք 7 -րդ կապը Vcc- ի հետ: SDA- ի և SCL- ի համար լարեր գործարկեք PCA8574A- ից: Լրացուցիչ քաշման դիմադրիչներ չեն պահանջվում: Եթե դուք նույնպես հետաքրքրված եք EEPROM- ով, կառուցեք այդ միացումը ՝ օգտագործելով նաև I2C EEPROM.pdf- ը 24C16- ի համար, սակայն զգուշացեք, որ օրինակը օգտագործում է ATmega168- ը: Այս սխեման իսկապես պարզ է: Ինչպես նշվեց վերևում, հասցեի բիթերը պետք է անտեսվեն: Պարզապես միացրեք ուժը և գետինը: Մի միացրեք SDA- ն և SCL- ն դեռ այն բանից հետո, երբ մենք չենք ավարտել Ram- ի հետ փորձարկումները: Մենք կսկսենք մեր հիշողության փորձերը ATtiny2313- ի հետ, որը միացված է PCA8574A Port Expander- ին և PCF8570 Ram- ին: Theրագիրը որոշ թվեր կգրի Ram- ին, այնուհետև դրանք նորից կկարդա և կցուցադրի Port Expander- ում: Փոխեք ձեր աշխատանքային գրացուցակը RAM- ով ՝ USI I2C- ի ներքո: Օգտագործեք make ֆայլը ՝ USI_I2C_RAM.c կազմելու և ներբեռնելու համար: Ուշադրություն դարձրեք, որ I2C վարորդի ֆայլերը նույնն են, ինչ մենք օգտագործել էինք ավելի վաղ: Միացրեք հոսանքը և LED 1 -ի (PD6) վրա պետք է մեկ անգամ թարթել: Տվյալները կգրվեն առաջին 4 բայթ հիշողության մեջ: Սեղմեք կոճակը, և երկու բայթ կընթերցվեն և կցուցադրվեն: Պորտ Expander- ում (P0) պետք է տեսնել մեկ LED լույս, երկու վայրկյան դադար, այնուհետև երկու LED լույս (P0 և P1): Եվս երկու վայրկյան դադար, և LED- ները պետք է անջատվեն: Կրկին սեղմեք կոճակը ՝ հաջորդականությունը նորից սկսելու համար: Վրիպազերծումը նման է վերը նկարագրված մեթոդին: Եկեք նայենք ծածկագրին: Բացեք USI_I2C_RAM.c: Այն պետք է բավականին նման լինի նախորդ կոդին: Հիմնական տարբերությունները կարդալու և գրելու հիշողության մանրամասներն են: Նայեք, թե ինչպես է հաղորդագրության բուֆերը բեռնվում նախքան զանգը, որն իրականում գրում է: Առաջին բայթը ստրուկի հասցեն է `կարդալու/գրելու բիթը համապատասխանաբար սահմանված: Բայց հաջորդ բայթը հիշողության հասցեն է, որով պետք է սկսել գրել տվյալները: Այնուհետև գալիս են տվյալների բայթերը, որոնք հաջորդաբար կբեռնվեն հիշողության մեջ ՝ սկսած մեր նշած հասցեից: Հաղորդագրության չափը մենք սահմանում ենք որպես 6: Այսպիսով, մենք սկսում ենք գրել 00 հասցեով և գրել 01, 03, 02 և 06 արժեքները հիշողության վայրերում 00 -ից 03 -ը: Հիշողությունից տվյալները հետ կարդալու համար մենք պետք է օգտագործենք USI_TWI_Start_Random_Read գործառույթը: Հաղորդագրության բուֆերը ստանում է ստրուկի հասցեն առաջին բայթում, իսկ մեկնարկային հասցեն ՝ երկրորդ բայթում: Այնուհետև կանչեք հաղորդագրության չափը կարդալու համար բայթերի գումարած գործառույթը `գումարած 2. Նշեք, որ կարդալ/գրելու բիթը նշանակություն չունի, քանի որ ընթերցումը կկատարվի անկախ նրանից: Վերադարձված տվյալները կսկսվեն հաղորդագրության բուֆերում գտնվող երկրորդ վայրում: Տվյալները կարդալուց հետո դրանք շրջված են Port Expander- ում ցուցադրվելու համար և միաժամանակ մեկ բայթ են գրում դրան արժեքների միջև դադարով: Վերջապես, Port Expander LED- ները անջատված են: Նավահանգիստի ընդլայնիչին ուղղված գրությունները նույնական են, ինչ արվել էր նախորդ օրինակներում: Funվարճության համար կարող եք մեկնաբանել վերը նշված #սահմանել DEBUG- ի հայտարարությունը և տեսնել բազմաթիվ թարթող LED- ներ: Մեկ այլ հաջող փորձից հետո հուզմունքով ողողված, եկեք շարժվենք դեպի ATmega168 և EEPROM: Փոխեք ձեր աշխատանքային գրացուցակը EEPROM- ի TWI I2C- ի ներքո: Օգտագործեք make ֆայլը ՝ TWI_I2C_EEPROM.c կազմելու և ներբեռնելու համար: Նկատի ունեցեք, որ I2C վարորդի ֆայլերը նույնն են, ինչ մենք ավելի վաղ օգտագործել էինք PCA8574A- ի համար: Testրագիրը փորձարկելու համար անջատեք ATtiny2313- ը և միացրեք ATmega168- ը: Թողեք I2C ավտոբուսը խրված Ram- ի վրա և միացեք: Արդյունքները տարբեր են, քանի որ մենք այժմ գրում և կարդում ենք ավելի շատ տվյալներ: PD7- ի LED 1 -ը պետք է թարթել սկզբնավորման ժամանակ: Կտտացրեք կոճակին, և տվյալները կվերադառնան հիշողությունից և կցուցադրվեն: PCA8574- ի LED- ները պետք է թարթեն հետևյալ հաջորդականությամբ. P1, P0 & P2, (բոլորը անջատված են), P0 & P1, P1 & P2: Վերջապես, նավահանգստի LED- ները բոլորը պետք է անջատվեն: Կրկին սեղմեք կոճակը ՝ սա կրկնելու համար: Օh, բայց սպասեք, ասում եք: Այս ծրագիրը EEPROM- ի համար չէ՞: Քանի որ մենք մուտք ենք գործում հիշողության սարք նույն I2C հասցեով, նույն ծրագիրը գործում է ինչպես Ram- ի, այնպես էլ EEPROM- ի համար: Անջատեք և SDA- ն և SCL- ը Ram- ից տեղափոխեք EEPROM և նորից գործարկեք ծրագիրը: Այն պետք է աշխատի ճիշտ նույնը: Նկատի ունեցեք, որ EEPROM- ը և Ram- ը չեն կարող միացված լինել I2C ավտոբուսին միաժամանակ, քանի որ նրանք ունեն նույն հասցեն: (Ձեզանից խելացիները կարող են մտածել ծրագրավորման հասցեի բիթերը Ram- ում փոխելու մասին, բայց դա դեռ չի աշխատի: 24C16- ն օգտագործում է հասցեների ամբողջ բլոկը, որոնք կարող են ծրագրավորվել Ram- ի համար): Լավ, եկեք նայենք այս վերջին ծրագրին. Բացեք TWI_I2C_EEPROM.c: Առաջին բանը, որ պետք է նկատել, այն է, որ ես նշել եմ, թե ինչպես պետք է անդրադառնալ ամբողջական 24C16 EEPROM- ին: Այն կարող է հասանելի լինել 256 բայթ կտորներով 8 տարբեր I2C ստրուկների հասցեներով: Տեսեք, թե ինչպես է 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_BUFFER_SIZE արժեքը TWI_Master.h- ում: Դա պայմանավորված է նրանով, որ վարորդը պատճենում է տվյալները հաղորդագրության բուֆերից `ընդհատման ծառայության ռեժիմի կողմից օգտագործելու համար: Շնորհավորում եմ: Այժմ դուք պատրաստ եք օգտագործել I2C ավտոբուսը ձեր սեփական նախագծերում:

Քայլ 7: Վեբ ռեսուրսներ

Ահա փորձերի համար օգտագործվող մասերի տվյալների թերթերի հղումները: Դուք, անշուշտ, պետք է դրանք ձեռք բերեք, եթե ուրիշ ոչինչ չեք ստանում: (Նրանք սիրում են քառակուսի փակագծեր օգտագործել իրենց URL- ներում, այնպես որ ես չեմ կարող դրանք ճիշտ ներառել այստեղ: Կներեք:] I2C տարածք հասնելու համար ընտրեք «Ինտերֆեյս» ապրանքների ցանկից: Դուք կկարողանաք հասնել նրանց I2C կայքին և հասանելիություն բոլոր առաջարկվող տվյալների թերթերին և ծրագրերին: I2C ավտոբուսի նկարագրությունը և տեխնիկական մանրամասները, մասնավորապես, այստեղ են: Ստացեք ATtiny2313 և ATmega168 տվյալների թերթերը (տվյալների գրքեր) Atmel- ից: Atmel հավելվածի նշումները այստեղ են: Նայեք AVR310 և AVR315: Վերցրեք նաև կոդը: Նայեք այստեղ շատ ավելի I2C իրերի համար:

Քայլ 8: Նշումներ Geeks- ի համար

Իսկական գեյի համար, ով ցանկանում է մանրամասներ իմանալ, ահա որոշ բաներ, որոնք պետք է հիշել, եթե նայեք Atmel Apps Notes- ին և վարորդի կոդին. Բացի ստրուկի հասցեից և կարդալու/գրելու բիթից, հրամանները, ռեժիմները և այլն նշված չեն և հատուկ են տվյալ սարքին: Դա շատ պարզ դարձնելու համար նշեք, որ Atmel- ի օրինակում օգտագործվող սխեման վերաբերում է միայն այդ օրինակին և բավականին ոչ ստանդարտ է: + USI- ով, ժամաչափը տրամադրվում է ծրագրային ապահովման միջոցով. TWI- ով այն տրամադրվում է Bit Rate Generator- ի կողմից: + USI մեթոդը չի օգտագործում ընդհատումներ. TWI- ն անում է: Սա որոշակի իմաստ ունի, քանի որ Մեգա ընտանիքը (օգտագործելով TWI) կարող է շատ այլ բաներ անել և չպետք է խցկվի I2C փոխանցումներով: USI- ի համար ընդհատված տարբերակն անշուշտ հնարավոր է, այն պարզապես չի կիրառվում այս Հրահանգում: + USI ապարատը օպտիմիզացված չէ I2C- ի համար և կարող է կարգավորել միայն 8 բիթ փոխանցում: Սա նշանակում է, որ իններորդ բիթը (կամ NACK կամ ACK) ուղարկելու համար պահանջվում է երկու փոխանցում: TWI սարքավորումն ինքնաբերաբար կարգավորում է դա: Սա մի փոքր ավելի է բարդացնում USI վարորդի իրականացումը: + TWI- ի սխալների հայտնաբերումը մշակվում է ապարատային համակարգչում: USI- ն պահանջում է ծրագրային ապահովման մշակում, որը ինչ -որ բան բարդացնում է: + TWI ապարատը ուղղակիորեն վերահսկում է նավահանգստի կազմաձևումը: USI ապարատը պահանջում է, որ նավահանգստի բիթերը կազմաձևվեն նախքան նավահանգստի օգտագործումը: Դուք դա կտեսնեք Master_Initialize առօրյայում USI- ի համար:-Atmel- ը պնդում է, որ հնարավոր է օգտագործել AVR նավահանգիստների քաշքշուկները I2C ավտոբուսների քաշման համար: Ես չեմ գտել այդ մոտեցումն աշխատեցնելու միջոց: Երկու արտաքին ռեզիստորների օգտագործումը կարծես բավականին պարզ սխեմա է, ուստի ես դրա վրա շատ ժամանակ չեմ ծախսել:

Խորհուրդ ենք տալիս: