Ahoj,
mám teplotní sensor, který komunikuje po I²C připojenej k ESP32. Používám Arduino a sensor je připojený na piny 32 a 33.
Normálně, kdykoli člověk čte o I²C, tak pokaždé narazí na vnější pull upy. Vím, že existují procesory, které umožňují zapnout vnitřní pull up na I²C pinech. Ale u ESP32 pořádně nevím, jestli se na ně mohu spolehnout nebo ne? Existuje na toto téme nějaký snadno pochopitelný návod, kde bych si o tom mohl něco přečíst?
Díky
ESP32 a I²C
ESP32 a I²C
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
Re: ESP32 a I²C
Bezva, už to vím.
Píšou o tom v Návodu.
Píšou o tom v Návodu.
návod píše:i2c_master_bus_config_t::enable_internal_pullup
enables internal pullups. Note: This is not strong enough to pullup buses under high-speed frequency. A suitable external pullup is recommended.
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
-
- Příspěvky: 35
- Registrován: 24 říj 2023, 18:45
Re: ESP32 a I²C
A jaké jsou hodnoty těch interních pullupů u ESP32? Já našel, že hodnoty jsou v rozmezí 10-100K s tím, že nejčastěji to je 45-50K. To je na I2C málo, protože při napájení 3V3 by to mělo být cca 2K2 - 2K5. Čili bych tam dal asi externí pullup 2K7 a mělo by to chodit ve všech případech.
Stejnou věc jsem už řešil u Arduina (ATmegy328), kde je interní pullup podle datasheetu v rozmezí 20K-50K. Přitom by pro 5V I2C měl být kolem 5K. Abych nemusel zkoumat cizí kód, když si jen chci něco vyzkoušet a abych měl jistotu, že to bude fungovat za všech okolností i s vypnutým pullupem, dávám externě na A4 a A5 odpor 5K6 nebo 6K8. Ale ještě předtím si oměřím, jestli na sobě pullupy nemá připojovaný I2C modul.
Prolezl jsem spoustu Arduino I2C tutoriálů a v podstatě takovouhle "malichernost" nikde neřeší. Tohle jsem našel v jednom tutoriálu a hodně mě to pobavilo (a vyděsilo zároveň):
Teorie také tvrdí, že na SDA a SCL bychom měli odporem připojit VCC. Ze zkušenosti vám můžeme říci, že na krátké vzdálenosti (zapojování pár zařízení v breadbordu atd.) to vůbec není potřebné. Případný rezistor budeme potřebovat pouze pokud nám na delších vzdálenostech něco nebude správně fungovat. Sběrnice je tedy určena pro krátké vzdálenosti, ale s odpory je možné na UTP kabelu dosáhnout i délky 10 metrů. Na druhém konci pak bude bez problému fungovat LCD i s expandery.
Zkrátka teorie je asi úplně na dvě věci. Buď to fungovat bude a nebo se tam přinejhorším dá nějakej "vodpůrek". A firmy, jako třeba TI, si s tím dávají zcela zbytečnou práci: I2C Bus Pullup Resistor Calculation. Kam ten svět spěje...
Stejnou věc jsem už řešil u Arduina (ATmegy328), kde je interní pullup podle datasheetu v rozmezí 20K-50K. Přitom by pro 5V I2C měl být kolem 5K. Abych nemusel zkoumat cizí kód, když si jen chci něco vyzkoušet a abych měl jistotu, že to bude fungovat za všech okolností i s vypnutým pullupem, dávám externě na A4 a A5 odpor 5K6 nebo 6K8. Ale ještě předtím si oměřím, jestli na sobě pullupy nemá připojovaný I2C modul.
Prolezl jsem spoustu Arduino I2C tutoriálů a v podstatě takovouhle "malichernost" nikde neřeší. Tohle jsem našel v jednom tutoriálu a hodně mě to pobavilo (a vyděsilo zároveň):
Teorie také tvrdí, že na SDA a SCL bychom měli odporem připojit VCC. Ze zkušenosti vám můžeme říci, že na krátké vzdálenosti (zapojování pár zařízení v breadbordu atd.) to vůbec není potřebné. Případný rezistor budeme potřebovat pouze pokud nám na delších vzdálenostech něco nebude správně fungovat. Sběrnice je tedy určena pro krátké vzdálenosti, ale s odpory je možné na UTP kabelu dosáhnout i délky 10 metrů. Na druhém konci pak bude bez problému fungovat LCD i s expandery.
Zkrátka teorie je asi úplně na dvě věci. Buď to fungovat bude a nebo se tam přinejhorším dá nějakej "vodpůrek". A firmy, jako třeba TI, si s tím dávají zcela zbytečnou práci: I2C Bus Pullup Resistor Calculation. Kam ten svět spěje...
Re: ESP32 a I²C
Podle mě je to tak že příliš slabý (velký) pull-up zpomaluje komunikaci (lze na toto téma najít obrázky z osciloskopu, v zásadě jde o to, že se čeká, až pull-up nabije parazitní kapacitu na SCL) a zvyšuje riziko chyby v přenosu dat. V datasheetu od ATMega328p (= Arduino Uno) se explicitně píše, že interní pull-up rezistory (které jsou srovnatelné s ESP32) v "některých systémech" mohou eliminovat nutnost externích:
V zásadě tedy souhlasím s dehonestovaným autorem dříve zmíněného tutoriálu - pokud není připojených zařízení moc, a vzdálenost není velká, tak na pull-up rezistory kašlu a ono to i tak funguje. Samozřejmě, když člověk dělá čtyřvrstvý PCB a Vcc kamkoliv přivede jednou průchodkou a mikroskopické odpory mu tam za 0,001$ osadí automat, tak asi není moc důvod je tam nedat, ale u vrabčího hnízda se to spíš nevyplatí.Note that the internal pull-ups in the AVR pads can be enabled by setting the PORT bits corresponding to the SCL and SDA pins, as explained in the I/O Port section. The internal pull-ups can in some systems eliminate the need for external ones.
Re: ESP32 a I²C
Já bych zůstal u toho co píšou v tom ESP sheetu. Jejich pullupy mají moc velkou hodnotu pro používání I²C v plné rychlosti. Moc velké hodnoty znamenají moc trapézovité náběžné hrany a tedy nutnost pomalé komunikace. Kdo chce sběrnici používat rychle, dá si tam externí odpory.
Za pravopisné chyby v této zprávě může moje učitelka češtiny.