Satura rādītājs:

I2C autobuss ATtiny un ATmega: 8 soļi
I2C autobuss ATtiny un ATmega: 8 soļi

Video: I2C autobuss ATtiny un ATmega: 8 soļi

Video: I2C autobuss ATtiny un ATmega: 8 soļi
Video: TWI and RTC DS1307 (I2C) 🔴 ATmega328P Programming #11 AVR microcontroller with Atmel Studio 2024, Jūlijs
Anonim
I2C autobuss ATtiny un ATmega
I2C autobuss ATtiny un ATmega

Man patīk Atmel AVR mikrokontrolleri! Kopš šajā instrukcijā aprakstītās Ghetto attīstības sistēmas izveides man nav bijis prieka eksperimentēt ar AVR ATtiny2313 un jo īpaši ar ATmega168. Es pat aizgāju tik tālu, ka uzrakstīju pamācību, izmantojot slēdžus kā ievadi, un paplašināju Ghetto Development System koncepciju uz CPLD. Nesenā projekta laikā man vajadzēja vairākus slēdžus kontroles vērtību iestatīšanai. AVR nebija pietiekami daudz I/O tapu, tāpēc man bija kaut kas jāizdomā. Es būtu varējis izmēģināt sarežģītu ievades sistēmu ar tastatūru un displeju, bet ATtiny2313 būtu beigušies resursi. Par laimi, Atmel ir nodrošinājis veidu, kā novērst šo problēmu, iekļaujot saskarni, kas var savienot ar papildu mikroshēmām (piemēram, atmiņu vai I/O portiem) ar vienkāršu divu vadu saskarni. Tieši tā, izmantojot tikai divus I/O tapas AVR, mēs varam piekļūt daudziem papildu I/O tapām un citiem resursiem. Šo divu vadu saskarni oficiāli sauc par integrētās shēmas kopni vai tikai I2C kopni, un to izgudroja NXP, kad tā vēl bija Philips Semiconductors. Ja jūs lasāt šo pamācību, jūs, iespējams, esat dzirdējuši par I2C kopni un, iespējams, pat izmantojuši to PIC vai citā mikrokontrollerī. Lai gan konceptuāli ļoti vienkāršs un to atbalsta aparatūras resursi AVR, programmatūras draiveri joprojām ir nepieciešami, lai izmantotu I2C kopni. Atmel nodrošina lietojumprogrammu piezīmes (skatīt resursus vēlāk šajā pamācībā), taču tās ir nepilnīgas un neuzrāda nekādus piemērus, izņemot saziņu ar citu AVR ierīci. Šīs instrukcijas mērķis nav iemācīt ikvienam izveidot I2C draiverus AVR. Drīzāk es sniegšu paplašinātas Atmel draiveru versijas ierīcēm ATtiny2313 un ATmega168, es izskaidrošu prasības un ierobežojumus, kas tiek piemēroti, tos lietojot, un parādīšu I2C ierīču darba piemērus. Kad būsit strādājis ar šo pamācību, varēsit veiksmīgi izmantot I2C kopni savos AVR projektos. Acīmredzot jūs varat ignorēt sīko vai MEGA draiverus, ja jūs interesē tikai viens no tiem. Tiem, kas vēlas uzzināt vairāk par I2C autobusu, es sniegšu saites uz atbilstošu materiālu.

1. solis: Kas ir šis I2C sīkums?

Kas ir šis I2C sīkums?
Kas ir šis I2C sīkums?
Kas ir šis I2C sīkums?
Kas ir šis I2C sīkums?
Kas ir šis I2C sīkums?
Kas ir šis I2C sīkums?
Kas ir šis I2C sīkums?
Kas ir šis I2C sīkums?

