logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Podłączenie PCF8574 i MCP23017 po jednej I2C do Atmegi

mumin_80 02 Cze 2011 23:49 2569 5
REKLAMA
  • #1 9571568
    mumin_80
    Poziom 12  
    Witam Szanownych Forumowiczów
    Mam następujący problem z kompatybilnością dwóch expanderów na I2C.
    Mianowicie jak mam podłączone na jednej szynie PCF8574 i MCP23017 to nie odpowiada mi PCF8574. Jak tylko wyjmę z szyny MCP23017 to układ PCF8574 zaczyna działać. Funkcje oczywiści są różne do obydwóch expanderów ze względu na bardziej skomplikowany układ MCP.
    Przyjżałem się dokładnie sprawie i wygląda na to, że gdy oba układy są podpięte do szyny to PCF8574 nie odpowiada ACK po wysłaniu bajtu z jego adresem tzn: <bajt startu>, <bajt z adresem>.

    Czy ktoś może spotkał się z takim problemem ?

    Pozdrawiam
    mumin
  • REKLAMA
  • #2 9572086
    adamz74
    Poziom 32  
    Czy komunikacja z MCP23017 działa?
    Czy przypadkiem nie masz konfliktu adresów na magistrali I²C?

    Pozdr!
  • REKLAMA
  • #3 9572171
    mumin_80
    Poziom 12  
    Komunikacja z MCP23017 działa.
    Konfliktów nie ma, PCF ma adres 0, dwa MCP'y mają 4 i 7.

    Wydawałoby się że powinno wszystko działać bo z tego co wiem to oba
    układu obsługują I2C ale widać coś nie do końca :)

    mumin
  • REKLAMA
  • REKLAMA
  • Pomocny post
    #5 9572370
    tmf
    VIP Zasłużony dla elektroda
    0, 4, 7? Coś te adresy są nie teges, chyba, że podajesz tylko A0-A3. Jakie masz rezystory podciągające? Spróbuj zwolnić transmisję i sprawdź czy to pomoże. Ale generalnie jeśli miałem cyrki z I2C to głównie z powodu źle dobranych rezystorów podciągających (zbyt małe w stosunku do prądu wyjściowego układów, lub za duże w stosunku do prędkości magistrali).
  • #6 9572452
    mumin_80
    Poziom 12  
    0,4,7 to adresy na pinach A0,A1,A2.
    Rezystory podciągające 4.7k.

    Szybkość transmisji 92160 kHz.

    #define F_CPU 11059200UL

    void TwiInit()
    { //Set up TWI Module
    TWBR = 13;
    TWSR &= (~((1<<TWPS1)|(1<<TWPS0)));
    }

    Spróbuje zwolnić prędkość, może coś pomoże.
    Z innymi rezystorami też sprawdze, dzięki.

    Albert

    Dodano po 4 [minuty]:

    Dondu,
    Funkcje wyglądają tak:
    PCF 8 bit:


    int SetPcf8(int pcf,unsigned char value){
    twi_start();
    if(! twi_write(PCFADDR|TW_WRITE|(pcf<<1),TW_MT_SLA_ACK)){return 0;};
    twi_write(value,TW_MT_DATA_ACK);
    TW_STOP();
    if(debug){printf("XXX DONE\n\r");};
    return 1;
    }

    Wywołuje ją tak: SetPcf8(0,0xf3);

    PCT 16 bit:

    int SetIoPcf(int pcf,int reg,unsigned char data)
    {
    twi_start();
    if(!(twi_write(PCFADDR|TW_WRITE|(pcf<<1),TW_MT_SLA_ACK))){return 0;};
    twi_write(reg,TW_MT_DATA_ACK);
    twi_write(data,TW_MT_DATA_ACK);
    TW_STOP();
    if(debug){printf("XXX DONE\n\r");};
    return 1;
    }
    a tą wywołuje tak:
    SetIoPcf(7,0x12,0x08)


    Albert
REKLAMA