Мазмуну:

ATtiny жана ATmega үчүн I2C Bus: 8 кадам
ATtiny жана ATmega үчүн I2C Bus: 8 кадам

Video: ATtiny жана ATmega үчүн I2C Bus: 8 кадам

Video: ATtiny жана ATmega үчүн I2C Bus: 8 кадам
Video: Как использовать SSD1306 128x32 OLED-дисплей I2C с кодом Arduino 2024, Ноябрь
Anonim
ATtiny жана ATmega үчүн I2C Bus
ATtiny жана ATmega үчүн I2C Bus

Мен Atmel AVR микроконтроллерлерин жакшы көрөм! Бул Нускамада сүрөттөлгөн Геттону өнүктүрүү системасын кургандан бери, менде өзгөчө AVR ATtiny2313 жана ATmega168 менен тажрыйба жүргүзүүнүн эч кандай аягы болгон жок. Мен атүгүл которуштурууларды киргизүү катары инструкцияны жазууга чейин бардым жана Ghetto Development System концепциясын CPLDлерге узарттым. Акыркы долбоордун жүрүшүндө мен башкаруу баалуулуктарын орнотуу үчүн бир нече которгучтарга муктаж болдум. AVRлерде I/O пиндери жетишсиз болчу, ошондуктан бир нерсени ойлонууга туура келди. Мен клавиатура жана дисплей менен татаал киргизүү системасын сынап көрсөм болмок, бирок ATtiny2313 ресурстары түгөнүп калмак. Бактыга жараша, Atmel бул көйгөйдү чечүү үчүн кошумча чиптерге (мисалы, эс тутумуна же I/O портторуна) шилтеме бере турган интерфейсти кошуп, жөнөкөй эки зымдуу интерфейс менен камсыз кылды. Туура, AVRдеги эки гана I/O казыгын колдонуу менен биз көптөгөн кошумча I/O казыктарына жана башка ресурстарга кире алабыз. Бул эки зымдуу интерфейс формалдуу түрдө интегралдык микросхема шинасы же I2C автобусу деп аталат жана аны Philips Semiconductors болуп турганда NXP ойлоп тапкан. Эгерде сиз бул Нускаманы окуп жатсаңыз, анда I2C автобусу жөнүндө уккандырсыз жана аны PIC же башка микроконтроллерде колдонгон болушуңуз мүмкүн. Концептуалдык жактан абдан жөнөкөй жана AVRлердеги аппараттык ресурстар тарабынан колдоого алынганына карабастан, программалык камсыздоонун драйверлери I2C шинасын колдонуу үчүн дагы деле керек. Atmel Колдонмо Эскертмелерин камсыз кылат (бул Инструкциядагы Кийинчерээк Ресурстарды караңыз), бирок булар толук эмес жана башка AVR түзмөгү менен байланышуудан башка мисалдарды көрсөтпөйт. Бул Нускаманын максаты эч кимге I2C драйверлерин кантип түзүүнү үйрөтүү эмес AVRs. Тескерисинче, мен ATtiny2313 жана ATmega168 түзмөктөрү үчүн Atmel драйверлеринин кеңейтилген версияларын берем, аларды колдонууда колдонулуучу талаптарды жана чектөөлөрдү түшүндүрөм жана I2C түзмөктөрүнүн иштөө мисалдарын көрсөтөм. Бул Instructable аркылуу иштегенден кийин, I2C автобусун AVR долбоорлоруңузда ийгиликтүү колдоно аласыз. Албетте, сиз кичинекей же MEGA драйверлерин этибарга албай койсоңуз болот, эгер сиз алардын бирине гана кызыксаңыз. I2C автобусу жөнүндө көбүрөөк билүүнү каалагандар үчүн, мен тиешелүү материалга шилтемелерди берем.

1 -кадам: Мунун баары I2C Stuff деген эмне?

