Nefunguje I2C čidlo! Popsali jsme nejčastější důvody.

Nefunguje čidlo připojené přes sběrnici I2C? Sepsali jsme článek, který by ti měl pomoc chybu najít a vyřešit.
Možné problémy s I2C

Sběrnice I2C (čteme I-squared-C) je jedna z nejpoužívanějších sběrnic vůbec. I když byla navržena pro použití mezi komponenty na desce – tedy žádné dlouhé vzdálenosti, najdou se takoví ostrostřelci, kteří čidlo připojí přes celý dům.

Tobě ale nefunguje čidlo ani na 5cm? Pojďme se společně podívat na to, kde by mohla být chyba. Sepsali jsme několik nejčastějších příčin.

Poznámka: pokud si nejsi jistý, jak vlastně I2C sběrnice funguje, mrkni na tento popis z wiki.

Chybí pull-up rezistory

Z podstaty funkce I2C sběrnice, datové vodiče – tedy SDA (data) a SCL (clock, hodiny) potřebují pull-up rezistory. To jsou rezistory připojené mezi vodič (odděleně SDA a SCL) a napájení čidla.
Pokud tedy čidlo nefunguje, velmi častý problém jsou právě chybějící pull-up rezistory nebo jejich špatná hodnota.
Nejčastěji se osazuje 4k7, ale správná hodnota by měla být odvozena od množství připojených I2C zařízení, délky vodičů a v neposlední řadě i rychlosti komunikace.
Čím delší vzdálenost mezi I2C zařízeními, tím menší by měla být i hodnota pull-up rezistorů. Hodnota by ale neměla být menší než 2k a to kvůli proudům, které pak tečou skrze interní tranzistory čidel. Originální součástky nebudou mít problém s nižší hodnotou rezistorů, ty „fejkové“ ale už možná ano.
Do této nepsané hodnoty se počítá kombinace rezistorů na I2C sběrnici ze všech zařízeních.

Do detailu se tomu věnuje Application Report od Texas Instruments (i s výpočtem rezistorů) https://www.ti.com/lit/an/slva689/slva689.pdf

Délka vodičů nebo špatné použití vodičů

Jak jsme napsali výše, správná hodnota pull-up rezistorů by měla být odvozena od počtu zařízení, rychlosti a také vzdálenost respektive kapacity vedení. I2C sběrnice definuje maximální kapacitu 400pF. Čím vyšší je kapacita vedení, tím nižší by měla být i hodnota pull-up rezistorů.
Vyšší kapacita totiž ovlivňuje hrany během komunikace a může se stát, že si zařízení prostě nebudou rozumět.
Méně než 2k by ses ale dostat neměl – pokud ti to ani pak nefunguje, vyměň kabel za ten s nižší kapacitou a nebo je prostě chyba jinde.

Prohozené datové vodiče

Častou chybou bývají prohozené vodiče SDA a SCL. Člověk je zvyklý, že u UART sběrnice se musí prohazovat RX -> TX a naopak a nevědomky to třeba udělá i u I2C sběrnice.
U I2C sběrnice musí SDA prvního zařízení být připojeno na SDA druhého zařízení a to samé i pro SCL.

Pokud nechcete udělat chybu v zapojení mezi čidlem a deskou, pak můžete zvolit řešení v podobně I2C uŠup konektoru a kabelu. Tento kabel s definovaným pinoutem a také zámkem zajišťuje vždy správné propojení desky a modulů.
Jen je potřeba dát pozor na nákup správného typu kabelu, ten musí mít označení μŠup nebo STEMMA QT nebo Qwiic JST-SH 4-pin.

μŠup, STEMMA QT, Qwiic JST-SH 4-pin kabel – 5cm

μŠup, STEMMA QT, Qwiic JST-SH 4-pin kabel – 10cm

μŠup, STEMMA QT, Qwiic JST-SH 4-pin kabel – 20cm

Napájení

Dalším z možných problémů je velmi slabé napájení, kdy během funkce čidla – například během měření – poklesne napájení v důsledku vyššího odběru proudu a tím selže i komunikace.
Obdobný problém může způsobit i špatně propojená zem – GND.

Rozdílné logické úrovně

Logické úrovně sběrnice definují pull-up rezistory. Pokud ale jedno zařízení je napájeno z 3.3V a druhé například z 5V, může se stát, že se obě zařízení nedomluví, v lepší případě, a v horším se to první zařízení může zničit.
Aby se tak nestalo, použij buď obě zařízení (typicky čidlo – řídící deska) se stejným napájecím napětím – stejnými logickými úrovněmi (u některých čidel je napájení 5V, ale logické úrovně sběrnice jsou 3.3V) – nebo využij level-shifter (převodník logických úrovní).

I2C piny

Ne všechny řídící desky (například s ESP32-C3, ESP32, ESP8266 nebo Arduino) mají I2C piny – SDA a SCL – na stejných GPIO pinech.
Často se tak stane, že bastlíř přepojí čidlo z ESP8266 na ESP32-C3 na stejné GPIO piny, ale přitom je ESP32-C3 má na jiných GPIO.
Je proto správné si předem zkontrolovat pinout desky a zjistit, kam to SDA a SCL je vlastně připojeno.
Potom je třeba definovat v kódu jiné I2C piny, tedy místo:

