MCP23008 - komunikuje jen chvili

Ahojte,
mám trošku problém rozkomunikovat MCP23008. Mám to připojený k dsPIC33EP a na I2C sběrnici mám 2ks toho MCP. Jeden má adresu 1 a druhej 5. I2C mi bhá po plochým kabelu o délce cca 30 cm.
Nedaří se mi je pořádně rozmluvit, resp. první ch pár zpráv seberou a posílají ACK, pak už ne.

Po inicializaci dsPIC pošlu do každýho MCP nastavení I/O a výchozí stav portu, tj. celkem 6B pro oba brouky. Tohle je jediný, kdy mi to komunikuje a pak už nekomunikují.
Na I2C mám pull-up 2k2 proti 5V, na 3,3V mi to nechodilo vůbec a s 5V napájením to jede aspoň po připojení napájení do celé hlavní desky. Připojení a odpojení plochého kabelu nemá vliv na funkčnost komunikace. Na log. analyzátoru a ani na oscáku nevidím, že by tam pak bylo něco jinak.
Díky

Rychlost komunikacie? V datashete som videl aj 1k odpory.
Reset pin pripojeny cez odpor na vcc a zablokovany proti zemi keramikou.

Na rychlost jsem zapomněl. Zkouším 400kHz, ale na 100k to funguje stejně blbě. Jeden MCP ma reset přímo na vcc 5V a druhej je přes 10k na vcc a 100n proti zemi. Napajeni je samozřejmě blokováno 100n, 2n2 a 22u keramikou. Všude jinak používám low-esr kondiky. Přinejhorším to nahradim nějakým levným PICem a komunikaci po uartu.

Skus to ovladat s inym pickom. Mas to v cecku?

Jiný PIC teď použít nemůžu. Mám tam ještě EEPROM M24C04 a ta komunikuje bez jediného problému.
Celý to mám napsaný v C. Hodím sem screeny z analyzátoru jak to vypadá. I2C knihovnu používám nějakou upravenou od Microchipu z pic 16 akorát jsem ji přepsal aby to šlapalo na dsPIC.

Přihodil jsem pár obrázků z komunikace.
Na sběrnici je ještě EEPROM M24C04 a ta komunikuje bez jediného problému. Jediný co nechodí jsou ty zmíněný MCP.



Asi už tuším odkud vítr vane. Napětí na I2C sběrnici mám jen 3V3 i když mám pullupy pověšený na 5V. MCP potřebuje mít aspoň 4V aby bralo logickou úroveň. Takže 5V tolerantní vstupy na dsPIC neznamenají že nemají diody na VCC. Akorát nechápu proč to zezačátku funguje pár stovek ms a pak už ne.

A ked vlozis diody do data a clk a vypnes pullup na uP to nestaci? Alebo odporovy delic tj namiesto diod odpory.

V jedom projektu jsem použil MCP23S17 (SPI verze obvodu) a komunikace mezi MCP (5V) a Raspberry (3,3V) v provedení odporový dělič z 5V na 3,3V a odpor v serii z 3,3V na 5V nefungoval. Spolehlivě to začlo chodit až když jsem použil napěťový převodník pomocí BSS138 a dvou pull-up odporů na každém signálu.

Problém vyřešen, do napájení MCP jsem dal do serie 2 diody a stáhnul jim napájení na 4V. Pak už se s 3V v IDLE na sběrnici vlezu a krásně to chodí až do 1,33 MHz.
Časem tam lupnu stabilizátor z 5V na 3,3 ať je po problému. Anebo ten BSS oddělovač.
Každopádně musím říct, že tento problém se mnou po dlouhé době zas vyjebal :smiley:

Vidim ze si to zmakol. A pwriferiam nevadi ze maju len 4v?

No zmákl jsem to. Ale mám 20 ks tišťáků, který bez jednoho přeškrabu nefungují :frowning:
4V jsou asi jedno, MCP má fungovat od 1,8 - 5V, akorát teda to striktní sledování úrovně mě dostalo, bral jsem, že to má na vstupu CMOS tolerance.

No veď to práve to CMOS toleranciu má (log.H > 0.7*Ucc = 3.5V pre 5V Ucc.).
No memá to TTL toleranciu (log.H >2.4V).
Preto veľa krát používam HCT (nie HC) logiku pre prevod úrovní s dostatočnou rýchlosťou.
BSS138 s dvoma pullup-mi je fajn, no ak chceš vyššie rýchlosti, treba nízke hodnoty odporov pre rýchlejšie nabíjanie parazitných kapacít, čo následne spôsobuje vyššiu spotrebu.