Баары бир I2C Stuff деген эмне?
Баары бир I2C Stuff деген эмне?
Баары бир бул I2C нерселери эмнеде?
Баары бир бул I2C нерселери эмнеде?
Баары бир I2C Stuff деген эмне?
Баары бир I2C Stuff деген эмне?
Баары бир I2C Stuff деген эмне?
Баары бир I2C Stuff деген эмне?

I2C автобусу-бул бир нече түзмөктү бириктирип, маалымат алмашууга мүмкүндүк бере турган жөнөкөй, эки зымдуу байланыш. Эң жөнөкөй формасында бир нече кулдук түзмөктөр менен байланышкан бир башкы түзмөк бар. Бардык түзмөктөр I2C шинасынын эки зымына параллель туташтырылган. Эки зым SCL жана SDA деп аталат. SCL саат линиясы жана башкы түзмөк тарабынан башкарылат. SDA-эки багыттуу маалымат линиясы. Маалыматты өткөрүп берүү үчүн, кожоюн бир аз окуу/жазуу желеги менен бирге кул дарегин жөнөтөт. Эгерде жазуу керек болсо, кожоюн даректерин жөнөтүлгөн кулга маалыматтарды жөнөтүүнү улантат. Эгерде окуу суралса, кул маалымат менен жооп берет. Транзакцияларды координациялоо үчүн SCL жана SDA линиялары кожоюн жана кул тарабынан бир нече шарттарга сигнал берүү үчүн башкарылат. Буларга START, STOP, ACK (моюнга алуу) жана NAK (моюнга алуу жок) кирет. Бул шарттардын чоо -жайын айдоочулар чечет. Чыныгы геиктер араңарды ушул Instructableдин аягында берилген шилтемелерден билүүгө болот. Электрдик талаптар абдан жөнөкөй. Кожоюн жана кулдар Vcc үчүн бирдей деңгээлди колдонушу керек, негиздер туташып, SCL жана SDA линиялары Vcc чейин тартылышы керек. Тартуу каршылыгынын мааниси так автобустун жалпы сыйымдуулугуна негизделген эсептөө менен аныкталат, бирок иш жүзүндө дээрлик 1.8K менен 10K аралыгында болушу мүмкүн. Мен 5.1K менен баштайм жана ал иштегенге чейин төмөнкү баалуулуктарды колдоном. Бул, адатта, көйгөй эмес, эгерде сизде түзмөктөр көп же түзмөктөрдүн ортосунда узун зымдар жок болсо, I2C автобустун номиналдык маалымат ылдамдыгы 100Кбит/сек. 400Кбит/сек, 1Мбит/сек жана андан ашкан ылдамдыктар дагы мүмкүн, бирок бул Нускамада айдоочулар тарабынан колдоого алынбайт. Бардык I2C түзмөктөрү 100Kbits/секундда иштейт. ATtiny2313 жана ATmega168 ар бири I2C автобусун башкача ишке ашырышат. ATtiny2313 Universal Serial Interface (USI) жабдууларын колдонот - аны SPI шинасы үчүн да колдонсо болот. ATmega168 I2C автобусуна арналган эки жабдык интерфейси (TWI) үчүн атайын жабдыктарга ээ. Айдоочулар жазылгандан кийин, бул айырмачылыктар негизинен колдонуучу үчүн ачык -айкын болот. Бир олуттуу айырмачылык программалык камсыздоодо: ATmega168 I2C драйвери үзгүлтүккө учурайт, ал эми ATtiny2313 үчүн андай эмес. Бул ATmega168 программасы I2C маалыматынын өткөрүлүшүн күтпөшү керектигин билдирет, бирок башка которууну баштоодон мурун же маалыматтар окуу операциясынан келгенге чейин күтүшү керек. Кийинки мисалдар жана талкуулар муну ачык көрсөтүшү керек. I2C даректери 7 битти түзөт, андыктан ар биринин уникалдуу дареги болсо, автобуста 127 түзмөк болушу мүмкүн. Сүрөттө көрүнүп тургандай, бул 7 биттик дарек бир аз солго жылдырылган жана анча маанилүү эмес дарек боюнча түзмөктүн окулушун же жазылышын белгилөө үчүн колдонулат. Ошентип, толук кул дареги 8 биттик байт. Чыныгы дарек түзмөктүн ичинде жарым -жартылай аныкталат жана аны өзгөртүү мүмкүн эмес (эң маанилүү 4 бит), жана жарым -жартылай түзмөктөрдүн түйрүктөрүнө туташтырылышы мүмкүн болгон биттер менен аныкталат (эң аз 3 бит). белгилүү бир дарек. Башаламан угулат, бирок бир мисал муну ачык көрсөтөт. PCA8574A маалымат баракчасы I2C дарегинин эң маанилүү төрт бити дайыма 0111. Кийинки үч бит AD0, AD1 жана AD2 төөнөгүчтөрдөгү орнотуулар менен аныкталарын көрсөтөт. Бул казыктарды жерге же оң чыңалууга (5 вольт) байлап, 0 же 1ди билдирет. Ошентип, мүмкүн болгон даректердин диапазону PCA8574 маалымат барагындагы башка сүрөттө көрсөтүлгөндөй, 38ден 3F он алтылыкка чейин. Ошентип, даректин бит орнотууларын өзгөртүү менен, 8 PCA8574Aга чейин I2C автобусунда бир убакта болушу мүмкүн. Ар бири өзүнүн конкреттүү кул дарегине гана жооп берет. Эгерде дагы көбүрөөк I/O порттору керек болсо, PCA8574 колдонулушу мүмкүн. PCA8574 менен PCA8574Aнын бир гана айырмасы, PCA8574түн I2C кул дарегинин диапазону 20дан он алтылыкка чейин. Берилген түзмөктүн дарегин аныктоо башаламан болушу мүмкүн, анткени кээ бир маалымат барактары окуу/жазуу битин бир бөлүгү деп эсептейт. дареги. Маалымат баракчасын кунт коюп окуңуз жана кулдун дареги 7 битке созуларын унутпаңыз. Окуу/жазуу битине өзүнчө мамиле кылуу керек. Дагы бир мисал жардам берет. Биз эксперимент жасай турган 24C16 EEPROM үчүн маалымат баракчасы кул дарегинин биринчи (эң маанилүү) төрт битинин 1010 экенин айтат. Кийинки үч битти A0, A1 жана A2 аркылуу аныктаса болот; Бирок маалымат баракчасы 24C01ден 24C08ге чейин кичирээк EEPROMдорду камтыйт. Маалымат баракчасындагы көрсөткүч, бул дарек биттеринин орнотуулары көлөмдүн өсүшү менен этибарга алынбай турганын жана 24C16 үчүн толугу менен этибарга алынбай турганын көрсөтүп турат. Башкача айтканда, акыркы үч бит эч кандай мааниге ээ эмес жана 24C16 чындыгында I2C кул даректерин 50 аркылуу 57 он алтылыктан колдонот. Кул даректеринин диапазону чындыгында 24C16 ичиндеги ар кандай бөлүмдөргө кайрылат. Биринчи 256 байт 50h дарегинде, кийинки 256да 51де, ж.б.у.с. акыркы 256га чейин 57чте - жалпы 2K байт. PCF8570 RAM дареги бул диапазондо болгондуктан, 24C16 менен PCF8570 бирге колдонулбайт.

