Სარჩევი:

I2C ავტობუსი ATtiny– სა და ATmega– სთვის: 8 ნაბიჯი
I2C ავტობუსი ATtiny– სა და ATmega– სთვის: 8 ნაბიჯი

ვიდეო: I2C ავტობუსი ATtiny– სა და ATmega– სთვის: 8 ნაბიჯი

ვიდეო: I2C ავტობუსი ATtiny– სა და ATmega– სთვის: 8 ნაბიჯი
ვიდეო: LDmicro 14: I2C LCD & DS3231 Real-Time Clock (Microcontroller PLC Ladder Programming with LDmicro) 2024, ივლისი
Anonim
I2C ავტობუსი ATtiny და ATmega– სთვის
I2C ავტობუსი ATtiny და ATmega– სთვის

მე მიყვარს Atmel AVR მიკროკონტროლერები! მას შემდეგ რაც ამ ინსტრუქციაში აღწერილი გეტოს განვითარების სისტემა შეიქმნა, მე არ მქონდა გართობის ექსპერიმენტები AVR ATtiny2313 და ATmega168 კერძოდ. მე იქამდეც კი მივედი, რომ დავწერე ინსტრუქცია ჩამრთველების შეყვანისთვის და განვავრცე გეტოს განვითარების სისტემის კონცეფცია CPLD– ზე. ბოლო პროექტის დროს, მე მჭირდებოდა რამდენიმე გადამრთველი საკონტროლო მნიშვნელობების დასადგენად. AVR– ებს არ ჰქონდათ საკმარისი I/O ქინძისთავები, ამიტომ რაღაც უნდა მომეფიქრებინა. შემეძლო შემეცადა კომპლექსური შეყვანის სისტემა კლავიატურითა და ეკრანით, მაგრამ ATtiny2313 რესურსს ამოწურავდა. საბედნიეროდ, Atmel– მა გამოსცა გზა ამ პრობლემის გადასაჭრელად, ინტერფეისის ჩათვლით, რომელსაც შეუძლია დააკავშიროს დამატებითი ჩიპები (როგორიცაა მეხსიერება ან I/O პორტები) მარტივი ორი მავთულის ინტერფეისით. მართალია, AVR– ზე მხოლოდ ორი I/O პინის გამოყენებით ჩვენ შეგვიძლია შევიდეთ ბევრ დამატებით I/O პინში და სხვა რესურსებზეც. ეს ორი მავთულის ინტერფეისი ფორმალურად ცნობილია როგორც ინტეგრირებული მიკროსქემის ავტობუსი, ან უბრალოდ I2C ავტობუსი და გამოიგონეს NXP– მა, როდესაც ის ჯერ კიდევ ფილიპსის ნახევარგამტარები იყო. თუ თქვენ კითხულობთ ამ ინსტრუქციას, თქვენ ალბათ გსმენიათ I2C ავტობუსის შესახებ და შესაძლოა ის PIC- ზე ან სხვა მიკროკონტროლერზეც კი გქონდათ გამოყენებული. მიუხედავად იმისა, რომ კონცეპტუალურად ძალიან მარტივია და მხარს უჭერს ტექნიკური რესურსები AVR– ებზე, პროგრამული უზრუნველყოფის დრაივერები მაინც აუცილებელია გამოიყენონ I2C ავტობუსი. Atmel გთავაზობთ განაცხადის შენიშვნებს (იხილეთ რესურსები ამ ინსტრუქციებში მოგვიანებით), მაგრამ ეს არასრულია და არ აჩვენებს მაგალითებს სხვა AVR მოწყობილობასთან ურთიერთობის მიღმა. ამ ინსტრუქციის მიზანი არ არის ვინმეს ასწავლოს როგორ შექმნას I2C დრაივერები AVR უფრო სწორად, მე მოგაწვდით Atmel დრაივერების გაფართოებულ ვერსიებს ATtiny2313 და ATmega168 მოწყობილობებისთვის, მე ავუხსნი მოთხოვნებს და შეზღუდვებს, რომლებიც გამოიყენება მათი გამოყენებისას და მე გაჩვენებთ I2C მოწყობილობების მუშა მაგალითებს. მას შემდეგ რაც ამ ინსტრუქციულ რეჟიმში იმუშავებთ თქვენ შეძლებთ წარმატებით გამოიყენოთ 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 კბიტი/წამი. ტარიფები 400Kbits/წამში, 1Mbit/წამში და მის ფარგლებს გარეთაც შესაძლებელია, მაგრამ ამ ინსტრუქციის მძღოლების მიერ მხარდაჭერილი არ არის. ყველა I2C მოწყობილობა იმუშავებს 100 კბიტ/წამში. ATtiny2313 და ATmega168 თითოეული განსხვავებულად ახორციელებს I2C ავტობუსს. ATtiny2313 იყენებს უნივერსალური სერიული ინტერფეისის (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 შესაბამისად. ასე რომ, შესაძლო მისამართების დიაპაზონი არის 38 -დან 3F– მდე ჰექსადეციალური, როგორც ეს ნაჩვენებია სხვა ფიგურაში PCA8574 მონაცემთა ფურცლიდან. ასე რომ, მისამართის ბიტის პარამეტრების შეცვლით, 8 PCA8574A– მდე შეიძლება იყოს I2C ავტობუსში ერთდროულად. თითოეული უპასუხებს მხოლოდ თავის კონკრეტულ მონა მისამართს. თუ კიდევ მეტი 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 ბაიტი არის 50h მისამართზე, შემდეგი 256 51h და ასე შემდეგ ბოლო 256 – მდე 57h - სულ 2K ბაიტი. ვინაიდან PCF8570 RAM- ის მისამართი ჩვენ ასევე ვცდილობთ ამ დიაპაზონში, 24C16 და PCF8570 არ შეიძლება გამოყენებულ იქნას ერთად.

ნაბიჯი 2: შეუკვეთეთ რამდენიმე I2C მოწყობილობა

ახლა, როდესაც თქვენ იცით ცოტაოდენი I2C ავტობუსის შესახებ და გსურთ მისი გამოყენება, რატომ არ შეუკვეთოთ I2C მოწყობილობები ექსპერიმენტისთვის, რათა მათ შეძლონ თქვენსკენ მიმავალი პროგრამული უზრუნველყოფის მომზადებისას? შესაბამისი მოწყობილობები მოიცავს I/ O ინტერფეისის გაფართოება (ჩემი საყვარელი), სტატიკური ოპერაცია და EEPROM. კიდევ ბევრია, მაგრამ ეს შესანიშნავი დასაწყისია. AVR პროცესორები, რომელსაც ჩვენ გამოვიყენებთ, არის ATtiny2313 და Atmega168 (გამოიყენება არდუინოში). თუ თქვენ ჯერ ახალი ხართ, გადახედეთ ამ დიდ ინსტრუქციას, რომ გაეცნოთ მათ და შექმნათ თქვენი გეტოს განვითარების სისტემა. ATmega168– ის სქემა წინამდებარე ინსტრუქციებში გვიჩვენებს, თუ როგორ უნდა განხორციელდეს გეტოს განვითარების სისტემა ამ პროცესორისთვის. პარალელური პორტის კაბელი იგივეა, რაც ATtiny2313. (მე არ მიცდია გეტოს განვითარების სისტემის USB ვერსია, ამიტომ არ ვარ დარწმუნებული როგორ არის მასზე წვდომა I2C ავტობუსზე. იგივე Arduino– სთვის.) აქ არის Digikey ნაწილის ნომრები. პორტის გაფართოება: IC I2C I/O გაფართოება 568-4236-5-NDRam: IC SRAM 256X8 W/I2C 568-1071-5-NDEEPROM: IC EEPROM სერიული 16K CAT24C16LI-G-ND

ნაბიჯი 3: I2C დრაივერები

აქ მოცემულია მძღოლის ფუნქციების აღწერა I2C ავტობუსისთვის. ეს შემუშავდა დამწყებთათვის Atmel Apps Notes– ის გამოყენებით. მე არ შემეძლო ამის გაკეთება მათზე დაყრდნობით, როგორც საფუძველი. განვითარება განხორციელდა WinAVR და gcc C შემდგენლის გამოყენებით. საათის სიჩქარის შეზღუდვები აღწერილია ქვემოთ თითოეული პროცესორისთვის. ვინაიდან მე არ შემიძლია შევამოწმო პროცესორის ყველა არომატი / საათის სიხშირის კომბინაცია, მე უბრალოდ დავრჩები იმაში, რისი გამოცდაც შემიძლია და ვცდილობ შეზღუდვები და შეზღუდვები ვაჩვენო. აქ არის მძღოლის ფუნქციები და როგორ გამოვიყენო ისინი. გთხოვთ, დაათვალიეროთ მაგალითები უფრო დეტალურად და ნახოთ ფუნქციები, რომლებიც გამოიყენება სრულ პროგრამებში. ATtiny2313– ისთვის: საათის მოთხოვნა: დრაივერები შექმნილია საათის სიხშირეზე 1MHz (ნაგულისხმევი მაჩვენებელი) ATtiny2313– ისთვის. თუ გსურთ სხვა ტარიფებზე გაშვება, მაშინ დრაივერებში უნდა შეცვალოთ მუდმივები. მომწერეთ ელექტრონული ფოსტით, თუ გჭირდებათ დახმარება ამის გაკეთებაში. თქვენ ასევე შეგიძლიათ მინიშნებების მიღება Atmel პროგრამების ჩანაწერებიდან რესურსების ბმულებში. USI_TWI_Master_Initialise () ეს ფუნქცია ინიციალიზებს USI აპარატურას I2C რეჟიმში მუშაობისთვის. დაურეკეთ მას ერთხელ თქვენი პროგრამის დასაწყისში. ის ბრუნდება ბათილად და არ არსებობს არგუმენტები. ვინაიდან ეს ფუნქცია მხოლოდ შეცდომის კოდს აბრუნებს, მე ვიყენებ ფუნქციას TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) შეცდომის LED განათების მიზნით. შეცდომის კოდები განისაზღვრება 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) ბუფერში ჩადეთ მონა მისამართის პირველი ბაიტი. გადაიტანეთ ერთი ბიტი მარცხნივ და ან წაკითხვის/ჩაწერის ბიტში. გაითვალისწინეთ წაკითხვის/ჩაწერის ბიტი იქნება 1 წაკითხულისთვის და 0 წერისთვის. ეს მაგალითი წაკითხულისთვისაა. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (TRUE << TWI_READ_BIT); 3) ჩაწერისას, ჩადეთ ბაიტი, რომ ჩაწეროთ შემდეგ ადგილას ბუფერში. 4) დარეკეთ USI_TWI_Start_Read_Write ფუნქციით შეტყობინების ბუფერთან და შეტყობინების ზომით არგუმენტებით. Temp = USI_TWI_Start_Read_Write (messageBuf, 2); 5) დაბრუნებული მნიშვნელობა (ამ შემთხვევაში ტემპერატურა) შეიძლება შემოწმდეს, მოხდა თუ არა შეცდომა. თუ ასეა, ის განიხილება, როგორც ზემოთ განხილული. მაგალითები იხილეთ პროგრამებში.6) თუ წაკითხვის მოთხოვნა იყო, ბაიტი წაკითხული იქნება მეორე ადგილას ბუფერში. თუ დაიწერება მრავალი ბაიტი (მაგალითად, მეხსიერების მოწყობილობაზე), იგივე რუტინის გამოყენება შეიძლება. ბუფერის დაყენება და რუტინის გამოძახება ოდნავ განსხვავდება. მეორე ბაიტი ბუფერში იქნება საწყისი მეხსიერების მისამართი, რომელზეც უნდა დავწეროთ. მონაცემები დასაწერი იქნება მომდევნო ბაიტებში. შეტყობინების ზომა იქნება ზომა ყველა მოქმედი მონაცემის ჩათვლით. ასე რომ, თუ 6 ბაიტი უნდა დაიწეროს, მაშინ შეტყობინების ზომა იქნება 8 (მონა მისამართის + მეხსიერების მისამართი + მონაცემების 6 ბაიტი). USI_TWI_Start_Random_Read () ეს ფუნქცია გამოიყენება I2C მოწყობილობიდან მრავალი ბაიტის წასაკითხად, როგორც წესი, ის მხოლოდ მნიშვნელოვანია მეხსიერება ერთგვარი. ამ რუტინის გამოყენება ძალიან ჰგავს წინა რუტინას, ორი გამონაკლისის გარდა. წაკითხვის/ჩაწერის ბიტის პარამეტრს მნიშვნელობა არ აქვს. ამ რუტინის გამოძახება ყოველთვის გამოიწვევს წაკითხვის ოპერაციას. შეტყობინების ზომა უნდა იყოს 2 პლუს წაკითხული ბაიტების რაოდენობა. თუ შეცდომები არ მომხდარა, მონაცემები იქნება მეორე ადგილას დაწყებული ბუფერში. ATmega168: საათის მოთხოვნა: დრაივერები შექმნილია 4MHz საათის სიჩქარით ATmega168– ისთვის. მაგალითი კოდი გვიჩვენებს, თუ როგორ უნდა დავაყენოთ საათის მაჩვენებელი. თუ გსურთ სხვა ტარიფებზე გაშვება, მაშინ დრაივერებში უნდა შეცვალოთ მუდმივები. თუ ამის გაკეთება გჭირდებათ, გამომიგზავნეთ ელ.წერილი. TWI_Master_Initialise () ეს ფუნქცია ინიციალიზებს TWI აპარატურას I2C რეჟიმში მუშაობისთვის. დაურეკეთ მას ერთხელ თქვენი პროგრამის დასაწყისში. ის ბათილად ბრუნდება და არ არსებობს არგუმენტები. დარწმუნდით, რომ ჩართეთ შეფერხებები ინიციალიზაციის შემდეგ swi () - ით დარეკვით. TWI_Get_State_Info () ეს ფუნქცია აბრუნებს I2C შეცდომის ინფორმაციას და გამოიყენება თუ შეცდომა მოხდა I2C გარიგების დროს. ვინაიდან ეს ფუნქცია მხოლოდ შეცდომის კოდს აბრუნებს, მე ვიყენებ ფუნქციას TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) შეცდომის LED განათების მიზნით. შეცდომის კოდები განსაზღვრულია TWI_Master.h- ში, მაგრამ შეცვლილია შეცდომის LED- ზე სიგნალისთვის. დეტალებისთვის იხილეთ მაგალითი კოდი. აი, როგორ დავარქვათ მას: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) გაითვალისწინეთ, რომ შეცდომის შემოწმება ხდება დარწმუნდით, რომ I2C გარიგება დასრულებულია (ქვემოთ აღწერილი ფუნქცია) და შემდეგ ცოტა გლობალური სტატუსის სიტყვაში ტესტირება. TWI_Start_Rrite () ეს ორი ფუნქცია მუშაობს იგივე, რაც ზემოთ აღწერილი შესაბამისი ფუნქციები, მაგრამ რამდენიმე გამონაკლისის გარდა. ისინი არ აბრუნებენ შეცდომების მნიშვნელობას. მონაცემების წაკითხვა არ გადადის ბუფერში. ამის გაკეთება მოხდება შემდეგი აღწერილი ფუნქციით. TWI_Start_Random_Read– ის დარეკვისას შეტყობინება ზომა უნდა იყოს მონაცემთა ბაიტების რაოდენობა მოთხოვნილი პლუს ერთი და არა ორი. ATmega168– ის I2C დრაივერი შეწყვეტილია. ანუ, I2C გარიგებები იწყება და შემდეგ დამოუკიდებლად სრულდება, სანამ ძირითადი რუტინა აგრძელებს მუშაობას. როდესაც მთავარ რუტინას სურს მონაცემები, რომელიც დაიწყო I2C გარიგებიდან, მან უნდა შეამოწმოს, არის თუ არა მონაცემები ხელმისაწვდომი. იგივე სიტუაციაა შეცდომების შემოწმებასთან დაკავშირებით. ძირითადი რუტინა უნდა იყოს დარწმუნებული, რომ I2C გარიგება დასრულებულია შეცდომების შემოწმებამდე. შემდეგი ორი ფუნქცია გამოიყენება ამ მიზნებისათვის. მაგალითის პროგრამები აჩვენებს, თუ როგორ გამოიყენოთ ეს. ეს ფუნქცია დარწმუნდება, რომ I2C გარიგება დასრულებულია მონაცემების გადაცემამდე. მიუხედავად იმისა, რომ მნიშვნელობა ბრუნდება ამ ფუნქციით, მე ვხედავ, რომ შეცდომის ბიტის შემოწმება უფრო საიმედოა. აი როგორ უნდა დაარქვა. შეტყობინების ზომა უნდა იყოს ერთი უფრო დიდი ვიდრე სასურველი მონაცემების ბიტების რაოდენობა. მონაცემები იქნება messageBuf– ში მეორე მდებარეობიდან დაწყებული. Temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

