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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.