2 -кадам: Кээ бир I2C түзмөктөрүнө заказ кылыңыз

Эми сиз I2C Bus жөнүндө бир аз билесиз жана аны колдонууну кааласаңыз, эмне үчүн кээ бир I2C түзмөктөрүнө эксперимент жасоого буйрук бербейсиз, андыктан алар программаны даярдап жаткан учурда сизге бара алышат? Тиешелүү түзмөктөрдө I/ O Interface Expander (менин сүйүктүүм), статикалык кочкор жана EEPROM. Дагы көп нерселер бар, бирок бул сонун башталыш. Биз колдоно турган AVR процессорлору ATtiny2313 жана Atmega168 (Arduinoдо колдонулат). Эгерде сиз булар үчүн жаңы болсоңуз, анда алар жөнүндө билүү жана Геттону өнүктүрүү системаңызды түзүү үчүн бул улуу Нускаманы карап көрүңүз. ATmega168дин схемасы ушул Нускамада бул процессор үчүн Геттону өнүктүрүү системасын кантип ишке ашыруу керектиги көрсөтүлгөн. Параллель порт кабели ATtiny2313 үчүн бирдей. (Мен Геттону өнүктүрүү тутумунун USB версиясын сынап көргөн жокмун, андыктан I2C автобусуна кантип кирүү керек экенин так билбейм. Arduino үчүн да ошондой.) Бул жерде Digikey бөлүктөрүнүн номерлери. Порт экспантер: 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 үчүн 1 МГц (демейки ылдамдык) ылдамдыгына иштелип чыккан. Эгерде сиз башка тарифтер менен иштегиңиз келсе, анда драйверлердеги константаларды тууралашыңыз керек болот. Муну аткарууга жардам керек болсо мага электрондук кат жөнөтүңүз. Сиз ошондой эле ресурстардагы шилтемелердеги Atmel колдонмолорунун эскертмелеринен ала аласыз. USI_TWI_Master_Initialise () Бул функция I2C режиминин иштөөсү үчүн USI жабдууларын баштайт. Программаңыздын башталышында бир жолу чалыңыз. Бул боштукту кайтарат жана эч кандай аргументтер жок. Бул функция ката кодун гана кайтарып бергендиктен, мен 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 кадам бар. unsigned char messageBuf (MESSAGEBUF_SIZE); 2) Кул дарегин буфердеги биринчи байт катары коюңуз. Аны бир аз солго жана ЖЕ Оку/Жазуу битине жылдырыңыз. Эскертүү Окуу/Жазуу бит окуу үчүн 1, жазуу үчүн 0 болот. Бул мисал окуу үчүн. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (ЧЫНЫК << TWI_READ_BIT); 3) Жазып жатканда, байтты буфердеги кийинки жерге жазыңыз.4) USI_TWI_Start_Read_Write функциясына билдирүүнүн буферин жана argument катары билдирүүнүн өлчөмүн чакырыңыз.temp = USI_TWI_Start_Read_Write (messageBuf, 2); 5) кайтарылган маани (бул учурда темп) ката болгонун текшерүү үчүн текшерилиши мүмкүн. Эгер ошондой болсо, анда ал жогоруда талкуулангандай жүргүзүлөт. Программалардагы мисалдарды карагыла.6) Эгерде Окуу суралган болсо, анда байт окуу буфердин экинчи жеринде болот. Эгер бир нече байт жазылышы керек болсо (мисалы, эс тутумуна), ушул эле тартипти колдонсо болот. Буферди орнотуу жана күн тартибин чакыруу бир аз башкача. Буфердеги экинчи байт жазыла турган баштапкы эстутум дареги болот. Жазыла турган маалыматтар кийинки байттарда болот. Билдирүүнүн өлчөмү бардык жарактуу маалыматтарды камтыган өлчөм болот. Ошентип, эгерде 6 байт жазылышы керек болсо, анда билдирүүнүн өлчөмү 8 болот (кул дареги + эс тутум дареги + 6 байт маалымат). кандайдыр бир эс. Бул процедураны колдонуу мурунку күнүмдүкүнө абдан окшош, эки өзгөчө учурду эске албаганда. Окуу/Жазуу битинин мааниси жок. Бул көнүмүшкө чалуу ар дайым Read операциясына себеп болот. MessageSize 2 болууга тийиш, эгерде эч кандай ката болбосо, маалыматтар буферде экинчи орунда башталат. ATmega168 үчүн: Сааттын талабы: драйверлер ATmega168 үчүн 4 МГц частотасы үчүн иштелип чыккан. Мисал коду бул саатты кантип коюуну көрсөтөт. Эгерде сиз башка тарифтер менен иштегиңиз келсе, анда драйверлердеги константаларды тууралашыңыз керек болот. Эгер муну жасоо керек болсо, мага электрондук почта аркылуу жөнөтүңүз. Программаңыздын башталышында бир жолу чалыңыз. Ал боштукту кайтарат жана эч кандай аргументтер жок. Инициализациядан кийин swi () деп чалып үзгүлтүктөрдү иштетүүнү унутпаңыз. TWI_Get_State_Info () Бул функция I2C ката маалыматын кайтарат жана I2C транзакциясы учурунда ката кеткен болсо колдонулат. Бул функция ката кодун гана кайтарып бергендиктен, мен TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) функциясын колдонуп, ката диодун күйгүзөм. Ката коддору TWI_Master.hде аныкталган, бирок ката диодунда сигнал берүү үчүн өзгөртүлгөн. Чоо -жайын билүү үчүн мисал кодун караңыз. Аны кантип чакыруу керек: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) I2C транзакциясы (төмөндө сүрөттөлгөн функция) бүткөнүнө ынануу менен ката текшерүү жүргүзүлөрүн жана глобалдык статус сөзүндө бир аз тестирлөө жүргүзүлөрүн эске алыңыз. эки функция жогоруда сүрөттөлгөн тиешелүү функциялар менен бирдей иштейт, бирок кээ бир өзгөчөлүктөр менен алар эч кандай ката баалуулуктарын кайтарышпайт. Берилген маалымат буферге өткөрүлбөйт. Бул кийинки сүрөттөлгөн функция менен аткарылат. TWI_Start_Random_Read деп атаганда, messageSize эки эмес, бир эмес, суралган байттардын саны болушу керек. ATmega168 үчүн I2C драйвери үзгүлтүккө учурайт. Башкача айтканда, I2C транзакциялары башталат жана андан кийин өз алдынча аткарылат, ал эми негизги иш улантууда. Негизги тартип башталган I2C транзакциясынан маалыматтарды алгысы келгенде, ал маалыматтын бар -жогун текшериши керек. Ката текшерүүдө да абал ушундай. Негизги күнүм каталарды текшерүүдөн мурун I2C бүтүмү бүткөнүнө ишениши керек. Кийинки эки функция ушул максаттар үчүн колдонулат. Мисал программалар муну кантип колдонууну көрсөтөт. Бул функция I2C транзакциясы дайындарды өткөрүүдөн мурун бүткөнүн текшерет. Бул функция кайтарылган мааниде, мен ката битти ишенимдүү текшерип көрөм. Бул жерде аны кантип чакыруу керек. Билдирүүнүн өлчөмү керектүү маалымат биттеринин санынан бир чоң болушу керек. Маалыматтар экинчи location.temp = TWI_Read_Data_From_Bufferден баштап messageBuf ичинде болот (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) жана ага басылган баскыч (S1), плюс бир кошумча детал. Бул деталь I2C автобус SCL жана SDA линияларын туташтырууга мүмкүндүк берүү үчүн алынып салынуучу секиргичтердин (JP4, 5 жана 6) кошулушу. Секирүүчүлөр программалоо үчүн ордунда болушу керек, андан кийин SCL менен SDA туташтырылышы мүмкүн. Сүрөттөрдө секиргендердин ордунда жана алынып салынгандыгы көрсөтүлгөн. Бул секиргичтерди жайгаштыруу сизден көз каранды, эгер сиз I2C автобусун колдонууну кааласаңыз, аларды Геттону өнүктүрүү тутумуна коюңуз. 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ди тестирлөөгө туташтыра аласыз. Эми ATmega168 үчүн. Бул жердеги бир гана бырыш - бул процессорго Геттону өнүктүрүү системасын курбагандырсыз. Эгер андай болсо, анда мен берген схема (MEGA I2C.pdf) кантип көрсөтөт. Бул жөн эле ATtiny2313 версиясынын алмаштырылышы. Эгерде сиз алдын ала пландасаңыз, анда программалоо кабелиңиз эки системага тең дал келерине ынансаңыз болот. Негизги айырма C2 жана C3 кошулушу. Буларды жайгаштыруу үчүн сүрөттөрдү караңыз, алар чипке абдан жакын болушу керек; алардын бири чынында чиптин астында. Булар өзгөчө ызы -чууну санарипке аналогдон чыгарбоого жардам берет. Сиз SPI автобусун колдонууну пландабасаңыз, секиргичтерди салуунун кажети жок, анткени алар бул чипте I2C автобусуна керек эмес. PCA8754A нан тактасы өзгөрүүсүз болорун эске алыңыз. Сиз жөн гана SDA менен SCLди туташтырасыз жана кетесиз! Оңой, ээ?

