This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:examples:communication:i2c [2015/02/19 15:47] – raivo.sell | et:examples:communication:i2c [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ~~PB~~ | + | < |
====== Kahejuhtme liides TWI/I2C ====== | ====== Kahejuhtme liides TWI/I2C ====== | ||
+ | //Vajalikud teadmised: | ||
+ | [HW] [[et: | ||
+ | [AVR] [[et: | ||
+ | [LIB] [[et: | ||
===== Teooria ===== | ===== Teooria ===== | ||
- | Kahejuhtme liides (inglise keeles //Two Wire Interface//, | + | Kahejuhtme liides (inglise keeles //Two Wire Interface//, |
- | I< | + | I< |
[{{ : | [{{ : | ||
~~CL~~ | ~~CL~~ | ||
- | I< | + | Iga seade I< |
I< | I< | ||
+ | |||
* ülem saadab | * ülem saadab | ||
* ülem võtab vastu | * ülem võtab vastu | ||
Line 19: | Line 24: | ||
* alam võtab vastu | * alam võtab vastu | ||
- | Ülem on algselt üldjuhul saatmise režiimis, saates kõigepealt start biti, millele järgneb 7-bitine alammooduli aadress ning lugemise/ | + | Ülem on algselt üldjuhul saatmise režiimis, saates kõigepealt start biti, millele järgneb 7-bitine alammooduli aadress ning lugemise/ |
- | Start bit kujutab endast SDA liini madalaks tõmbamist sel hetkel, kui SCL liin on kõrge. Stop bit on defineeritud kui SDA liini kõrgeks liigutamine sel hetkel, kui SCL liin on kõrge. Kõik ülejäänud nivoovahetused peavad toimuma sel hetkel, kui SCL liin on madal. | + | Start bitt kujutab endast SDA liini madalaks tõmbamist sel hetkel, kui SCL liin on kõrge. Stop bitt on defineeritud kui SDA liini kõrgeks liigutamine sel hetkel, kui SCL liin on kõrge. Kõik ülejäänud nivoovahetused peavad toimuma sel hetkel, kui SCL liin on madal. |
~~CL~~ | ~~CL~~ | ||
Kirjutamine ja lugemine toimub bait haaval, igale õnnestunud baidivahetusele peab järgnema ACK signaal selle poolt, kelle poole andmeid saadeti. Kui andmevahetus on lõppenud saadab juhtmoodul, kas Stop biti või uue Start biti koos aadressiga. | Kirjutamine ja lugemine toimub bait haaval, igale õnnestunud baidivahetusele peab järgnema ACK signaal selle poolt, kelle poole andmeid saadeti. Kui andmevahetus on lõppenud saadab juhtmoodul, kas Stop biti või uue Start biti koos aadressiga. | ||
- | |||
- | [{{ : | ||
===== Praktika ===== | ===== Praktika ===== | ||
+ | |||
+ | [{{ : | ||
I< | I< | ||
Näites on ära toodud reaalaja kellamooduli (inglise keeles //Real Time Clock//, lühend RTC) DS3231 kasutamine Kodulabor III põlvkonna kontrolleriga. Reaalajakell omab väikese Li-patarei näol autonoomset toidet ja peale esmast aja seadistamist ei ole hiljem enam eraldi vaja aega algväärtustada, | Näites on ära toodud reaalaja kellamooduli (inglise keeles //Real Time Clock//, lühend RTC) DS3231 kasutamine Kodulabor III põlvkonna kontrolleriga. Reaalajakell omab väikese Li-patarei näol autonoomset toidet ja peale esmast aja seadistamist ei ole hiljem enam eraldi vaja aega algväärtustada, | ||
+ | ~~CL~~ | ||
+ | ~~CL~~ | ||
+ | ~~CL~~ | ||
<code c> | <code c> | ||
// Kodulabori RTC mooduli DS3231 näidisprogramm | // Kodulabori RTC mooduli DS3231 näidisprogramm | ||
Line 47: | Line 54: | ||
#define DS3231 0b1101000 | #define DS3231 0b1101000 | ||
- | // TWI ülemmoodul | + | // TWI ülemmooduli |
TWI_Master_t twiMaster; | TWI_Master_t twiMaster; | ||
- | // TWI katkestuste vektor, tegeleb taustal TWI siinile kirjutamisega ning lugemisega | + | // TWI katkestuste vektor, |
+ | // tegeleb taustal TWI siinile kirjutamisega ning lugemisega | ||
ISR(TWIE_TWIM_vect) | ISR(TWIE_TWIM_vect) | ||
{ | { | ||
- | TWI_MasterInterruptHandler(& | + | |
} | } | ||
Line 70: | Line 78: | ||
// TWIE siini käivitamine master režiimis katkestuse prioriteediga madal, | // TWIE siini käivitamine master režiimis katkestuse prioriteediga madal, | ||
// TWI kiirus 100 kHz 32 MHz süsteemikellaga | // TWI kiirus 100 kHz 32 MHz süsteemikellaga | ||
- | TWI_MasterInit(& | + | TWI_MasterInit(& |
+ | | ||
// Madala prioriteediga katkestuste lubamine | // Madala prioriteediga katkestuste lubamine | ||
PMIC.CTRL |= PMIC_LOLVLEN_bm; | PMIC.CTRL |= PMIC_LOLVLEN_bm; | ||
sei(); | sei(); | ||
+ | |||
// Algse kellaaja määramine | // Algse kellaaja määramine | ||
- | time[0] = 0; // Aadress, kuhu kirjutatakse kellaaeg | + | time[0] = 0; // Aadress, kuhu kirjutatakse kellaaeg |
- | time[1] = 0; // Sekund | + | time[1] = 0; // Sekund |
- | time[2] = (4<< | + | time[2] = (4<< |
- | time[3] = (1<< | + | time[3] = (1<< |
- | time[4] = 3; // Nädalapäev (3) | + | time[4] = 3; // Nädalapäev (3) |
- | time[5] = (0<< | + | time[5] = (0<< |
- | time[6] = (0<< | + | time[6] = (0<< |
- | time[7] = (1<< | + | time[7] = (1<< |
// DS3231 kella käivitamine (kui see ei ole juba töös) | // DS3231 kella käivitamine (kui see ei ole juba töös) | ||
- | TWI_MasterWrite(& | + | TWI_MasterWrite(& |
// Lõputu tsükkel | // Lõputu tsükkel | ||
- | while (true) | + | while (1) |
{ | { | ||
// TWI siini DS3231 registritest kellaaja uuesti lugemine | // TWI siini DS3231 registritest kellaaja uuesti lugemine | ||
TWI_MasterWriteRead(& | TWI_MasterWriteRead(& | ||
+ | |||
// Vastuse ootamine | // Vastuse ootamine | ||
while (twiMaster.status != TWIM_STATUS_READY); | while (twiMaster.status != TWIM_STATUS_READY); | ||
+ | | ||
// Registritest saadud informatsiooni kellaks ja kuupäevaks teisendamine | // Registritest saadud informatsiooni kellaks ja kuupäevaks teisendamine | ||
seconds = ((twiMaster.readData[0]>> | seconds = ((twiMaster.readData[0]>> | ||
minutes = ((twiMaster.readData[1]>> | minutes = ((twiMaster.readData[1]>> | ||
- | hours = ((twiMaster.readData[2]>> | + | hours |
- | date = ((twiMaster.readData[4]>> | + | date = ((twiMaster.readData[4]>> |
- | month = ((twiMaster.readData[5]>> | + | month |
- | year = ((twiMaster.readData[6]>> | + | year = ((twiMaster.readData[6]>> |
+ | | ||
// Kella LCD ekraanil kuvamine | // Kella LCD ekraanil kuvamine | ||
- | sprintf(buff," | + | sprintf(buff," |
+ | | ||
lcd_gfx_goto_char_xy(2, | lcd_gfx_goto_char_xy(2, | ||
lcd_gfx_write_string(buff); | lcd_gfx_write_string(buff); | ||
Line 108: | Line 123: | ||
} | } | ||
</ | </ | ||
+ |