Pracuji na projektu svých digitronových hodin které budou řízené přes NTP. Jsem ve fázi, kdy programuji funkce pro manipulaci s registry přes SPI pro ethernetový čip ENC28J60.

Při testování jsem zjistil, že když čtu některý z registrů, tak pokaždé dostanu jinou hodnotu, i když s dotyčným registrem nijak jinak nemanipuluji. I když jsem ten registr četl dvakrát, třitkrát za sebou, tak jsem pokaždé přečetl jinou hodnotu. Zajímavé bylo, že občas byla mezi přečtěnými hodnotami hodnota správná. Také zápis do registrů nedělal to, co bych od něj očekával.

Začal jsem tedy procházet kód, našel jsem nějaké chyby, opravil jsem je, ale výsledek byl pořád stejný. Dále jsem v internetových diskuzích našel informace, že rané verze datasheetu obsahují chyby (chybné adresy registrů a další) a já jsem vycházel z revize C, kterou mi našel vyhledávač a nejaktuálnější revize je E. Opravil jsem tedy kód podle aktuálního datasheetu, ale stále se nic nezměnilo.

Dále jsem se dočetl, že ENC28J60 má spoustu vnitřních chyb, takže jsem nastudoval errata, opravil jsem podle nich několik věcí, ale žádná z popisovaných chyb by neměla způsobovat problémy s přístupem do registrů.

Další den jsem připojil logický analyzátor na SPI sběrnici a sledoval jsem, jaká data si mezi sebou čipy vyměňují. Nic podezřelého jsem ale nevysledoval. Mikroprocesor odesílal správná data, ale ENC28J60 odesílalo nějaké náhodné věci.

Nyní jsem tedy věděl, že problém by němel být v kódu, ale někde kolem ENC28J60. ENC28J60 potřebuje k napájení 3.3V, které mu zajišťuje integrovaný stabilizátor LF33. Tento stabilizátor celkem hodně hřál - přeci jenom vstupní napětí je 12-14V což při proudu cca 100mA vytváří výkonovou ztrátu kolem 1W. Napadlo mě tedy, že třeba zasahuje tepelná ochrana a snižuje výstupní napětí. Multimetrem jsem na výstupu změřil 3.2V, což mi nepřipadalo až tak podezřelé, ale osciloskop ukázal, že výstup stabilizátoru nepěkně kmitá. Minimální hodnota napětí byla 2.32V, maximální 4.24V a rozkmit 1.92V.

Chtěl jsem změřit, jaký proud tedy doopravdy přes stabilizátor teče. Odpojil jsem výstupní pin stabilizátoru a ze zvědavosti jsem se na něj podíval osciloskopem a byl jsem hodně překvapený, že výstupní napětí stále kmitalo, i když ke stabilizátoru nebyla připojena žádná zátěž.

Zběžně jsem pročetl datasheet LF33, ale ničeho zajímavého jsem si nevšiml. Při dalším pátrání na internetu, jsem narazil na článek Vezmu LF33 a žádný problém?, ve kterém jsem se dočet, že na výstupu stabilizátoru musí být kondenzátor s ESR 0.1 - 10Ω, jinak se budou dít nepěkné věci.

Když se podíváne na to, jak mám zapojený stabilizátor já:

Tak vidíme, že jsem použil keramické SMD kondenzátory 100nF, podle běžné poučky, že ke stabilizátoru patří kondenzátory 100nF, které mají zabránit kmitání výstupu.

V datasheetu lze ale nalézt tyto informace:

Tedy že na výstupu má být elektrolytický kondenzátor o kapacitě minimálně 2.2μ, typicky 10μF s ESR 0.1 - 10Ω.

Po výměně tohoto kondenzátoru za elektrolytický 10μF se výstup stabilizátoru uklidnil a ENC28J60 začalo správně komunikovat s mikroprocesorem. Měl jsem také štěstí, protože ENC28J60 má maximální povolené napětí 3.6V a stabilizátor měl na výstupu chvílemi přes 4V.

Z totoho příběhu tedy vyplývá ponaučení, že se ke každé součástce vyplatí nastudovat datasheet, protože kdybych to při návrhu schématu udělal, tak bych si ušetřil dva dny, kdy jsem hledal, kde je chyba.