5 -кадам: Келгиле код жана тест

Келгиле код жана тест!
Келгиле код жана тест!
Келгиле код жана тест!
Келгиле код жана тест!
Келгиле код жана тест!
Келгиле код жана тест!

Айдоочуларды жана мисал программаларды курууга убакыт келди. Биз жаңыдан курган 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 тиркемелериңизди жетектөө үчүн мисалды колдонуңуз. кул дарегин жана билдирүү буферинин калган бөлүгүн көтөрүп, андан маалыматтарды алуу. Сиз ошондой эле баскычты кантип бошотуп жатканымды жана убакыт циклин кантип орнотконумду көрөсүз. Программанын айта кете турган бир нече деталдары бар. Көңүл бургула, өчүргүчтөрдүн маалыматтары Port Expanderдеги LEDлерге жазылардан мурун тескери бурулат. Ошондой эле, Port Expander'деги киргизүү порттору туура иштеши үчүн Жогорку деп жазылышы керек экенин эске алыңыз. Бул деталдар PCA8574A маалымат барагында сүрөттөлгөн. Ар дайым маалымат барактарын кунт коюп окуңуз! Көбүрөөк кызыктыруучу нерсе - шарттуу түрдө мүчүлүштүктөрдү оңдоо. Программанын файлынын башталышына жакын жерде # #DEBUG аныктоо жана #ifdef DEBUG билдирүүлөрү кодго чачырайт. DEBUG аныкталмайынча (эки сызык сызыкты комментарий кылат жана аны аныктоодон сактап калат), #ifdefтен #endifке чейинки коддор түзүлбөйт. Бирок, эгер сиз ойлогондой иштебесе, кодду #define DEBUG менен комментарийсиз кайра түзүңүз жана кайра жүктөңүз. Сиз программанын аткарылышын көзөмөлдөө үчүн жана сиз туура эмес болгон жерлерди так аныктоого жардам берүү үчүн чече турган Светодиоддордо дагы көп ирмемдерди аласыз. Чынында, мен эмне болуп жатканын көрүү үчүн муну сынап көрүүнү сунуштайм. Сиз көрө турган нерсе, LED 2 (PD5те) программа аркылуу аткаруунун жүрүшүндө ирмелет. Коммутаторлордон окулган маани Порт Expander LEDлеринде көрсөтүлө электе LED 1де (PD6) өчөт. Сиз бул LEDлерди колдонуу менен программаны көзөмөлдөп турушуңуз керек. Кийинки ATmega168 менен иштейбиз; Эгерде сизди ATtiny2313 гана кызыктырса, бул бөлүмдү өткөрүп жибериңиз. Дагы эле мени мененби? Жакшы. TWI_I2C папкасына өтүңүз, жумушчу каталогуңузду IO_Portко өзгөртүңүз жана TWI_I2C_Port.c файлын түзүңүз жана ATmega168ге жүктөңүз. SDA жана SCL линияларын ATtiny2313тен ажыратып, аларды ATmega168 менен туташтырыңыз. Жерди жана электрди туташтырыңыз. Операция бирдей болушу керек! Толкундануу басылганга чейин ойноңуз, андан кийин кодду карап көрөлү. Open 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 эс тутумун колдонуу

