PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PCF8574 - kein ACK zurück



RobotMichi
01.12.2010, 17:06
Hallo,

ich hab an den I2C-Bus meines RP6 einen PCF8574 angeschlossen, über den ich in weiterer Folge eine Matrix-Tastatur ansteuern will.
Ich habe die drei Addressierungsbits nicht belegt d.h. das Adressierungsbyte ist 0x40 (mit R/W-Bit nicht gesetzt) bzw. 0x41 (R/W-But gesetzt).
Wenn ich den PCF allerdings wie in folgendem Programm anspreche, bekomme ich I2C Errorcode 0x20 d.h. kein Ack zurück auf Schreibzugriff:


#include "RP6ControlLib.h"
#include "RP6I2CmasterTWI.h"

#define PCF8574_Schreiben 0x40
#define PCF8574_Lesen 0x41

void I2C_transmissionError(uint8_t errorState)
{
writeString_P("\nI2C ERROR - TWI STATE: 0x");
writeInteger(errorState, HEX);
writeChar('\n');
}


int main(void)
{
initRP6Control();
I2CTWI_initMaster(100);
I2CTWI_setTransmissionErrorHandler(I2C_transmissio nError);

I2CTWI_transmitByte(PCF8574_Schreiben, 1);

while(true)
{

task_I2CTWI();
}

return 0;
}

Bei einer Leseanfrage (natürlich mit Adresse 0x41) bekomme ich dann Errorcode 0x48 - Kein ack zurück auf Lesezugriff.

Was mache ich falsch?

lg
Michi

radbruch
01.12.2010, 17:54
Hallo

Ich kann leider auch nicht sagen was falsch ist, denn mit I2C habe ich noch nicht viel gearbeitet. Allerdings habe ich letztens eine Tastenmatrix mit PCF8574 am RP6-Base erfolgreich umgesetzt:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=525175#525175

Und ein PCF8574-LCD an der RP6-Base:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=525681#525681

Bei der Matrix ist die PCF8574-Adresse 000, beim LCD 001. Vielleicht kannst du dein Problem durch den Vergleich der Programme selbst finden.

Gruß

mic

[Edit]
Ach, den Matrix-Thread solltest du ja schon kennen ;) Warum schreibst du da nicht weiter?

m.a.r.v.i.n
01.12.2010, 19:40
Vielleicht hast du ja einen PCF8574A erwischt. Die haben eine andere Basisadresse.
Ist mir mal passiert. In einer funktionierenden Schaltung hatte ich den PCF8574 gegen einen neuen getauscht, ging nicht. Anderen neuen Chip rein, ging auch nicht. Alter Chip wieder rein, funktioniert. Reichelt hatte mir eine Charge von PCF8574A geschickt. :evil:

Dirk
01.12.2010, 20:01
@m.a.r.v.i.n

Vielleicht hast du ja einen PCF8574A erwischt.
Ja, dann könnte er ja einfach die Adresse ändern:
#define PCF8574A_Schreiben 0x70

Gruß Dirk

RobotMichi
02.12.2010, 14:37
Hallo,

nein, ist ganz sicher ein PCF8574 ohne A.

@radbruch: Ich dachte, das wäre ein anderer Themenbereich, weil es ja nicht wirklich um die Tastatur geht.

Der IC ist sicher nicht kaputt, ich habe einen anderen auch probiert.
Hätte ich für SDA und SCL Pull-Ups benötigt?

lg
Michi

radbruch
02.12.2010, 14:58
Hallo

Es hätte die aktuellen PCF8574-Projekte besser gebündelt, aber egal, schreiben wir hier weiter. Den Querverweis zum Tastatur-Thread (https://www.roboternetz.de/phpBB2/viewtopic.php?t=56693) habe ich oben ja schon gesetzt.

Da ich selbst im Moment an einem I2C-Projekt bastle, war der Einstieg mit der Tastatur und dem LCD schon mal sehr lehrreich. Nur verwende ich eben kein m32 oder m128, sondern das recht neue arm64 (ich mags mal so nennen) vom Miniroboterarm RA2 (natürlich auch von arexx;)

Zu den PullUps kann ich nur soviel sagen: Mit den orginalen 4,7k auf der RP6-Baseplatine hat mein I2C-Bus nicht funktioniert, wenn Base, arm64 und die zwei PCF8574 gleichzeitig angeschlossen sind. Erst nachdem ich zusätzlich je 1k dazugeschaltet hatte, funktionierte diese Konfiguration. Da du scheinbar das m32 verwendest, sollte man mal überprüfen, ob dieses überhaupt eigene PullUps besitzt.

Ich hatte meine PCF8574 vor dem Einbau übrigens genaustens untersucht um eine Verwechslung mit dem A-Typ auszuschliesen ;)

Gruß

mic

[Edit]
Ups, das m32 hat keine eigenen PullUps. Ist auch logisch, weil es ja als Erweiterung für den RP6 geplant war. Das bedeutet, du benötigst zwingend zusätzliche PullUps, wenn du nur das m32 und den PCF8574 verwendest.

RobotMichi
02.12.2010, 15:19
Hallo,

die Base ist ja ohnehin im Spiel für die Stromversorgung usw.

Ich versuch mal, die Erweiterung an die Base zu hängen - ohne die m32 um zu sehen, ob es dann funzt.

lg
Michi

[Edit]: Es funktioniert auch über die Base nicht. Ich habe das Programm soweit umgschrieben und die M32 abgesteckt. Das heißt, es liegt (zumindest nicht nur) an den PullUps.

TrainMen
02.12.2010, 16:41
Ich habe die drei Addressierungsbits nicht belegt d.h. das Adressierungsbyte ist 0x40 (mit R/W-Bit nicht gesetzt) bzw. 0x41 (R/W-But gesetzt).


aber an GND haste die schon ?
TrainMen

RobotMichi
02.12.2010, 16:43
hallo,

nein, muss ich die auf GND legen? :oops:
werd ich gleich mal testen!

danke!

lg
Michi

TrainMen
02.12.2010, 16:55
hi,
ja ist am einfachsten, Du kannst sie auch alle auf VDD legen dann wäre eben die Adresse 4E oder 7E
TrainMen

RobotMichi
02.12.2010, 17:39
Hallo

jetzt funktioniert's!
Danke für eure Bemühungen.

lg
Michi

radbruch
02.12.2010, 18:00
Verblüffend einfache Lösung :)