I2C kopne ir vienkāršs divu vadu savienojums, kas var savienot vairākas ierīces un ļaut tām apmainīties ar datiem. Vienkāršākajā formā ir viena galvenā ierīce, kas sazinās ar vairākām vergu ierīcēm. Visas ierīces ir savienotas paralēli diviem I2C kopnes vadiem. Abi vadi ir pazīstami kā SCL un SDA. SCL ir pulksteņa līnija, un to kontrolē galvenā ierīce. SDA ir divvirzienu datu līnija. Lai pārsūtītu datus, kapteinis izsūta verga adresi kopā ar viena bita lasīšanas/rakstīšanas karodziņu. Ja ir vēlama rakstīšana, kapteinis turpinās sūtīt datus adresētajam vergam. Ja tiek pieprasīta lasīšana, vergs atbildēs ar datiem. Lai koordinētu darījumus, kapteinis un palīgs manipulē ar SCL un SDA līnijām, lai signalizētu par vairākiem nosacījumiem. Tie ietver START, STOP, ACK (apstiprina) un NAK (nav apstiprinājuma). Sīkāku informāciju par šiem nosacījumiem apstrādā autovadītāji. Patiesie geeks starp jums var uzzināt visu informāciju saitēs, kas sniegtas šīs instrukcijas beigās. Elektriskās prasības ir diezgan vienkāršas. Kapteinim un vergiem jāizmanto vienāds līmenis Vcc, pamatnei jābūt savienotai, un SCL un SDA līnijām jābūt pavilktām līdz Vcc. Pievilkšanas rezistoru vērtību precīzi nosaka aprēķins, pamatojoties uz kopnes kopējo kapacitāti, taču praktiski tā var būt gandrīz jebkura vērtība no 1,8K līdz 10K. Es sāku ar 5.1K un izmantoju zemākas vērtības, līdz tas darbojas. Tas parasti nav problēma, ja vien starp ierīcēm nav daudz ierīču vai garu vadu. Nominālais datu pārraides ātrums I2C kopnē ir 100 KB/s. Ir iespējami arī ātrumi 400 KB/sekundē, 1 Mb/s un vairāk, taču šīs instrukcijas draiveri tos neatbalsta. Visas I2C ierīces darbosies ar ātrumu 100 Kb/s. ATtiny2313 un ATmega168 katrs atšķirīgi ievieš I2C kopni. ATtiny2313 izmanto Universal Serial Interface (USI) aparatūru - to var izmantot arī SPI kopnei. ATmega168 ir speciāla aparatūra I2C kopnei, kas pazīstama kā divu vadu saskarne (TWI). Kad draiveri ir uzrakstīti, šīs atšķirības lietotājam lielākoties ir pārskatāmas. Viena būtiska atšķirība ir programmatūrā: ATmega168 I2C draiveris tiek darbināts ar pārtraukumu, bet ATtiny2313 nav. Tas nozīmē, ka programmai ATmega168 nav jāgaida, līdz notiek I2C datu pārsūtīšana, bet tikai jāgaida, pirms tiek sākta cita pārsūtīšana, vai līdz brīdim, kad tiek saņemti dati no lasīšanas operācijas. Sekojošajiem piemēriem un diskusijām vajadzētu to skaidri pateikt. I2C adreses ir 7 bitu garas, tāpēc kopnē var atrasties līdz 127 ierīcēm, ja katrai ir unikāla adrese. Kā parādīts attēlā, šī 7 bitu adrese tiek pārvietota pa kreisi par vienu bitu, un vismazāk nozīmīgais bits tiek izmantots, lai atzīmētu ierīces lasīšanu vai rakstīšanu adresē. Tādējādi pilnīga vergu adrese ir 8 bitu baits. Faktiskā adrese ir daļēji noteikta ierīces iekšienē, un to nevar mainīt (4 nozīmīgākie biti), un daļēji nosaka biti, kas var būt savienoti ar ierīces tapām (3 vismazāk nozīmīgie biti), kurus var sasaistīt augstu vai zemu, lai iestatītu konkrētu adresi. Izklausās mulsinoši, bet piemērs to skaidri pateiks. PCA8574A datu lapa parāda, ka četri nozīmīgākie I2C adreses biti vienmēr būs 0111. Nākamos trīs bitus nosaka AD0, AD1 un AD2 tapu iestatījumi. Šīs tapas var piesiet pie zemes vai pie pozitīvā sprieguma (5 volti), lai attiecīgi attēlotu 0 vai 1. Tātad iespējamo adrešu diapazons ir no 38 līdz 3F heksadecimāls, kā parādīts citā attēlā no PCA8574 datu lapas. Tātad, mainot adreses bitu iestatījumus, I2C kopnē vienlaikus var atrasties līdz 8 PCA8574A. Katrs atbildēs tikai uz savu vergu adresi. Ja ir nepieciešams vēl vairāk I/O portu, var izmantot PCA8574. Vienīgā atšķirība starp PCA8574 un PCA8574A ir tā, ka PCA8574 I2C vergu adrešu diapazons ir no 20 līdz 27 heksadecimāliem. Noteiktas ierīces adreses noteikšana var būt mulsinoša, jo dažas datu lapas uzskata, ka lasīšanas/rakstīšanas bits ir daļa no adrese. Uzmanīgi izlasiet datu lapu un paturiet prātā, ka verga adrese būs 7 bitu gara. Lasīšanas/rakstīšanas bits jāapstrādā atsevišķi. Atkal palīdzēs piemērs. 24C16 EEPROM datu lapā, ar kuru mēs eksperimentēsim, teikts, ka pirmie (visnozīmīgākie) četri vergu adreses biti ir 1010. Nākamos trīs bitus var noteikt pēc A0, A1 un A2; taču ņemiet vērā, ka datu lapa aptver arī 24C01 līdz 24C08, kas ir mazāka izmēra EEPROM. Attēls no datu lapas parāda, ka šo adrešu bitu iestatījumi tiek ignorēti, palielinoties izmēram, un tiek pilnībā ignorēti 24C16. Tas ir, pēdējiem trim bitiem nav nozīmes, un 24C16 patiešām izmanto visas I2C vergu adreses no 50 līdz 57 heksadecimālām. Vergu adrešu diapazons faktiski attieksies uz dažādām 24C16 sadaļām. Pirmie 256 baiti atrodas adresē 50h, nākamie 256 - 51h un tā tālāk līdz pēdējiem 256 pie 57h - kopā 2K baiti. Tā kā PCF8570 RAM adrese, ar kuru arī eksperimentējam, ir šajā diapazonā, 24C16 un PCF8570 nevar izmantot kopā.

2. darbība: pasūtiet dažas I2C ierīces