Эми I/O Port Expanderди окуу жана жазуу үчүн I2C автобусун колдонууну үйрөндүк, эми 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ди колдонорун эскертип коюңуз. Бул схема чынында эле жөнөкөй. Жогоруда талкуулангандай, дарек биттерин этибарга албоо керек. Жөн эле бийликти жана жерге туташтырыңыз. SDA менен SCLди туташтырбаңыз, анткени биз Ram экспериментин бүтүрө элекпиз, биз эс тутумубуздагы эксперименттерди PCA8574A Port Expander жана PCF8570 Ramга туташкан ATtiny2313 менен баштайбыз. Программа Рамга кээ бир сандарды жазат, андан кийин аларды кайра окуп, Порт Expanderде көрсөтөт. USI_I2C_RAM.cти түзүү жана жүктөө үчүн make файлын колдонуңуз. I2C драйверинин файлдары биз мурда колдонулган файлдарга окшош экенин эске алыңыз. Күчтү туташтырыңыз жана LED 1де (PD6) бир ирмемди көрүшүңүз керек. Маалыматтар эс тутумдун алгачкы 4 байтына жазылат. Баскычты басыңыз жана эки байт кайра окулат жана көрсөтүлөт. Порт Expanderде бир LED жарыгын көрүшүңүз керек (P0), эки секунддук тыныгуу, андан кийин эки LED жарыгы (P0 жана P1). Дагы эки секунддук тыныгуу жана светодиоддор өчүшү керек. Тизмени кайра баштоо үчүн баскычты кайра басыңыз. Мүчүлүштүктөрдү оңдоо жогоруда айтылган ыкмага окшош. Келгиле, кодду карап көрөлү. USI_I2C_RAM.c ачуу. Бул мурунку кодго абдан окшош болушу керек. Негизги айырмачылыктар - окуу жана жазуу эс тутумунун деталдары. Чындыгында жазууну аткарган чалууга чейин билдирүү буферинин жүктөлүшүн караңыз. Биринчи байт - бул окуу/жазуу биттери туура коюлган кулдун дареги. Бирок кийинки байт - бул маалыматтарды жазууну баштоо үчүн эстутум дареги. Андан кийин, биз көрсөткөн даректен баштап, эстутумга ырааттуу жүктөлүүчү чыныгы маалымат байттары келет. Биз билдирүүнүн өлчөмүн 6 катары көрсөтөбүз. Ошентип, 00 дарегине жазууну баштайбыз жана 01, 03, 02 жана 06 маанилерин 00дөн 03кө чейин эстутум жайгашкан жерлерге жазабыз. Эстен кайра маалыматтарды окуу үчүн биз USI_TWI_Start_Random_Read функциясын колдонушубуз керек. Билдирүү буферинин биринчи байттагы кул дарегин жана экинчи байттагы баштапкы дарегин алат. Андан кийин, функцияны билдирүү өлчөмү менен, байттардын санын плюс 2 деп коюңуз. Окуу/жазуу битинин мааниси жок экенин эске алыңыз, анткени окуу карабастан аткарылат. Кайтарылган маалыматтар билдирүү буфериндеги экинчи жерде башталат. Маалыматтар окулгандан кийин, ал Port Expanderде көрсөтүү үчүн тескери бурулат жана бир маалда баалуулуктардын ортосунда тыныгуу менен жазылат. Акыр -аягы, Port Expander диоддору өчүрүлөт. Порт Expanderге жазуулар мурунку мисалдарда жазылгандарга окшош. Көңүл ачуу үчүн, сиз #define DEBUG билдирүүсүн жогорудагыдай комментарий бере аласыз жана дагы көптөгөн ийгиликтүү эксперименттен кийин толкундануу менен күйгөн LEDлерди көрө аласыз, келгиле, ATmega168ге жана EEPROMго өтөлү. Жумуш каталогуңузду TWI I2C астындагы EEPROMго өзгөртүңүз. TWI_I2C_EEPROM.cти түзүү жана жүктөө үчүн make файлын колдонуңуз. I2C драйверинин файлдары биз мурда PCA8574A үчүн колдонулган файлдарга окшош экенин эске алыңыз. Программаны текшерүү үчүн ATtiny2313 жана ATmega168 туташуу керек. I2C автобусун кочкорго илинип, иштетиңиз. Натыйжалар башкача, анткени биз азыр көбүрөөк маалыматтарды жазып, окуп жатабыз. PD7деги LED 1 инициализацияда өчүп -күйүшү керек. Баскычты басыңыз жана маалыматтар эс тутумдан кайра окулат жана көрсөтүлөт. PCA8574төгү светодиоддор төмөнкү ырааттуулукту өчүрүшү керек: P1, P0 & P2, (баары өчүк), P0 & P1, P1 & P2. Акыр -аягы, порт LED бардык өчүрүү керек. Муну кайталоо үчүн баскычты кайра басыңыз. Оо, бирок күтө туруңуз. Бул программа EEPROM үчүн эмеспи? Биз ошол эле I2C дареги боюнча эстутум түзмөгүнө кирип жаткандыктан, ошол эле программа Ram жана EEPROM үчүн да иштейт. Күчтү өчүрүңүз жана SDA менен SCLди Ramдан EEPROMга жылдырыңыз жана программаны кайра иштетиңиз. Бул так ошондой иштеши керек. Белгилей кетсек, EEPROM менен Ram бир убакта I2C автобусуна туташа албайт, анткени алар бир даректи бөлүшөт. (Араңардагы акылдуулар Рамдагы программалана турган даректерди өзгөртүүнү ойлошу мүмкүн, бирок бул дагы деле иштебейт. 24C16 кочкорго программаланган даректердин бүт блогун колдонот.) Макул, бул акыркы программаны карап көрөлү. 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_BUFFER_SIZE маанисин TWI_Master.hде өзгөртүүгө туура келет. Бул айдоочу үзгүлтүккө учуроо кызматы үчүн колдонуу үчүн билдирүү буферинен маалыматтарды көчүрүп алганы үчүн. Куттуктайм! Сиз азыр I2C автобусун өз долбоорлоруңузда колдонууга даярсыз!

