Johdatus I2C-viestintään
I2C, joka tunnetaan myös nimellä I2C tai IIC, on synkroninen isäntä-orja-kommunikaatioprotokolla, jossa signaalin isäntälaite voi ohjata useita orjalaitteita yhden johdon (SDA-linjan) kautta.
I2C yhdistää UART- ja SPI-protokollien toiminnan, esimerkiksi SPI tukee useiden orjalaitteiden ohjausta yhden isäntälaitteen kautta, I2C tukee myös tätä, toisaalta UART käyttää kaksilinjaista TX- ja Rx-yhteyttä viestintään. I2C käyttää myös kaksirivistä SDA:ta ja SCL:ää viestintää.
Tässä voimme nähdä, että olemme käyttäneet vetovastuksia sekä SDA- että SCL-linjoilla. Tämä johtuu siitä, että oletusarvoisesti I2C tuottaa vain kaksi tasoa joko LOW- tai avoimen piirin. Oletuksena kaikkien sirujen I2C on avoimen piirin tilassa, joten käytimme vetovastusta nostaaksemme ne KORKEALLA.
Seuraavassa on kaksi I2C:n käyttämää riviä:
- SDA (sarjatiedot) : Linja tiedon lähettämiseen ja vastaanottamiseen isännältä orjalle ja päinvastoin
- SCL (sarjakello) : Kellon signaalilinja tietyn orjalaitteen valitsemiseksi
ESP32 I2C -väyläliitännät
ESP32:ssa on kaksi I2C-väyläliitäntää, joiden avulla I2C-tiedonsiirto suoritetaan joko isäntänä tai orjana riippuen laitteesta, joka on liitetty ESP32:een. ESP32-tietolomakkeen mukaan ESP32-kortin I2C-liitäntä tukee seuraavia kokoonpanoja:
- Vakiomuotoinen I2C-viestintä nopeudella 100 Kbit/s
- Nopea tai edistynyt I2C-viestintä nopeudella 400 Kbit/s
- Kaksoisosoitetila, 7-bittinen ja 10-bittinen
- Käyttäjät voivat ohjata I2C-liitäntää ohjelmoimalla komentorekistereitä
- ESP32 I2C -väyläliitäntä on joustavampi ohjauksessa
I2C-laitteiden yhdistäminen ESP32:lla
Laitteiden liittäminen ESP32:een I2C-protokollaa käyttäen on hyvin yksinkertaista, aivan kuten UART, tarvitsemme vain kaksi linjaa SDA:n ja SCL-kellolinjan yhdistämiseen.
ESP32 voidaan konfiguroida sekä Master- että Slave-tilassa.
ESP32 I2C Master Mode
Tässä tilassa ESP32 generoi kellosignaalia, joka aloittaa tiedonsiirron kytkettyjen orjalaitteiden kanssa.
ESP32:n kaksi GPIO-nastaa, jotka on ennalta määritetty I2C-viestintää varten:
- SDA : GPIO PIN 21
- SCL : GPIO PIN 22
ESP32 I2C -orjatila
Orjatilassa kellon generoi isäntälaite. Master on ainoa laite, joka ohjaa SCL-linjaa I2C-viestinnässä. Orjat ovat laitteita, jotka vastaavat isännälle, mutta eivät voi aloittaa tiedonsiirtoa. ESP32 I2C -väylässä vain isäntä voi aloittaa tiedonsiirron laitteiden välillä.
Kuvassa kaksi ESP32-korttia master-slave-kokoonpanossa.
Tähän mennessä olemme ymmärtäneet I2C-tilan toiminnan ESP32:ssa, nyt voimme helposti löytää minkä tahansa laitteen I2C-osoitteen lataamalla annetun koodin.
Kuinka skannata I2C-osoite ESP32:ssa Arduino IDE:n avulla
ESP32:lla kytkettyjen laitteiden I2C-osoitteen löytäminen on tärkeää, koska jos käytämme laitteita, joilla on sama I2C-osoite, emme voi kommunikoida niiden kanssa yhden väylälinjan kautta.
Jokaisen I2C-laitteen tulee sisältää yksilöllinen osoite ja osoitealue 0-127 tai (0-0X7F) HEX-muodossa. Jos esimerkiksi käytämme kahta OLED-näyttöä, joilla on sama mallinumero tai tuote, molemmilla on sama I2C-osoite, joten emme voi käyttää molempia samalla I2C-linjalla ESP32:ssa.
Otetaan esimerkki IC-osoitteen löytämiseksi.
Kaaviomainen
Alla olevassa kuvassa on kaavio OLED-näytön liitännästä ESP32-korttiin I2C-tiedonsiirtoprotokollaa käyttäen.
ESP32:n liitäntä OLED:iin sisältää:
OLED-näyttö | ESP32 Pin |
---|---|
VCC | 3V3/VIN |
GND | GND |
SCL | GPIO 22 |
SDA | GPIO 21 |
Koodi
Avaa Arduino-editori ja lataa annettu I2C-skannauskoodi ESP32-kortille. Varmista, että ESP32 on kytketty ja COM-portti on valittuna.
***************
linuxhint.com
***************
***************/
#include
tyhjä asetus ( ) {
Wire.begin ( ) ; /* I2C-viestintä alkaa */
Serial.begin ( 115 200 ) ; /* Tiedonsiirtonopeus määritetty varten sarjaliikennettä */
Serial.println ( ' \n I2C skanneri' ) ; /* tulostaa skanneri sarjanäytössä */
}
tyhjä silmukka ( ) {
tavuvirhe, osoite;
int nLaitteet;
Serial.println ( 'Skannataan...' ) ; /* ESP32 aloittaa saatavilla olevien I2C-laitteiden skannauksen */
nLaitteet = 0 ;
varten ( osoite = 1 ; osoite < 127 ; osoite++ ) { /* varten silmukka tarkistaaksesi käytössä olevien laitteiden määrän 127 osoite */
Wire.beginTransmission ( osoite ) ;
error = Wire.endTransmission ( ) ;
jos ( virhe == 0 ) { /* jos I2C-laite löydetty */
Serial.print ( 'I2C-laite löytyi osoitteesta 0x' ) ; /* tulosta tämä rivi jos I2C-laite löydetty */
jos ( osoite < 16 ) {
Serial.print ( '0' ) ;
}
Serial.println ( osoite, HEX ) ; /* tulostaa I2C-osoitteen HEX-arvon */
nDevices++;
}
muu jos ( virhe == 4 ) {
Serial.print ( 'Tuntematon virhe osoitteessa 0x' ) ;
jos ( osoite < 16 ) {
Serial.print ( '0' ) ;
}
Serial.println ( osoite, HEX ) ;
}
}
jos ( nLaitteet == 0 ) {
Serial.println ( 'I2C-laitteita ei löytynyt \n ' ) ; /* Jos I2C-laitetta ei ole liitetty, tulosta tämä viesti */
}
muu {
Serial.println ( 'tehty \n ' ) ;
}
viive ( 5000 ) ; /* Viivästys annettu varten I2C-väylän tarkistus joka kerta 5 sek */
}
Yllä oleva koodi etsii käytettävissä olevia I2C-laitteita. Koodi aloitettiin soittamalla lankakirjastoon I2C-viestintää varten. Seuraava sarjaliikenne käynnistetään baudinopeudella.
I2C-skannauskoodin silmukkaosassa on kaksi muuttujan nimeä, virhe ja osoite määritellään. Nämä kaksi muuttujaa tallentavat laitteiden I2C-osoitteet. Seuraavaksi alustetaan for-silmukka, joka etsii I2C-osoitteen alkaen 0-127 laitteesta.
I2C-osoitteen lukemisen jälkeen tulos tulostetaan sarjanäytölle HEX-muodossa.
Laitteisto
Tässä näemme, että OLED 0,96 tuuman I2C-näyttö on kytketty ESP32-korttiin GPIO-nastoihin 21 ja 22. Näytön Vcc ja GND on kytketty ESP32 3V3- ja GND-nastalla.
Lähtö
Ulostulossa näemme ESP32-korttiin kytketyn OLED-näytön I2C-osoitteen. Tässä I2C-osoite on 0X3C, joten emme voi käyttää muita I2C-laitteita samalla osoitteella, jotta meidän on ensin vaihdettava kyseisen laitteen I2C-osoite.
Olemme saaneet onnistuneesti ESP32-korttiin liitetyn OLED-näytön I2C-osoitteen.
Johtopäätös
I2C-osoitteen löytäminen kytkettäessä useita laitteita ESP32:lla on tärkeää, koska laitteita, joilla on sama I2C-osoite, ei voida yhdistää yhden I2C-väylän kautta. Yllä olevaa koodia käyttämällä voidaan tunnistaa I2C-osoite ja jos minkä tahansa kahden laitteen osoite täsmää, sitä voidaan muuttaa vastaavasti laitteen teknisistä tiedoista riippuen.