Tagad, kad jūs mazliet zināt par I2C kopni un vēlaties to izmantot, kāpēc nepasūtīt dažas I2C ierīces, lai tās varētu eksperimentēt, lai tās varētu būt ceļā pie jums, kamēr gatavojat programmatūru? Piemērotās ierīcēs ietilpst I/ O interfeisa paplašinātājs (mans iecienītākais), statiskais ram un EEPROM. Ir daudz vairāk, bet tas ir lielisks sākums. Mēs izmantosim AVR procesorus ATtiny2313 un Atmega168 (izmanto Arduino). Ja esat iesācējs, ieskatieties šajā lieliskajā instrukcijā, lai uzzinātu par tiem un izveidotu savu Ghetto attīstības sistēmu. ATmega168 shēma šajā instrukcijā parāda, kā šim procesoram ieviest Ghetto izstrādes sistēmu. Paralēlā porta kabelis ir tāds pats kā ATtiny2313. (Es neesmu izmēģinājis Ghetto Development System USB versiju, tāpēc es neesmu pārliecināts, kā tajā var piekļūt I2C kopnei. Tas pats attiecas uz Arduino.) Šeit ir Digikey detaļu numuri. Ostas paplašinātājs: 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. darbība: I2C draiveri

Šeit ir I2C kopnes vadītāja funkciju apraksti. Tie tika izstrādāti, izmantojot Atmel Apps Notes iesācējiem. Es nevarētu to izdarīt bez viņiem kā pamatu, uz kura balstīties. Izstrāde tika veikta, izmantojot WinAVR un gcc C kompilatoru. Tālāk ir aprakstīti pulksteņa ātruma ierobežojumi katram procesoram. Tā kā es nevaru pārbaudīt visas iespējamās procesora garšas / pulksteņa ātruma kombinācijas, es tikai pieturēšos pie tā, ko es faktiski varu pārbaudīt, un mēģināšu norādīt ierobežojumus un ierobežojumus. Šeit ir draivera funkcijas un to izmantošana. Lūdzu, skatiet piemērus, lai iegūtu sīkāku informāciju un redzētu funkcijas, kas tiek izmantotas pilnās programmās. ATtiny2313: prasība pēc pulksteņa: draiveri ir paredzēti 1MHz (noklusējuma) frekvencei ATtiny2313. Ja vēlaties darboties ar citiem ātrumiem, jums būs jāpielāgo draiveru konstantes. Nosūtiet man e -pastu, ja jums nepieciešama palīdzība to izdarīt. Varat arī iegūt dažus padomus no Atmel lietotņu piezīmēm resursu darbības saitēs. USI_TWI_Master_Initialise () Šī funkcija inicializē USI aparatūru I2C režīma darbībai. Zvaniet vienreiz programmas sākumā. Tas atgriež tukšu un nav argumentu. USI_TWI_Get_State_Info () Šī funkcija atgriež informāciju par I2C kļūdu un tiek izmantota, ja I2C darījuma laikā radās kļūda. Tā kā šī funkcija atgriež tikai kļūdas kodu, es izmantoju funkciju TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg), lai mirgo kļūdas gaismas diode. Kļūdu kodi ir definēti USI_TWI_Master.h. Lūk, kā to nosaukt: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () Šī funkcija tiek izmantota, lai lasītu un rakstītu atsevišķus baitus I2C ierīcēs. To izmanto arī, lai rakstītu vairākus baitus. Lai izmantotu šo funkciju, ir 6 soļi.1) Deklarējiet ziņu buferi savā programmā, lai turētu vergu adresi un nosūtāmo vai saņemamo datu baitu. unsigned char messageBuf (MESSAGEBUF_SIZE); 2) Ievietojiet vergu adresi kā pirmo baitu buferī. Pārvietojiet to vienu bitu pa kreisi un VAI lasīšanas/rakstīšanas bitā. Ņemiet vērā, ka lasīšanas/rakstīšanas bits būs 1 lasīšanai un 0 rakstīšanai. Šis piemērs ir paredzēts lasīšanai. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (PATIESA << TWI_READ_BIT); 3) Veicot rakstīšanu, ievietojiet ierakstāmo baitu nākamajā bufera vietā. 4) Izsauciet funkciju USI_TWI_Start_Read_Write ar ziņojuma buferi un ziņojuma lielumu kā argumentus. atgriezto vērtību (šajā gadījumā - temp) var pārbaudīt, vai nav radusies kļūda. Ja tā, tad to apstrādā, kā aprakstīts iepriekš. Skatīt piemērus programmās. 6) Ja tika pieprasīts lasījums, baitu lasīšana būs bufera otrajā vietā. Ja ir jāraksta vairāki baiti (piemēram, atmiņas ierīcei), var izmantot to pašu kārtību. Bufera iestatīšana un rutīnas izsaukšana nedaudz atšķiras. Otrais baits buferī būs sākuma atmiņas adrese, uz kuru rakstīt. Rakstāmie dati būs nākamajos baitos. Ziņojuma lielums būs tāds pats kā visi derīgie dati. Tātad, ja jāraksta 6 baiti, ziņojuma lielums būs 8 (vergu adrese + atmiņas adrese + 6 datu baiti). USI_TWI_Start_Random_Read () Šī funkcija tiek izmantota, lai nolasītu vairākus baitus no I2C ierīces, parasti tas ir svarīgi tikai kaut kāda atmiņa. Šīs rutīnas izmantošana ir ļoti līdzīga iepriekšējai kārtībai ar diviem izņēmumiem. Lasīšanas/rakstīšanas bitu iestatījumam nav nozīmes. Šīs rutīnas izsaukšana vienmēr izraisīs lasīšanas darbību. Ziņojuma izmēram jābūt 2 plus nolasāmo baitu skaitam. Ja nav radušās kļūdas, dati būs buferī, sākot no otrās vietas. ATmega168: Pulksteņa prasības: draiveri ir paredzēti 4MHz takts frekvencei ATmega168. Piemēra kods parāda, kā iestatīt šo pulksteņa ātrumu. Ja vēlaties darboties ar citiem ātrumiem, jums būs jāpielāgo draiveru konstantes. Nosūtiet man e -pastu, ja jums tas jādara. TWI_Master_Initialise () Šī funkcija inicializē TWI aparatūru I2C režīma darbībai. Zvaniet vienreiz programmas sākumā. Tas atgriežas spēkā neesoši un nav argumentu. Pēc inicializācijas noteikti iespējojiet pārtraukumus, zvanot swi (). TWI_Get_State_Info () Šī funkcija atgriež I2C kļūdu informāciju un tiek izmantota, ja I2C darījuma laikā radās kļūda. Tā kā šī funkcija atgriež tikai kļūdas kodu, es izmantoju funkciju TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg), lai mirgo kļūdas gaismas diode. Kļūdu kodi ir definēti vietnē TWI_Master.h, bet tiek modificēti, lai signalizētu par kļūdas gaismas diodi. Sīkāku informāciju skatiet koda paraugā. Lūk, kā to izsaukt: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) Ņemiet vērā, ka kļūdu pārbaude tiek veikta, pārliecinoties, ka I2C transakcija ir pabeigta (funkcija aprakstīta zemāk) un pēc tam mazliet pārbaudot globālā statusa vārdu. TWI_Start_Read_Write () TWI_Starteand divas funkcijas darbojas tāpat kā iepriekš aprakstītās atbilstošās funkcijas, taču ar dažiem izņēmumiem. Tās neatgriež kļūdas vērtības. Nolasītie dati netiek pārsūtīti buferī. To darot, izmantojot tālāk aprakstīto funkciju. Zvanot uz TWI_Start_Random_Read, ziņojumam Izmēram jābūt pieprasīto datu baitu skaitam plus viens, nevis divi. ATmega168 I2C draiveris tiek pārtraukts. Tas nozīmē, ka I2C darījumi tiek sākti un pēc tam izpildīti neatkarīgi, kamēr turpina darboties galvenā rutīna. Kad galvenā rutīna vēlas iegūt datus no I2C darījuma, kuru tas sāka, tai ir jāpārbauda, vai dati ir pieejami. Kļūdu pārbaudē situācija ir tāda pati. Pirms kļūdu pārbaudes galvenajai kārtībai jābūt pārliecinātai, ka I2C darījums ir pabeigts. Šiem nolūkiem tiek izmantotas nākamās divas funkcijas. TWI_Transceiver_Busy () Zvaniet šai funkcijai, lai pārbaudītu, vai I2C darījums ir pabeigts, pirms pārbaudīt kļūdas. Piemēru programmas parāda, kā to izmantot. TWI_Read_Data_From_Buffer () Izsauciet šo funkciju, lai pārsūtītu datus no I2C draivera saņemšanas bufera uz ziņojumu buferi. Šī funkcija pirms datu pārsūtīšanas pārliecināsies, ka I2C darījums ir pabeigts. Lai gan šī funkcija atgriež vērtību, es uzskatu, ka kļūdas bita pārbaude tieši ir ticamāka. Lūk, kā to nosaukt. Ziņojuma izmēram jābūt vienam lielākam par vēlamo datu bitu skaitu. Dati būs ziņojumā messageBuf, sākot no otrās atrašanās vietas.temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