7 -кадам: Желе ресурстары

Бул жерде эксперименттер үчүн колдонулган бөлүктөрдүн маалымат барагына шилтемелер бар. Эгерде сиз башка эч нерсе албасаңыз, анда сөзсүз түрдө буларды алышыңыз керек. (Алар URL даректеринде төрт бурчтуу кашаанын колдонулушун жакшы көрүшөт, ошондуктан мен аларды бул жерге туура киргизе албайм. Кечиресиз.) I2C аймагына жетүү үчүн Продукциялар тизмесинен Интерфейсти тандаңыз. Сиз алардын I2C сайтына жана I2C автобусунун сүрөттөмөсү жана техникалык деталдары бул жерде. Atmelден ATtiny2313 жана ATmega168 маалымат баракчаларын (маалымат китептери?) Бул жерден табыңыз. Кодду дагы кармаңыз. Бул жерде дагы I2C нерселерин карап көрүңүз.

8 -кадам: Geeks үчүн эскертүүлөр

Чоо-жайын билгиси келген чыныгы геек үчүн, Atmel Apps Notes жана драйвер кодун карасаңыз, кээ бир нерселерди эстен чыгарбоо керек:- I2C түзмөгүнө кайрылуу жана буйрук берүү ыкмасы спецификанын бир бөлүгү эмес! Кул дареги жана окуу/жазуу битинен башка, буйруктар, режимдер ж.б. көрсөтүлгөн эмес жана алар берилген түзмөккө тиешелүү. Муну абдан түшүнүктүү кылуу үчүн, Atmel мисалында колдонулган схема ошол мисалга гана тиешелүү экенин жана дээрлик стандарттуу эмес экенин эске алыңыз. + 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 портун тартууну колдонсо болот деп ырастайт. Мен бул ыкманы иштетүүнүн жолун тапкан жокмун. Эки тышкы резисторду колдонуу абдан жөнөкөй схема окшойт, ошондуктан мен буга көп убакыт короткон жокмун.

Сунушталууда: