Portexpander PCF8574

Gast #5372553
Hallo,

Ich habe ein seltsames Verhalten bei dem Portexpander PCF8574 (I2C 
Bus)festgestellt. Auch nach mehrtägiger Untersuchung des Problems habe 
ich keine schlüssige Erklärung.

Ich betreibe den PCF8574 an der TWI Schnittstelle (PORTC) eines XMEGA32

Mit folgendem Code lese ich den PCF8574 ein.

// Read byte
uint8_t PCF8574_IO_Read(uint8_t address)
{
  // prepare PCF8574 for read
  Write_byte(address, 0xff);
  // Wait for transmission complete
  while(!(Port_TWI.MASTER.STATUS & TWI_MASTER_WIF_bm));

  // Send address
  Send_Address_PCF8574(address, 1);
  // Wait for transmission complete
  while(!(Port_TWI.MASTER.STATUS & TWI_MASTER_RIF_bm));

  // send TWIF Stop
  Port_TWI.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;

  // Get Data
  return Port_TWI.MASTER.DATA;
}

Funktioniert einwandfrei, solange man nicht den P7-Eingang auf "0" legt.
Siehe Anhang FF.jpg (eish...sollte 7F heißen)

Ist Bit 7 "1" funktioniert es (siehe Anhang BF.jpg)

Auf dem Logikanalyser sieht man, dass SDA nicht wieder auf "1" geht, 
wenn P7 bei der Einlesung auf "0" lag.
Was ich nicht verstehe, wieso hat der Status eines Portpins überhaupt 
Einfluss auf die Bussignale. Wie gesagt, nur das Bit 7.

Hab es mit mehreren ICs ausprobiert, SMD, SIL. Identisches Verhalten.

Für jeden Tip bin ich dankbar, da mich das Teil in den Wahnsinn treibt 
:-)

LG
Rainer
Angehängte Dateien:
Rainer schrieb:
> Funktioniert einwandfrei, solange man nicht den P7-Eingang auf "0" legt.

wie legst Du den genau auf "0"? Direkt an GND oder über einen 
Widerstand?

Hast Du mal die tatsächliche Spannung am Pin 7 mit Multimeter/Oszi 
gemessen?

Der PCF8574 hat keine Umschaltmöglichkeit zwischen Ein- und Ausgängen, 
er verwendet stärkere Pullups. Wenn Du jetzt einen Pin über nen 
Widerstand auf 0 legen willst, aber durch den Pullup irgendwo in der 
Mitte landest, bist Du im undefinierten Bereich und das kann der IC Dir 
übel nehmen.

Der MCP23008 hat echte GPIOs mit Richtungsumschaltung und ist daher 
weniger zickig.
Hallo,

der Pin7 liegt direkt auf GND.

Bei allen anderen PINs funktioniert es einwandfrei. Nur wenn Pin7 bei 
der Einlesung auf GND liegt nicht.

D.h. bei allen Einlesungen an den Portpins > 0x80 funktioniert es nicht, 
unter 0x80 funktioniert es einwandfrei.


R.
Rainer schrieb:
> Funktioniert einwandfrei, solange man nicht den P7-Eingang auf "0" legt.
> Siehe Anhang FF.jpg (eish...sollte 7F heißen)

Ich setze den PCF8574 seit über 10 Jahren ein. Mit diesem IC hatte ich 
noch nie Probleme gehabt. Es ist zudem sehr einfach und auch robust. Wie 
sieht denn Deine Schaltung und Dein Aufbau aus. Könnte Port 7 (12) und 
SDA (15) vielleicht einen Kurzschluß haben? Das wäre meine Vermutung.
mfg klaus
Hallo,

HW ueberprüft, alles soweit ok. Die hatte ich auch im Verdacht.

Hab heute den ganzen Tag die Foren im Netz durchsucht. Hab auch jemanden 
gefunden, der auch das P7-Problem mit dem PCF8574 hatte.
Liegt an der SW.

Macht man es so (s. u.), funktioniert es. Warum die ursprüngliche 
Version aber genau mit dem Bit P7 ein Problem hat und alle anderen 
funktionieren, ist nicht herauszufinden.

Egal, nun funktioniert es.

Vielen Dank für die Hilfe

// Read byte
uint8_t PCF8574_IO_Read(uint8_t address)
{
  // prepare PCF8574 for read
  Write_byte(address, 0xff);
  // Wait for transmission complete
  while(!(Port_TWI.MASTER.STATUS & TWI_MASTER_WIF_bm));

  // send STOP command
  Port_TWI.MASTER.CTRLC =  TWI_MASTER_CMD_STOP_gc;

  // read Port
  Port_TWI.MASTER.ADDR = address + 1;
  while(!(Port_TWI.MASTER.STATUS & TWI_MASTER_RIF_bm));

  // send ACKACT and STOP command
  Port_TWI.MASTER.CTRLC = TWI_MASTER_ACKACT_bm |TWI_MASTER_CMD_STOP_gc;
}


Rainer

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.