Wire.begin();
použít (je to závislé od konkrétní desky)
Wire.begin (21, 22)
kde SDA je na pinu 21 a SCL na pinu 22

Více stejných I2C čidel

Posledním z častějších problémů je použití stejných I2C zařízení.
Stejná I2C zařízení mají zpravidla i stejné adresy – pokud tomu tak je, budou se během komunikace ovlivňovat a tak dojde k nedorozumění na drátech a komunikace se rozpadne.
Některá čidla mají možnost nastavení adresy (zpravidla jeden pin může být připojen na napájení (jedna adresa), nechat nezapojený (druhá adresa) nebo jej přizemnit (třetí adresa).
Jiná čidla mají zase jiné adresy už z výroby – jiný part number – číslo součástky.
A další zradou je, že i jiná čidla stejného výrobce mohou mít stejné I2C adresy – třeba Sensirion SHT41 a SHT45.

Zarušení

Občas může být komunikace prostě a jen zarušená – bohužel bez osciloskopu to zjistíš těžko.
Na druhou stranu lze ve většině případů použít selský rozum -> pokud mám I2C vodiče vedeny přes nějaký prvek na desce, který vyzařuje hodně energie, může být problém v tomhle.

Prostě je zničené

A posledním důvodem proč „to nefunguje“ může být prostě to, že zařízení odletělo do křemíkového nebe.

Skener I2C zařízení

Velkým pomocníkem je I2C Scanner – tento jednoduchý program dokáže najít připojené čidlo a tím vývojáři pomoci zda to čidlo opravdu žije a jakou má I2C adresu.
Pokud je ale chyba v chybějících pull-up rezistorech, napájení, přehozených I2C pinech atp., s tím bohužel pomoci nedokáže.

Poznámka pro milovníky našich desek a modulů – na každé desce a modulu s I2C máme pull-up rezistory. Pokud jich zapojíš více za sebe, může se stát, že se hodnoty jednotlivých pull-up rezistorů podělí a výsledná hodnota bude nižší než doporučených cca 2k7. Zkontroluj tedy, zda není pájecí most, který je připojený k napájení a pull-rezistorům, zapájený-propojený na všech deskách. Stačí na jedné či dvou.

Sdílet článek

3 Responses

  1. Zdravím.
    Pokud tedy mají stejnou adresu, tak je otázkou zdali se dají (např. SHTxx) od firmy Sensirion přeadresovat třeba přes arduino. To by jistě zajímalo nejen mě, ale i spoustu dalších lidí, kteří chtějí používat více čidel na stejné lince I2c a byli zklamáni tím, že všechna čidla mají adresu 0x40. Bohužel po dlouhém pátrání jsem nenašel článek, který by se tím zaobíral.
    Hezký den.

    1. To bohuzel nejde. Arduino samo o sobe nemuze zmenit adresu cidla, pokud to cidlo nedovoluje (at uz pomoci SW ci dedikovanymi piny).

      Resenim je pouzit, pokud to ridici cip dovoluje, vice hardwarovych I2C.
      Jedno cidlo na I2C1, druhe cidlo na I2C2.
      Pokud ridici cip ma pouze jednu HW I2C, pak je mozne vytvorit softwarovou – takove knihovny jsou dostupne jak pro Arduino tak i ESP32.

  2. Chtěl bych se jen vyjádřit k poznámce, že na každé desce máte pull-up rezistory. To je z principu sběrnice I2C špatně. Tato sběrnice je kouzelná tím, že informace se přenáší budičem, který je tvořen tranzistorem v zapojení open-colector. Tímto se přenáší pouze informace o logické 0. Logická 1 je definována pull-up rezitory. Rezistory mají být součastí sběrnice a mají zajišťovat klidový stav sběrnice. Zařízení se mají připojovat bez těchto rezistorů, aby se zabránilo snižování zvedacího odporu paralelní kombinací všech pull-up odporů. Ale co je hlavní je částečná napěťová nezávislost. Jestliže se připojí pull-up rezistory na napětí 3.3V, bude klidový stav (log. 1) 3.3V, což je správně. Pro 5V logiku je rozhodovací úroveň 2.3V, takže 3.3V bude interpretováno také jako logická 1. Logická 0 bude vždy téměř 0 u jakékoliv logiky. Jestliže se naždém modulu připojí pull-up rezistory, budou všechy paralelně a sníží se jejich hodnota jak je popsáno výše. Větší problém je v tom, že různá zařízení můžou být napájena z různých napětí (3,3V nebo 5V) a když budou tyto odpory připojeny k napájecímu napětí modulu, stane se to, že se napětí 5V z externího modulu dostane přes pull-up odpor na pin mikrokontroléru, který akceptuje pouze 3.3V a tento pin se může zničit. Proto se na externí moduly nemají dávat pull-up rezistory (stejně jako nejsou na integrovaných obvodech pamětí, expandérů, A/D převodníků a jiných). Pull-up rezistory se navrhují na DPS, kde je sběrnice a připojují se k napětí, které je nejnižší, aby to akceptoval každý modul. Samozřejmě se bavíme o napětích 3.3V a 5V, abychom se nedostali do zakázaného pásma. Pak není třeba žádných převodníků úrovně.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Mohlo by se také líbit