ATmega32A + 16-bit MCP23016 po I2C, expander neposílá ACK

Ahoj všem,
už týden se s kolegou pokoušíme zapojit expandér a stále se nám nedaří. Mám dojem, že už známe datasheety slovo od slova. Kdyby nám někdo poradil, kde by mohl být problém, moc by nám pomohl…díky

Popis: Na MCU máme ex. krystal 16MHz. LEDkama kontrolujeme stav komunikace. MCU bez problému vyšle START i adresu expanderu. Expander však nepošle ACK.

Díky

Filip

:arrow_right: administrator: přejmenováno z “Atmega32A + expander (MCP23016)…po I2C”


expander.c (2.43 KB)

Tak ako si poslal, sa “zapojenie” kreslilo zaciatkom minuleho storocia. Mas tam vobec pull-up rezistory? To kto ma z toho obrazku lustit? Nabuduce posli normalnu schemu. :slight_smile:

To je síla… :unamused:.
Kde jsou sériové odpory ledek?

kód vypadá jak z codevision -proč nepoužíváte jeho knihovnu pro I2C ?

A víte vůbec o tom, že adresa obvodu MCP23016 je 0b00100xxx - x nastavujete na vývodech A0-A2? Ale snad jo, když k těm vývodům vedou drátky :slight_smile: - pak by měla být 0x27. Podle mně posíláte jenom adresu registru a data pro něj, ale ne adresu součástky - pak je jasné, že neposílá ACK.

Kde máte RC oscilátor pro expander?
Nevidím ani pullupy pro SCL a SDA, pokud tedy nejsou integrované na tom vývojovém kitu.

Nechci být nějak zlý, ale podle bastlu na nepájivém poli to nevypadá, že cituju: " už známe datasheety slovo od slova" spíš naopak.

Prostě spousty chyb jak v HW tak v SW.

Dobrý den.
Knihovny z CodeVisionu jsme pochopitelně použili jako první možnost. Po dlouhém a neúspěšném laděníení jsme zkusili napsat komunikaci sami, podle datasheetu MCU ATmega32.

Piny pro bližší určení adresy A0-A2 jsou uzeměny. Adresa je tedy 0b0100000 + R/W bit, tedy pro čtení 0b 01000000, tedy 40h

Pro nepřehlednost obrázku výše připojuji schéma zapojení.
Dále ještě připojuji C-file s použitím knihoven I2C.

RC obvod je realizován odporem R1 a kondenzátorem C1, podle datsheetu expandéru.
gme.cz/_dokumentace/dokument … -288.1.pdf

Pro doplnění - zpoždění 12us po zaslané adrese je dáno požadavkem MCP23016, jako prodleva mezi doručením a příjmem nových dat.
I2C.c (3.51 KB)

No vida - to už je lepší schema.
takže pokud je to zapojené podle schematu - tam bych možná viděl jeden problém (nemusí být) v pullupech - jestli nejsou moc malé (1k) - doporučené bývají tak 5k6, někdo dokonce tvrdí, že by měly být větší než 10k, ale já dávám 4k7, nebo 5k6.
A čím detekuješ tu ACK - log. analyzer, osciloskop? Možná ta velká zátěž (1k + sonda) dělá problém.
Dál fakt nevím proč by to nemělo chodit.

Jinak já celkem úspěšně a bez problémů používám tu CV variantu sice ne u expanderu - u RTC a EEPROMy ale to je jedno.

A možná malá poznámka k funkci - tu adresu device bych dal do parametrů - tam pak zadával jen hodnoty v rozmezí 0x00 - 0x07 a ž pak v těle funkce ji vymaskoval tím 0x40 - při použití dalšího expanderu nebudeš muset připisovat další funkci jen kvůli adrese device, kterou máš schovanou uvnitř funkce, což mně popravdě nejdřív zmátlo a myslel jsem, že ji ani neposíláš.
Ale to je jen detail.

Děkujeme mockrát za pomoc. Po zapojení Pull-Up rezistorů 5k6 to běhá jako po másle :slight_smile: Ještě jednou díky.