4. solis: veidosim

Celsim!
Celsim!
Celsim!
Celsim!
Celsim!
Celsim!
Celsim!
Celsim!

Sāciet, lejupielādējot failu I2C Schematics.zip. Iespējams, vēlēsities savā darba zonā izveidot mapi I2C, lai turētu shēmas un programmas piemēru failus. Izsaiņojiet shēmas šajā direktorijā. Jūs atradīsit mapi ar nosaukumu I2C shēmas. Atveriet failu ar nosaukumu tiny I2C.pdf. Šajā shēmā parādīta ATtiny2313 geto izstrādes sistēma un PCA8574A I/O portu paplašinātājs (ap to ir liela punktētā kaste). Port Expander shēma ir veidota uz maizes dēļa. Apskatiet fotoattēlus, lai redzētu, kā šīs shēmas izskatās. Tie patiešām ir diezgan vienkārši. Shēmas ATtiny2313 daļa ir tikai Ghetto izstrādes sistēma ar trim mirgojošiem lukturiem (LED1, 2 un 3, kā arī R4, 5 un 6) un piespiestu pogu (S1), kā arī vienu papildu detaļa. Šī detaļa ir džemperu (JP4, 5 un 6) pievienošana, kurus var noņemt, lai varētu savienot I2C kopnes SCL un SDA līnijas. Džemperiem jābūt programmēšanas vietā, pēc tam tie jānoņem, lai varētu savienot SCL un SDA. Fotogrāfijās ir redzami džemperi vietā un noņemti. Šo džemperu izvietojums ir atkarīgs no jums, jums vienkārši jāievieto Ghetto Development System, ja vēlaties izmantot I2C kopni. I2C kopne ir jāatvieno un džemperi jāievieto programmēšanai. Ņemiet vērā, ka jums patiešām jāuztraucas tikai par JP4 un JP6 I2C kopnei. Ievietojiet JP5, ja domājat, ka kādreiz vēlēsities izmantot SPI kopni. PCA8574A I/O portu paplašinātājs ir ļoti vienkāršs. Nodrošiniet Vcc (+5 volti) un Gnd (zemes) savienojumus un pievienojiet AD0, 1 un 2 zemei (padara I2C verga adresi 38 hex). Pēc tam pievienojiet 4 mirgojošus lukturus un 4 DIP slēdžus. (Ja jums nav DIP slēdžu, varat vienkārši izmantot vadus. Piesieniet pie zemes vai atstājiet peldošu, lai attiecīgi ieslēgtu vai izslēgtu signālu.) Visbeidzot, pievienojiet uzvilkšanas rezistorus (R11 un 12) no SDA un SCL uz Vcc. Tie ir parādīti kā 3.3K, bet jebkurai vērtībai no 1.8K līdz 5.1K vajadzētu darboties (varbūt līdz 10K, bet es to neesmu mēģinājis). Kad esat ieprogrammējis ATtiny2313, varat noņemt džemperus un testēšanai pievienot SDA un SCL. Tagad ATmega168. Vienīgā kroka šeit ir tāda, ka jūs, iespējams, neesat izveidojis šim procesoram Ghetto izstrādes sistēmu. Ja tas tā ir, tad mana sniegtā shēma (MEGA I2C.pdf) parādīs, kā to izdarīt. Šī ir tikai ATtiny2313 versijas permutācija. Ja plānojat iepriekš, varat pārliecināties, ka jūsu programmēšanas kabelis būs piemērots abām sistēmām. Galvenā atšķirība ir C2 un C3 pievienošana. To izvietojumu skatiet attēlos, tiem jābūt ļoti tuvu mikroshēmai; viens no tiem faktiski atrodas zem mikroshēmas. Tas jo īpaši palīdz novērst troksni no analogā digitālā pārveidotāja. Jums nav jāieliek džemperi, ja vien neplānojat izmantot SPI kopni, jo tie nav nepieciešami šīs mikroshēmas I2C kopnei. Ņemiet vērā, ka maizes dēlis PCA8754A netiks mainīts. Jūs vienkārši pievienosit SDA un SCL un aiziesit! Viegli, ja?