ნაბიჯი 4: ავაშენოთ

ავაშენოთ!
ავაშენოთ!
ავაშენოთ!
ავაშენოთ!
ავაშენოთ!
ავაშენოთ!
ავაშენოთ!
ავაშენოთ!

დაიწყეთ ფაილის გადმოტვირთვით I2C Schematics.zip. შეიძლება დაგჭირდეთ შექმნათ I2C საქაღალდე თქვენს სამუშაო ადგილზე, სქემებისა და პროგრამის მაგალითის ფაილების შესანახად. გახსენით სქემები ამ დირექტორიაში. თქვენ ნახავთ საქაღალდეს სახელწოდებით I2C Schematics. გახსენით ფაილი სახელწოდებით tiny I2C.pdf. ეს სქემატური გვიჩვენებს ATtiny2313 გეტოს განვითარების სისტემას და PCA8574A I/O პორტის გაფართოებას (აქვს დიდი მოწყვეტილი ყუთი მის გარშემო). Port Expander წრე აგებულია პურის დაფაზე. გადახედეთ ფოტოებს, რომ ნახოთ როგორ გამოიყურება ეს სქემები. ისინი მართლაც საკმაოდ მარტივია. სქემატური ATtiny2313 ნაწილი მხოლოდ გეტოს განვითარების სისტემაა სამი მოციმციმე შუქით (LED1, 2 და 3, პლუს R4, 5 და 6) და ღილაკზე დაჭერილი (S1), პლუს ერთი დამატებითი დეტალი. ეს დეტალი არის მხტუნავების დამატება (JP4, 5 და 6), რომელთა ამოღება შესაძლებელია I2C ავტობუსის SCL და SDA ხაზების შეერთების მიზნით. მხტუნავები უნდა იყოს პროგრამირებისათვის, შემდეგ ამოღებული, რათა SCL და SDA იყოს დაკავშირებული. ფოტოებზე გამოსახულია მხტუნავები ადგილზე და ამოღებულია. ამ მხტუნავების განთავსება თქვენზეა, თქვენ უბრალოდ უნდა განათავსოთ ისინი თქვენს გეტოს განვითარების სისტემაში, თუ გსურთ გამოიყენოთ I2C ავტობუსი. I2C ავტობუსი უნდა იყოს გათიშული და მხტუნავები დადგეს პროგრამირებისათვის. გაითვალისწინეთ, რომ თქვენ მხოლოდ უნდა გაინტერესებდეთ JP4 და JP6 I2C ავტობუსისთვის. ჩადეთ JP5, თუ ფიქრობთ, რომ ოდესმე გსურთ SPI ავტობუსის გამოყენება. PCA8574A I/O პორტის გაფართოების პური დაფა ძალიან მარტივია. მიაწოდეთ Vcc (+5 ვოლტი) და Gnd (მიწა) კავშირები და დაუკავშირეთ AD0, 1 და 2 მიწას (ხდის I2C მონა 38 მისამართს). შემდეგ შეაერთეთ 4 მოციმციმე შუქი და 4 DIP კონცენტრატორი. (თუ თქვენ არ გაქვთ DIP კონცენტრატორები, შეგიძლიათ უბრალოდ გამოიყენოთ მავთულები. მიამაგრეთ მიწასთან ან დატოვეთ მცურავი სიგნალის ჩართვის ან გამორთვის შესაბამისად.) დაბოლოს, დაუკავშირეთ გამწევ რეზისტორებს (R11 და 12) SDA და SCL– დან Vcc– ზე. ეს ნაჩვენებია როგორც 3.3K, მაგრამ ნებისმიერი მნიშვნელობა 1.8K– დან 5.1K– მდე უნდა მუშაობდეს (შესაძლოა 10K– მდე, მაგრამ მე არ მიცდია ეს). მას შემდეგ რაც დაპროგრამებული გაქვთ ATtiny2313 შეგიძლიათ ამოიღოთ მხტუნავები და დააკავშიროთ ტესტირებისთვის SDA და SCL. ახლა კი ATmega168. ერთადერთი ნაკლი ის არის, რომ თქვენ შეიძლება არ გქონდეთ აშენებული გეტოს განვითარების სისტემა ამ პროცესორისთვის. თუ ეს ასეა, მაშინ სქემატური მე (MEGA I2C.pdf) გაჩვენებთ როგორ. ეს არის ATtiny2313 ვერსიის მხოლოდ ჩანაცვლება. თუ წინასწარ გეგმავთ, შეგიძლიათ დარწმუნდეთ, რომ თქვენი პროგრამირების კაბელი ორივე სისტემას მოერგება. მთავარი განსხვავება არის C2 და C3 დამატება. იხილეთ სურათები მათი განთავსებისთვის, ისინი ძალიან ახლოს უნდა იყოს ჩიპთან; ერთი მათგანი რეალურად ჩიპის ქვეშ არის. ეს ხელს უწყობს ხმაურის შენარჩუნებას განსაკუთრებით ანალოგიურ ციფრულ გადამყვანზე. თქვენ არ გჭირდებათ მხტუნავების ჩასმა, თუ არ აპირებთ SPI ავტობუსის გამოყენებას, რადგან ისინი არ არის საჭირო ამ ჩიპზე I2C ავტობუსისთვის. გაითვალისწინეთ, რომ PCA8754A breadboard უცვლელი იქნება. თქვენ უბრალოდ შეაერთებთ SDA და SCL და წახვალთ! ადვილია, არა?

