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 14:19] – 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: | //Vajalikud teadmised: | ||
Line 8: | Line 8: | ||
===== 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 23: | 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~~ | ||
Line 53: | Line 54: | ||
#define DS3231 0b1101000 | #define DS3231 0b1101000 | ||
- | // TWI ülemmoodul | + | // TWI ülemmooduli |
TWI_Master_t twiMaster; | TWI_Master_t twiMaster; | ||
// TWI katkestuste vektor, | // TWI katkestuste vektor, | ||
- | // tegeleb taustal TWI siinile kirjutamisega ning lugemisega. | + | // tegeleb taustal TWI siinile kirjutamisega ning lugemisega |
ISR(TWIE_TWIM_vect) | ISR(TWIE_TWIM_vect) | ||
{ | { | ||
- | TWI_MasterInterruptHandler(& | + | |
} | } | ||
Line 77: | 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(& |
- | TWI_BAUD(32000000, | + | TWI_BAUD(32000000, |
// 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); |