5. darbība: kodēsim un pārbaudīsim

Kodēsim un pārbaudīsim!
Kodēsim un pārbaudīsim!
Kodēsim un pārbaudīsim!
Kodēsim un pārbaudīsim!
Kodēsim un pārbaudīsim!
Kodēsim un pārbaudīsim!

Ir pienācis laiks izveidot draiverus un piemēru programmas. Sāksim ar ATtiny2313 un tikko uzbūvēto maizes dēli PCA8574A. Lejupielādējiet failu I2C.zip savā I2C darba direktorijā un izpakojiet to. Jums būs jauna mape ar nosaukumu I2C. Tajā atradīsit USI I2C (ATtiny2313) un TWI I2C (ATmega168). USI I2C atradīsit mapi I_O Port. Šajā mapē ir mūsu pirmās piemēra programmas kods un USI I2C draiveri. Izmantojot WinAVR, apkopojiet un ielādējiet kodu ATtiny2313. Elpojiet dziļi un ieslēdziet strāvu. Lūk, ko gaidīt: ieslēdzot, LED 1 uz ATtiny2313 porta PD6 mirgo divas reizes. Nekas cits nenotiks, kamēr nenospiežat pogu (S1). Katru reizi, nospiežot pogu, slēdži tiek nolasīti un to iestatījumi tiks parādīti uz PCA8574A pievienotajās gaismas diodēs. Mainiet slēdžu vērtību, nospiediet pogu, un gaismas diodēm vajadzētu mainīties. Turpiniet to darīt, līdz pārvarēsiet aizraušanos, redzot, kā tas darbojas. Ja (nedod Dievs!), Lietas nedarbojas, kā gaidīts, rūpīgi pārbaudiet elektroinstalāciju. Par I2C kļūdām tiks ziņots mirgot uz LED3 (PD4), un, iespējams, tas nozīmē, ka jums jāpārbauda, vai SDA un SCL ir pievienotas pareizajām tapām un vai tās ir pareizi uzvilktas. Ja kaut kas joprojām nedarbojas, izlasiet pārējo šo sadaļu, lai uzzinātu par atkļūdošanu. Tagad atgriezieties un apskatīsim kodu. Atveriet failu USI_I2C_Port.c. Šis ir programmas parauga kods. (USI_TWI_Master.c un USI_TWI_Master.h satur draiverus - jūs varat tos ignorēt, ja vien neesat ziņkārīgs.) Izmantojiet piemēru, lai vadītu savas I2C lietojumprogrammas. Galvenokārt programma parāda, kā inicializēt un izmantot I2C draiverus, ieskaitot iestatījumus izveidojiet verga adresi un pārējo ziņojumu buferi un iegūstiet datus no tā. Jūs arī redzēsit, kā es atvienoju pogu un iestatīju cikla ciklu. Ir vērts pieminēt dažas programmas detaļas. Ņemiet vērā, ka slēdžu dati tiek apgriezti, pirms tie tiek ierakstīti portu paplašinātāja gaismas diodēs. Ņemiet vērā arī to, ka portu paplašinātāja ievades porti ir jāraksta kā augsti, lai tie darbotos pareizi. Šī informācija ir aprakstīta PCA8574A datu lapā. Vienmēr uzmanīgi izlasiet datu lapas! Lielāka interese ir nosacītu atkļūdošanas izmantošana. Tuvu programmas faila sākumam ir paziņojums // #define DEBUG, un visā kodā tiek pārkaisīti #ifdef DEBUG priekšraksti. Kamēr DEBUG nav definēts (abas slīpsvītras padara rindiņu par komentāru un neļauj to definēt), kodi no #ifdef līdz #endif paziņojumiem netiks apkopoti. Bet, ja viss nedarbojas tā, kā jūs gaidījāt, pārkompilējiet un atkārtoti ielādējiet kodu, izmantojot #define DEBUG. Jūs saņemsiet daudz vairāk mirgojumu uz gaismas diodēm, kuras varat atšifrēt, lai sekotu jūsu programmas izpildei un palīdzētu jums precīzi noteikt, kur lietas notiek nepareizi. Patiesībā es iesaku jums to izmēģināt, lai redzētu, kas notiek. Jūs redzēsit, ka gaismas diode 2 (uz PD5) mirgos, izpildot programmu. No slēdžiem nolasītā vērtība mirgos uz gaismas diodes 1 (PD6), pirms tā tiek parādīta porta paplašinātāja gaismas diodēs. Jums vajadzētu būt iespējai izsekot programmai, kā tā darbojas, izmantojot šīs gaismas diodes. Tālāk mēs strādāsim ar ATmega168; izlaidiet šo sadaļu, ja jūs interesē tikai ATtiny2313. Joprojām ar mani? Labi. Pārvietojieties uz mapi TWI_I2C, mainiet darba direktoriju uz IO_Port un apkopojiet un ielādējiet TWI_I2C_Port.c ATmega168. Atvienojiet SDA un SCL līnijas no ATtiny2313 un pievienojiet tās ATmega168. Pievienojiet strāvu un zemi un ieslēdziet. Operācijai jābūt vienādai! Spēlējiet, līdz aizraušanās samazinās, tad apskatīsim kodu. Atveriet TWI_I2C_Port.c. Kods ir gandrīz identisks, izņemot kļūdu apstrādi un draiverus ar pārtraukumiem. Šeit ir atšķirības: Ņemiet vērā, ka pulkstenim jābūt iestatītam uz 4 MHz, lai I2C kopne darbotos pareizi. Sei (); paziņojums ieslēdz pārtraukumus pēc I2C draiveru inicializācijas. Lai pārbaudītu kļūdas, tiek pārbaudīts konkrēts statusa bits. Lasīšanas laikā ir jāizsauc funkcija TWI_Read_Data_From_Buffer, lai nodotos nolasītos datus ziņojumu buferī. Rakstīšanas laikā, kamēr (TWI_Transceiver_Busy ()) ir jāizmanto, lai pārliecinātos, ka pārsūtīšana ir pabeigta pirms kļūdu pārbaudes. Šīs divas pēdējās funkcijas ir aprakstītas iepriekš draiveru aprakstā. Izņemot to, kods ir gandrīz tāds pats kā ATtiny2313. DEBUG darbojas tāpat, ja vēlaties ar to eksperimentēt.