ნაბიჯი 5: მოდით კოდირება და ტესტი

მოდით კოდირება და ტესტი!
მოდით კოდირება და ტესტი!
მოდით კოდირება და ტესტი!
მოდით კოდირება და ტესტი!
მოდით კოდირება და ტესტი!
მოდით კოდირება და ტესტი!

დროა შევქმნათ დრაივერები და მაგალითი პროგრამები. ჩვენ დავიწყებთ ATtiny2313 და PCA8574A breadboard, რომელიც ჩვენ ახლახანს ავაშენეთ. ჩამოტვირთეთ ფაილი I2C.zip თქვენს I2C სამუშაო დირექტორიაში და გახსენით იგი. თქვენ გექნებათ ახალი საქაღალდე სახელწოდებით I2C. მასში ნახავთ USI I2C (ATtiny2313) და TWI I2C (ATmega168). USI I2C– ში ნახავთ I_O პორტის საქაღალდეს. ეს საქაღალდე შეიცავს კოდს ჩვენი პირველი მაგალითის პროგრამისთვის და USI I2C დრაივერებისთვის. WinAVR- ის გამოყენებით შეადგინეთ და ჩატვირთეთ კოდი ATtiny2313. ღრმად ჩაისუნთქეთ და ჩართეთ ძალა. აი რას უნდა ელოდოთ: ჩართვისას, LED 1 პორტის PD6 of ATtiny2313 ორჯერ აციმციმდება. სხვა არაფერი მოხდება, სანამ არ დააჭერთ ღილაკს (S1). ყოველ ჯერზე ღილაკზე დაჭერისას გადამრთველები იკითხება და მათი პარამეტრი გამოჩნდება PCA8574A- თან დაკავშირებულ LED- ებზე. შეცვალეთ კონცენტრატორების მნიშვნელობა, დააჭირეთ ღილაკს და LED- ები უნდა შეიცვალოს. განაგრძეთ ეს მანამ, სანამ არ დაასრულებთ მისი მუშაობის მხიარულებას. თუ (ღმერთმა ნუ ქნას!) ყველაფერი ისე არ გამოვიდა, როგორც მოსალოდნელი იყო, ყურადღებით შეამოწმეთ თქვენი გაყვანილობა. I2C შეცდომები იქნება სიგნალიზებული მოციმციმეზე LED3 (PD4) და ალბათ ნიშნავს იმას, რომ თქვენ უნდა შეამოწმოთ, რომ SDA და SCL დაკავშირებულია სწორ ქინძისთავებთან და სწორად არის გამოყვანილი.თუ რამე მაინც არ მუშაობს, წაიკითხეთ დანარჩენი ნაწილი, რომ გაიგოთ გამართვის შესახებ. ახლა დაბრუნდით და მოდით შევხედოთ კოდს. გახსენით ფაილი USI_I2C_Port.c. ეს არის პროგრამის მაგალითი. (USI_TWI_Master.c და USI_TWI_Master.h შეიცავს დრაივერებს - შეგიძლიათ იგნორირება გაუკეთოთ მათ, თუ არ გაინტერესებთ.) გამოიყენეთ მაგალითი თქვენი I2C პროგრამების წარსადგენად. ძირითადად, პროგრამა გიჩვენებთ როგორ დაიწყოთ და გამოიყენოთ I2C დრაივერები, მათ შორის პარამეტრი მონის მისამართი და შეტყობინების ბუფერის დანარჩენი ნაწილი და მონაცემების ამოღება. თქვენ ასევე ნახავთ, როგორ ვახერხებ ღილაკის დენონსირებას და დროის მარყუჟის დაყენებას. პროგრამის რამდენიმე დეტალია აღსანიშნავი. გაითვალისწინეთ, რომ კონცენტრატორების მონაცემები შებრუნებულია მანამ, სანამ არ დაიწერება პორტ Expander- ის LED- ებზე. ასევე გაითვალისწინეთ, რომ პორტის გაფართოებაზე შემავალი პორტები უნდა იყოს დაწერილი როგორც მაღალი, რათა სწორად იმუშაონ. ეს დეტალები აღწერილია PCA8574A მონაცემთა ფურცელში. ყოველთვის ყურადღებით წაიკითხეთ მონაცემთა ფურცლები! უფრო საინტერესოა პირობითი გამართვის გამოყენება. პროგრამის ფაილის დაწყებისთანავე არის განცხადება // #define DEBUG და მთელ კოდში მოთავსებულია #ifdef DEBUG განცხადებები. სანამ DEBUG არ არის განსაზღვრული (ორი დახრილი ხაზი ხდის კომენტარს და იცავს მას განსაზღვრისგან), კოდი #ifdef to #endif განცხადებებში არ იქნება შედგენილი. მაგრამ თუ ყველაფერი ისე არ გამოდგება, როგორც თქვენ მოელით, გადააკეთეთ და გადატვირთეთ კოდი #define DEBUG– ით, კომენტარის გარეშე. თქვენ გაცილებით მეტ ციმციმს მიიღებთ LED- ებზე, რომელთა გაშიფვრა შეგიძლიათ თქვენი პროგრამის შესრულების თვალყურის დევნებაში და დაგეხმარებით ზუსტად იპოვოთ ის, სადაც არასწორია. სინამდვილეში, მე გირჩევთ სცადოთ ეს, რათა ნახოთ რა მოხდება. რასაც დაინახავთ არის ის, რომ LED 2 (PD5– ზე) აციმციმდება პროგრამის შესრულების პროცესში. კონცენტრატორებიდან წაკითხული მნიშვნელობა აციმციმდება LED 1 -ზე (PD6) სანამ გამოჩნდება პორტის გაფართოების LED- ებზე. თქვენ უნდა შეგეძლოთ თვალყური ადევნოთ პროგრამას ამ LED- ების გამოყენებით. ჩვენ ვიმუშავებთ ATmega168– თან შემდეგ; გამოტოვეთ ეს განყოფილება, თუ თქვენ დაინტერესებული ხართ მხოლოდ ATtiny2313. ისევ ჩემთან? კარგი გადადით TWI_I2C საქაღალდეში, შეცვალეთ თქვენი სამუშაო დირექტორია IO_Port და შეადგინეთ და ჩატვირთეთ TWI_I2C_Port.c ATmega168– ში. გათიშეთ SDA და SCL ხაზები ATtiny2313– დან და შეაერთეთ ისინი ATmega168– თან. შეაერთეთ ძალა და მიწა და გაძლიერდით. ოპერაცია იგივე უნდა იყოს! ითამაშეთ სანამ მღელვარება არ ჩაცხრება, შემდეგ შევხედოთ კოდს. გახსენით TWI_I2C_Port.c. კოდი თითქმის იდენტურია, გარდა შეცდომების დამუშავებისა და შეფერხებული დრაივერების გათვალისწინებისა. აქ არის განსხვავებები: გაითვალისწინეთ, რომ საათი უნდა იყოს მითითებული 4 მჰც -ზე, რომ I2C ავტობუსი სწორად იმუშაოს. სეი (); განცხადება ჩართავს შეფერხებებს I2C დრაივერების ინიციალიზაციის შემდეგ. შეცდომების შესამოწმებლად, ტესტირდება კონკრეტული სტატუსის ბიტი. წაკითხვის დროს, TWI_Read_Data_From_Buffer ფუნქცია უნდა გამოიძახოს, რათა წაკითხული მონაცემები გადაიგზავნოს შეტყობინების ბუფერში. ჩაწერის დროს, სანამ (TWI_Transceiver_Busy ()) უნდა იქნას გამოყენებული, რომ დარწმუნდეთ, რომ გადაცემა დასრულებულია შეცდომების შემოწმებამდე. ეს ბოლო ორი ფუნქცია აღწერილია ზემოთ დრაივერების აღწერილობაში. ამის გარდა, კოდი თითქმის იგივეა, რაც ATtiny2313– ისთვის. DEBUG იგივე მუშაობს, თუ გსურთ ამის ექსპერიმენტი.

ნაბიჯი 6: I2C მეხსიერების გამოყენება

I2C მეხსიერების გამოყენება
I2C მეხსიერების გამოყენება
I2C მეხსიერების გამოყენება
I2C მეხსიერების გამოყენება
I2C მეხსიერების გამოყენება
I2C მეხსიერების გამოყენება
I2C მეხსიერების გამოყენება
I2C მეხსიერების გამოყენება

ახლა, როდესაც ჩვენ ვისწავლეთ I2C ავტობუსის გამოყენება I/O პორტის გაფართოების წასაკითხად და დასაწერად, მოდით გადავიდეთ I2C მეხსიერების გამოყენებაზე, როგორც RAM ასევე EEPROM. მთავარი განსხვავება ისაა, რომ რამოდენიმე ბაიტი შეიძლება წაიკითხოს ან დაიწეროს მოგონებებიდან ერთი I2C ბრძანებით. იმისათვის, რომ მოვემზადოთ ამ ექსპერიმენტებისთვის, ჩვენ უნდა შევცვალოთ აპარატურა და შევქმნათ რამოდენიმე ახალი სქემა პურის დაფაზე. შეინახეთ Port Expander ჩართვა, რადგან ჩვენ მას გამოვიყენებთ მეხსიერების ზოგიერთი მნიშვნელობის გამოსახატავად. ამოიღეთ DIP კონცენტრატორები PCA8574A– დან და განათავსეთ მოციმციმე ნათურები იმ ქინძისთავებზე. თუ არ გაქვთ საკმარისი მოციმციმე ნათურები, გადაიტანეთ ისინი P4– დან P7– ზე P0– დან P3– მდე. (ჩვენების მნიშვნელობები საკმაოდ მცირეა.) ახლა შეხედეთ სქემატურ I2C Ram.pdf- ს და შეაერთეთ PCF8570 პურის დაფაზე. ასევე გადახედეთ სურათს. დარწმუნდით, რომ მიამაგრეთ pin 7 Vcc– სთან. გაუშვით მავთულები SDA და SCL PCA8574A– დან. დამატებითი გამწევ რეზისტორები არ არის საჭირო. თუ თქვენ ასევე დაინტერესებული ხართ EEPROM– ით, ააშენეთ ეს წრე ასევე I2C EEPROM.pdf 24C16– ისთვის, მაგრამ გაფრთხილებთ, რომ მაგალითი იყენებს ATmega168. ეს წრე მართლაც მარტივია. როგორც ზემოთ განვიხილეთ, მისამართის ბიტები იგნორირებული უნდა იყოს. უბრალოდ შეაერთეთ ძალა და მიწა. არ დაუკავშიროთ SDA და SCL მხოლოდ მას შემდეგ, რაც ჩვენ არ დავასრულეთ ექსპერიმენტი Ram– ით. ჩვენ დავიწყებთ მეხსიერების ექსპერიმენტებს ATtiny2313– ით, რომელიც დაკავშირებულია PCA8574A პორტის გაფართოებასთან და PCF8570 Ram– თან. პროგრამა ჩაწერს რამოდენიმე ნომერს Ram- ზე, შემდეგ წაიკითხავს და აჩვენებს პორტის გაფართოებაზე. შეცვალეთ თქვენი სამუშაო დირექტორია ოპერატიული მეხსიერებით USI I2C. გამოიყენეთ make ფაილი USI_I2C_RAM.c– ს შესადგენად და გადმოსაწერად. გაითვალისწინეთ, რომ I2C დრაივერის ფაილები იდენტურია იმ ფაილებისა, რომლებიც ადრე გამოვიყენეთ. ჩართეთ ძალა და თქვენ უნდა ნახოთ ერთი მოციმციმე LED 1 -ზე (PD6). მონაცემები ჩაიწერება მეხსიერების პირველ 4 ბაიტზე. დააჭირეთ ღილაკს და ორი ბაიტი წაიკითხება და გამოჩნდება. თქვენ უნდა ნახოთ ერთი LED შუქი პორტის გაფართოებაზე (P0), ორი წამიანი პაუზა, შემდეგ ორი LED ნათურა (P0 და P1). კიდევ ორი წამიანი პაუზა და LED- ები უნდა გამორთოთ. კვლავ დააჭირეთ ღილაკს, რომ დაიწყოთ თანმიმდევრობა. გამართვა მსგავსია ზემოთ აღწერილი მეთოდისა. მოდით შევხედოთ კოდს. გახსენით USI_I2C_RAM.c. ის საკმაოდ ჰგავს წინა კოდს. ძირითადი განსხვავებები არის კითხვისა და წერის მეხსიერების დეტალები. შეხედეთ როგორ იტვირთება შეტყობინების ბუფერი ზარამდე, რომელიც რეალურად წერს. პირველი ბაიტი არის მონა მისამართი, სადაც წაკითხვის/ჩაწერის ბიტი სათანადოდ არის დაყენებული. მაგრამ შემდეგი ბაიტი არის მეხსიერების მისამართი, სადაც უნდა დაიწყოთ მონაცემების წერა. შემდეგ მოდის ფაქტობრივი მონაცემების ბაიტები, რომლებიც თანმიმდევრულად იტვირთება მეხსიერებაში ჩვენს მიერ მითითებული მისამართიდან. ჩვენ განვსაზღვრავთ შეტყობინების ზომას 6. ასე რომ, ჩვენ ვიწყებთ წერას 00 -ში და ვწერთ მნიშვნელობებს 01, 03, 02 და 06 მეხსიერების ადგილას 00 -დან 03 -მდე. მეხსიერებიდან მონაცემების წასაკითხად უნდა გამოვიყენოთ USI_TWI_Start_Random_Read ფუნქცია. შეტყობინების ბუფერი იღებს მონა მისამართს პირველ ბაიტში და საწყისი მისამართს მეორე ბაიტში. შემდეგ დაურეკეთ ფუნქციას შეტყობინების ზომით, რომელიც მითითებულია წაკითხვის ბაიტების პლუს 2. გაითვალისწინეთ, რომ წაკითხვის/ჩაწერის ბიტს არ აქვს მნიშვნელობა, რადგან წაკითხვის მიუხედავად, იგი შესრულდება. დაბრუნებული მონაცემები დაიწყება შეტყობინებების ბუფერში მეორე ადგილას. მონაცემების წაკითხვის შემდეგ, ის გადაბრუნებულია პორტის გაფართოებაზე გამოსაჩენად და ერთდროულად იწერება მასზე ერთი პაიტით მნიშვნელობებს შორის პაუზით. დაბოლოს, Port Expander LED- ები გამორთულია. პორტი Expander– ისთვის დაწერილი იდენტურია იმისა, რაც გაკეთდა წინა მაგალითებში. გასართობად, თქვენ შეგიძლიათ შეაფასოთ #განსაზღვრეთ DEBUG განცხადება ზემოთ და ნახოთ ბევრი მოციმციმე LED. მორიგი წარმატებული ექსპერიმენტის შემდეგ აღელვებით აღელვებული, გადავიდეთ ATmega168 და EEPROM– ზე. შეცვალეთ თქვენი სამუშაო დირექტორია EEPROM– ით TWI I2C– ის ქვეშ. გამოიყენეთ make ფაილი TWI_I2C_EEPROM.c შედგენისა და გადმოსაწერად. გაითვალისწინეთ, რომ I2C დრაივერის ფაილები იდენტურია იმ ფაილებისა, რომლებიც ადრე გამოვიყენეთ PCA8574A– სთვის. პროგრამის შესამოწმებლად გათიშეთ ATtiny2313 და შეაერთეთ ATmega168. დატოვეთ I2C ავტობუსი RAM– ზე და მიირთვით. შედეგები განსხვავებულია, რადგან ჩვენ ახლა ვწერთ და ვკითხულობთ მეტ მონაცემებს. PD7– ზე LED 1 უნდა აინთოს ინიციალიზაციისას. დააჭირეთ ღილაკს და მონაცემები წაიკითხება მეხსიერებიდან და გამოჩნდება. LED– ები PCA8574– ზე უნდა აციმციმდეს შემდეგი თანმიმდევრობით: 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- ს. მასზე წვდომა შესაძლებელია 256 ბაიტის ნაწილად 8 სხვადასხვა I2C მონა მისამართებზე. ნახეთ, როგორ არის განსაზღვრული MEMORY_ADDR, როგორც საწყისი მისამართი 50 თექვსმეტობით; ამიტომაც მუშაობდა ვერძი. თუ გსურთ 24C16– ის სხვა ბლოკებზე წვდომა, მაშინ გამოიყენეთ სხვა მისამართები, როგორც მე აღვნიშნე. შეხედეთ როგორ შევქმენი მეხსიერებაში დასაწერად. თავდაპირველად მონა მისამართს წაკითხვის/ჩაწერის ბიტის ნაკრებით მოთავსებულია ბუფერში, შემდეგ 00 – ის საწყისი მისამართი, შემდეგ მონაცემების 16 ბაიტი. ფუნქცია TWI_Start_Read_Write იძახება მონაცემების დასაწერად (როგორც ადრე), როდესაც შეტყობინების ზომა მითითებულია 18. როდესაც ღილაკს დააჭირეთ, ჩვენ ვიყენებთ TWI_Start_Random_Read და TWI_Read_Data_From_Buffer მონაცემების დასაკითხად. ყოველი მესამე ბაიტი ნაჩვენებია პორტის გაფართოების 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: შენიშვნები გიკებისთვის

ნამდვილი გიკისთვის, რომელსაც სურს იცოდეს დეტალები, აქ არის რამოდენიმე რამ, რაც უნდა გახსოვდეთ, თუ გადახედავთ Atmel Apps Notes და მძღოლის კოდს:- I2C მოწყობილობის მიმართვისა და ბრძანების მეთოდი არ არის სპეციფიკაციის ნაწილი! გარდა მონა მისამართისა და ბიტის წაკითხვის/ჩაწერისა, ბრძანებები, რეჟიმები და სხვა არ არის მითითებული და სპეციფიკურია მოცემული მოწყობილობისთვის. ამის გასაგებად, გაითვალისწინეთ, რომ ატმელის მაგალითში გამოყენებული სქემა მხოლოდ იმ მაგალითზე ვრცელდება და საკმაოდ არასტანდარტულია.- USI განხორციელება განსხვავდება TWI განხორციელებისგან რამდენიმე მნიშვნელოვანი თვალსაზრისით. + USI– ით, საათის დარეგულირება უზრუნველყოფილია პროგრამული უზრუნველყოფით; TWI– ით იგი უზრუნველყოფილია Bit Rate Generator– ით. + USI მეთოდი არ იყენებს შეფერხებებს; TWI აკეთებს. ეს გარკვეულწილად აზრიანია, რადგან მეგას ოჯახი (TWI– ს გამოყენებით) შეიძლება აკეთებდეს უამრავ სხვა რამეს და არ უნდა ჩაითრიოს I2C გადაცემებით. შეწყვეტა ორიენტირებული ვერსია USI რა თქმა უნდა შესაძლებელია, ის უბრალოდ არ გამოიყენება ამ Instructable. + USI აპარატურა არ არის ოპტიმიზირებული I2C– სთვის და შეუძლია მხოლოდ 8 ბიტიანი გადაცემა. ეს ნიშნავს, რომ მეცხრე ბიტის გასაგზავნად ორი გადაცემაა საჭირო (ან NACK ან ACK). TWI აპარატურა ამუშავებს ამას ავტომატურად. ეს ართულებს USI დრაივერის განხორციელებას. + TWI– ს შეცდომის გამოვლენა ხდება ტექნიკაში. USI მოითხოვს პროგრამულ უზრუნველყოფას, რაც გარკვეულწილად ართულებს საქმეს. + TWI აპარატურა პირდაპირ აკონტროლებს პორტის კონფიგურაციას. USI აპარატურა მოითხოვს პორტის ბიტების კონფიგურაციას პორტის გამოყენებამდე. თქვენ ნახავთ ამას Master_Initialize რუტინაში USI. მე არ მიპოვია გზა, რომ ეს მიდგომა იმუშაოს. ორი გარე რეზისტორის გამოყენება საკმაოდ მარტივ სქემას ჰგავს, ამიტომ ამაზე ბევრი დრო არ დამიხარჯავს.

გირჩევთ: