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/26 15:59] – raivo.sell | et:examples:communication:i2c [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| + | ====== Kahejuhtme liides TWI/I2C ====== | ||
| + | //Vajalikud teadmised: | ||
| + | [HW] [[et: | ||
| + | [AVR] [[et: | ||
| + | [LIB] [[et: | ||
| + | |||
| + | ===== Teooria ===== | ||
| + | |||
| + | Kahejuhtme liides (inglise keeles //Two Wire Interface//, | ||
| + | |||
| + | I< | ||
| + | |||
| + | [{{ : | ||
| + | ~~CL~~ | ||
| + | |||
| + | Iga seade I< | ||
| + | |||
| + | I< | ||
| + | |||
| + | * ülem saadab | ||
| + | * ülem võtab vastu | ||
| + | * alam saadab | ||
| + | * 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/ | ||
| + | |||
| + | 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~~ | ||
| + | |||
| + | 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 ===== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | 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, | ||
| + | ~~CL~~ | ||
| + | ~~CL~~ | ||
| + | ~~CL~~ | ||
| + | <code c> | ||
| + | // Kodulabori RTC mooduli DS3231 näidisprogramm | ||
| + | // Moodul on ühendatud PORTE TWI siinile: SDA - PE0, SCL - PE1 | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // DS1307 TWI aadress | ||
| + | #define DS3231 0b1101000 | ||
| + | |||
| + | // TWI ülemmooduli defineerimine | ||
| + | TWI_Master_t twiMaster; | ||
| + | |||
| + | // TWI katkestuste vektor, | ||
| + | // tegeleb taustal TWI siinile kirjutamisega ning lugemisega | ||
| + | ISR(TWIE_TWIM_vect) | ||
| + | { | ||
| + | TWI_MasterInterruptHandler(& | ||
| + | } | ||
| + | |||
| + | // Põhiprogramm | ||
| + | int main(void) | ||
| + | { | ||
| + | char buff[30]; | ||
| + | uint8_t time[8]; | ||
| + | uint8_t seconds = 0, minutes, hours; | ||
| + | uint8_t date, month, year; | ||
| + | |||
| + | // LCD ekraani seadistamine | ||
| + | lcd_gfx_init(); | ||
| + | lcd_gfx_write_string(" | ||
| + | |||
| + | // TWIE siini käivitamine master režiimis katkestuse prioriteediga madal, | ||
| + | // TWI kiirus 100 kHz 32 MHz süsteemikellaga | ||
| + | TWI_MasterInit(& | ||
| + | TWI_BAUD(32000000, | ||
| + | // Madala prioriteediga katkestuste lubamine | ||
| + | PMIC.CTRL |= PMIC_LOLVLEN_bm; | ||
| + | sei(); | ||
| + | |||
| + | // Algse kellaaja määramine | ||
| + | time[0] = 0; // Aadress, kuhu kirjutatakse kellaaeg | ||
| + | time[1] = 0; // Sekund | ||
| + | time[2] = (4<< | ||
| + | time[3] = (1<< | ||
| + | time[4] = 3; // Nädalapäev (3) | ||
| + | time[5] = (0<< | ||
| + | time[6] = (0<< | ||
| + | time[7] = (1<< | ||
| + | |||
| + | // DS3231 kella käivitamine (kui see ei ole juba töös) | ||
| + | TWI_MasterWrite(& | ||
| + | |||
| + | // Lõputu tsükkel | ||
| + | while (1) | ||
| + | { | ||
| + | // TWI siini DS3231 registritest kellaaja uuesti lugemine | ||
| + | TWI_MasterWriteRead(& | ||
| + | |||
| + | // Vastuse ootamine | ||
| + | while (twiMaster.status != TWIM_STATUS_READY); | ||
| + | | ||
| + | // Registritest saadud informatsiooni kellaks ja kuupäevaks teisendamine | ||
| + | seconds = ((twiMaster.readData[0]>> | ||
| + | minutes = ((twiMaster.readData[1]>> | ||
| + | hours = ((twiMaster.readData[2]>> | ||
| + | date = ((twiMaster.readData[4]>> | ||
| + | month = ((twiMaster.readData[5]>> | ||
| + | year = ((twiMaster.readData[6]>> | ||
| + | | ||
| + | // Kella LCD ekraanil kuvamine | ||
| + | sprintf(buff," | ||
| + | hours, | ||
| + | lcd_gfx_goto_char_xy(2, | ||
| + | lcd_gfx_write_string(buff); | ||
| + | _delay_ms(100); | ||
| + | } | ||
| + | } | ||
| + | </ | ||