Forum: Mikrocontroller und Digitale Elektronik Portexpander PCF8574


von Rainer (Gast)


Angehängte Dateien:

Lesenswert?

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

von Gerd E. (robberknight)


Lesenswert?

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.

von Rainer F. (cnccontroller)


Lesenswert?

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.

von Klaus R. (klara)


Lesenswert?

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

von Rainer F. (cnccontroller)


Lesenswert?

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

von Bernd K. (prof7bit)


Lesenswert?

Beide Oszillogramme sehen seltsam aus. Was sind das für zwei langsame 
Takte am Ende auf SCL? Machst Du selbstgestricktes Software-I2C?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.