6. darbība: I2C atmiņas izmantošana

I2C atmiņas izmantošana
I2C atmiņas izmantošana
I2C atmiņas izmantošana
I2C atmiņas izmantošana
I2C atmiņas izmantošana
I2C atmiņas izmantošana
I2C atmiņas izmantošana
I2C atmiņas izmantošana

Tagad, kad esam iemācījušies izmantot I2C kopni, lai lasītu un rakstītu I/O portu paplašinātāju, pāriesim pie I2C atmiņas, gan RAM, gan EEPROM, izmantošanas. Galvenā atšķirība ir tāda, ka atmiņā ar vienu I2C komandu var nolasīt vai ierakstīt vairākus baitus. Lai sagatavotos šiem eksperimentiem, mums ir nedaudz jāpārveido aparatūra un jāveido pāris jaunas shēmas. Saglabājiet porta paplašinātāja ķēdi, jo mēs to izmantosim, lai parādītu dažas atmiņas vērtības. Noņemiet DIP slēdžus no PCA8574A un novietojiet mirgojošās gaismas uz šīm tapām. Ja jums nav pietiekami daudz mirgojošu lukturu, pārvietojiet tos, kas atrodas no P4 līdz P7, uz P0 līdz P3. (Parādāmās vērtības ir pietiekami mazas.) Tagad apskatiet shematisko I2C Ram.pdf un pievienojiet PCF8570 uz maizes dēļa. Paskaties arī uz attēlu. Noteikti piesieniet 7. tapu pie Vcc. Izvadiet vadus SDA un SCL no PCA8574A. Nav nepieciešami papildu pievilkšanas rezistori. Ja jūs interesē arī EEPROM, izveidojiet šo ķēdi, izmantojot 24216, izmantojot arī I2C EEPROM.pdf, taču brīdiniet, ka piemērā tiek izmantots ATmega168. Šī shēma ir patiešām vienkārša. Kā minēts iepriekš, adrešu biti ir jāignorē. Vienkārši pievienojiet strāvu un zemi. Nepievienojiet SDA un SCL, jo vēl neesam pabeiguši eksperimentus ar Ram. Mēs sāksim savus atmiņas eksperimentus ar ATtiny2313, kas savienots ar PCA8574A Port Expander un PCF8570 Ram. Programma ierakstīs dažus numurus Ram, pēc tam tos nolasīs un parādīs portu paplašinātājā. Mainiet savu darba direktoriju uz RAM zem USI I2C. Izmantojiet make failu, lai apkopotu un lejupielādētu USI_I2C_RAM.c. Ņemiet vērā, ka I2C draivera faili ir identiski tiem, kurus izmantojām iepriekš. Pievienojiet strāvu, un gaismas diodē 1 (PD6) vajadzētu redzēt vienu mirgošanu. Dati tiks ierakstīti pirmajos 4 atmiņas baitos. Nospiediet pogu, un divi baiti tiks nolasīti un parādīti. Portu paplašinātājā (P0) vajadzētu redzēt vienu LED gaismu, divu sekunžu pauzi, pēc tam iedegas divas gaismas diodes (P0 un P1). Vēl divu sekunžu pauze, un gaismas diodēm vajadzētu izslēgties. Nospiediet pogu vēlreiz, lai sāktu secību no jauna. Atkļūdošana ir līdzīga iepriekš aprakstītajai metodei. Apskatīsim kodu. Atveriet USI_I2C_RAM.c. Tam vajadzētu izskatīties diezgan līdzīgi iepriekšējam kodam. Galvenās atšķirības ir lasīšanas un rakstīšanas atmiņas detaļas. Paskatieties, kā tiek ielādēts ziņojumu buferis pirms zvana, kas faktiski veic rakstīšanu. Pirmais baits ir verga adrese ar lasīšanas/rakstīšanas bitu, kas ir pareizi iestatīts. Bet nākamais baits ir atmiņas adrese, kurā sākt rakstīt datus. Tad nāk faktiskie datu baiti, kas tiks secīgi ielādēti atmiņā, sākot ar mūsu norādīto adresi. Mēs norādām ziņojuma lielumu kā 6. Tātad mēs sākam rakstīt pēc adreses 00 un ierakstām vērtības 01, 03, 02 un 06 atmiņas vietās no 00 līdz 03. Lai nolasītu datus no atmiņas, mums jāizmanto funkcija USI_TWI_Start_Random_Read. Ziņu buferis iegūst vergu adresi pirmajā baitā un sākuma adresi otrajā baitā. Pēc tam izsauciet funkciju, kuras ziņojuma lielumam ir iestatīts nolasāmo baitu skaits plus 2. Ņemiet vērā, ka lasīšanas/rakstīšanas bitam nav nozīmes, jo lasīšana tiks veikta neatkarīgi. Atgrieztie dati sāksies ziņojumu bufera otrajā vietā. Kad dati ir nolasīti, tie tiek apgriezti, lai tos parādītu portu paplašinātājā, un tiem tiek rakstīts pa vienam baitam ar pārtraukumu starp vērtībām. Visbeidzot, porta paplašinātāja gaismas diodes tiek izslēgtas. Ieraksti ostas paplašinātājam ir identiski tam, kas tika darīts iepriekšējos piemēros. Jautrības labad varat izteikt komentāru #define DEBUG, kā minēts iepriekš, un redzēt daudz mirgojošu gaismas diodes. Pēc cita veiksmīga eksperimenta aizrautībā pāriesim pie ATmega168 un EEPROM. Mainiet darba direktoriju uz EEPROM zem TWI I2C. Izmantojiet make failu, lai apkopotu un lejupielādētu TWI_I2C_EEPROM.c. Ņemiet vērā, ka I2C draivera faili ir identiski tiem, kurus mēs iepriekš izmantojām PCA8574A. Lai pārbaudītu programmu, atvienojiet ATtiny2313 un pievienojiet ATmega168. Atstājiet I2C autobusu piestiprinātu pie Ram un ieslēdziet. Rezultāti ir atšķirīgi, jo mēs tagad rakstām un lasām vairāk datu. Inicializējot PD7, gaismas diodei 1 vajadzētu mirgot. Nospiediet pogu, un dati tiks nolasīti no atmiņas un parādīti. PCA8574 gaismas diodēm vajadzētu mirgot šādā secībā: P1, P0 & P2, (viss izslēgts), P0 & P1, P1 & P2. Visbeidzot, porta gaismas diodēm vajadzētu nodziest. Nospiediet pogu vēlreiz, lai to atkārtotu. Ak, bet pagaidiet, jūs sakāt. Vai šī programma nav paredzēta EEPROM? Tā kā mēs piekļūstam atmiņas ierīcei tajā pašā I2C adresē, tā pati programma darbojas gan Ram, gan EEPROM. Izslēdziet un pārvietojiet SDA un SCL no cilnes uz EEPROM un palaidiet programmu vēlreiz. Tam vajadzētu darboties tieši tāpat. Ņemiet vērā, ka EEPROM un Ram nevar vienlaikus savienot ar I2C kopni, jo tiem ir viena adrese. (Gudrākie no jums var apsvērt iespēju mainīt programmējamos adreses bitus Ram, taču tas joprojām nedarbosies. 24C16 izmanto visu adrešu bloku, ko var ieprogrammēt Ram.) Labi, apskatīsim šo pēdējo programmu. Atveriet TWI_I2C_EEPROM.c. Vispirms jāpievērš uzmanība tam, ka esmu norādījis, kā adresēt visu 24C16 EEPROM. Tam var piekļūt 256 baitu gabalos 8 dažādās I2C vergu adresēs. Skatiet, kā MEMORY_ADDR ir definēta kā sākuma adrese 50 heksadecimālos skaitļos; tāpēc Auns strādāja. Ja vēlaties piekļūt citiem 24C16 blokiem, izmantojiet citas manis norādītās adreses. Paskatieties, kā es iestatīju, lai rakstītu atmiņā. Vispirms buferī tiek ievietota verga adrese ar lasīšanas/rakstīšanas bitu kopu, pēc tam sākuma adrese 00, tad 16 baiti datu. Funkcija TWI_Start_Read_Write tiek izsaukta, lai rakstītu datus (tāpat kā iepriekš), ja ziņojuma lielums ir iestatīts uz 18. Kad tiek nospiesta poga, mēs izmantojam TWI_Start_Random_Read un TWI_Read_Data_From_Buffer, lai nolasītu datus atpakaļ. Portu paplašinātāja gaismas diodēs tiek parādīts katrs trešais baits. Visbeidzot, gaismas diodes tiek izslēgtas, lai gaidītu nākamo pogas nospiešanu. Jūs varētu brīnīties, kāpēc es izvēlējos rakstīt 16 baitus. Rūpīgi izlasot datu lapu, jūs redzēsit, ka 24C16 veic rakstīšanas ciklu ikreiz, kad tas saņem 16 baitus, pat ja tiek nosūtīts vairāk baitu. Tātad tas šķita jauks skaitlis, ko izmantot. Ja izvēlaties to palielināt, jums būs jāmaina MESSAGEBUF_SIZE lielums. Jums būs arī jāmaina vērtība TWI_BUFFER_SIZE vietnē TWI_Master.h. Tas ir tāpēc, ka draiveris kopē datus no ziņojumu bufera, lai tos varētu izmantot pārtraukuma pakalpojumu rutīnas vajadzībām. Apsveicam! Tagad esat gatavs izmantot I2C kopni savos projektos!

7. solis: tīmekļa resursi

Šeit ir saites uz eksperimentiem izmantoto detaļu datu lapām. Jums noteikti vajadzētu iegūt tos, ja neko citu nesaņemat. Port ExpanderRamEEPROM Būdams I2C radītājs, NXP (Philips) ir daudz lielisku lietu. (Viņiem savos vietrāžos URL patīk izmantot kvadrātiekavas, tāpēc es nevaru tos pareizi iekļaut šeit. Atvainojiet.] Lai nokļūtu I2C apgabalā, produktu sarakstā atlasiet Interfeiss. Jūs varēsit nokļūt viņu I2C vietnē un piekļuve visām to piedāvātajām datu lapām un lietotņu piezīmēm. I2C kopnes apraksts un jo īpaši tehniskā informācija ir šeit. Iegūstiet ATtiny2313 un ATmega168 datu lapas (datu grāmatas?) no Atmel. Atmel lietojumprogrammas piezīmes ir šeit. Apskatiet AVR310 un AVR315. Grab kodu arī. Apskatiet šeit daudz vairāk I2C stuff.

8. darbība. Piezīmes Geeks

Patiesam geekam, kurš vēlas uzzināt sīkāku informāciju, ir dažas lietas, kas jāpatur prātā, aplūkojot Atmel Apps piezīmes un draivera kodu:- I2C ierīces adresēšanas un komandēšanas metode nav specifikācija! Izņemot vergu adresi un lasīšanas/rakstīšanas bitu, komandas, režīmi utt. Nav norādītas un ir raksturīgas konkrētai ierīcei. Lai tas būtu ļoti skaidrs, ņemiet vērā, ka Atmel piemērā izmantotā shēma attiecas tikai uz šo piemēru un ir diezgan nestandarta.- USI ieviešana atšķiras no TWI ieviešanas dažos svarīgos veidos. + Izmantojot USI, pulksteni nodrošina programmatūra; ar TWI to nodrošina bitu pārraides ģenerators. + USI metode neizmanto pārtraukumus; TWI to dara. Tam ir zināma jēga, jo Mega ģimene (izmantojot TWI) varētu nodarboties ar daudzām citām lietām, un I2C pārsūtīšana to nedrīkstētu ietekmēt. Pārtraukta USI versija noteikti ir iespējama, tā vienkārši nav ieviesta šajā instrukcijā. + USI aparatūra nav optimizēta I2C un var apstrādāt tikai 8 bitu pārsūtīšanu. Tas nozīmē, ka devītā bita nosūtīšanai ir nepieciešami divi pārskaitījumi (vai nu NACK, vai ACK). TWI aparatūra to apstrādā automātiski. Tas padara USI draivera ieviešanu nedaudz sarežģītāku. + TWI kļūdu noteikšana tiek apstrādāta aparatūrā. USI nepieciešama apstrāde programmatūrā, kas lietas nedaudz sarežģī. + TWI aparatūra tieši kontrolē porta konfigurāciju. Lai izmantotu USI aparatūru, pirms porta izmantošanas ir jākonfigurē porta biti. Jūs to redzēsit Master_Initialize USI rutīnā.-Atmel apgalvo, ka I2C kopnes izvilkšanai ir iespējams izmantot AVR porta pievilkšanu. Es neesmu izdomājis veidu, kā panākt, lai šī pieeja darbotos. Divu ārējo rezistoru izmantošana šķiet diezgan vienkārša shēma, tāpēc es tam netērēju daudz laika.

Ieteicams: