PCF8574 Ein-/Ausgänge

#2604167
Lesenswert?

Hallo,

ich habe ein kleines Problem mit meinem IO-Expander (PCF8574).
Ich verwende ihn in einer Schaltung für 4 Ein- (Optokopller) und 4 
Ausgänge (Darlington Treiber --> Relais). (siehe Anhang)

Ich kann Daten sowohl lesen, als auch schreiben, das Problem ist aber, 
dass beim Lesen die Ausgänge kurzzeitig alle auf low geschalten werden. 
Ich weiß nicht woran das liegt. Die Kommunikation läuft per Soft-I2C auf 
einem STM32 (ja, ich weiß dass der auch I2C Hardware hat).

Hier mal der Codeausschnitt mit dem ich lese und schreibe (läuft zur 
zeit im main als endlosschleife ab (mit Delay, denn sonst klappern meine 
Relais):
1
    //READ
2
    I2C1_Start(); 
3
    I2C1_SendByte(0x40);  //Schreibadresse
4
    I2C1_WaitAck();
5
    I2C1_SendByte(0xF0);  //Eingangspins HIGH sezten --> auch bei 0xFF 
6
                          //bleibt der Fehler erhalten
7
    I2C1_WaitAck();
8
    I2C1_Start(); 
9
    I2C1_SendByte(0x41);  //Leseadresse
10
    I2C1_WaitAck();
11
    input = I2C1_ReceiveByte();
12
    I2C1_NoAck();       
13
    I2C1_Stop();
14

15
    new_input = (input) >> 4;  //Eingelesene Daten direkt wieder ausgeben
16
    I2C1_Start();
17
    I2C1_SendByte(0x40);       //Schreibadresse
18
    while(I2C1_WaitAck());
19
    I2C1_SendByte(new_input);
20
    I2C1_Stop();

Was übersehe ich?

lg
Angehängte Dateien:
#2604320
Lesenswert?

@  Patrick F. (breaker87)

>Ich kann Daten sowohl lesen, als auch schreiben, das Problem ist aber,
>dass beim Lesen die Ausgänge kurzzeitig alle auf low geschalten werden.

Ja logisch, das machst du doch selber!

>Hier mal der Codeausschnitt mit dem ich lese und schreibe (läuft zur
>zeit im main als endlosschleife ab (mit Delay, denn sonst klappern meine
>Relais):

>    //READ
>    I2C1_Start();
>    I2C1_SendByte(0x40);  //Schreibadresse
>    I2C1_WaitAck();
>    I2C1_SendByte(0xF0);  //Eingangspins HIGH sezten --> auch bei 0xFF
>                          //bleibt der Fehler erhalten

???
Warums schreibst du, wenn der Kommentar sagt lesen? Und dass hier IMMER 
deine Ausgänge LOW werden, sollte jeder sehen.
Wo ist das STOP?

>    I2C1_WaitAck();
>    I2C1_Start();
>    I2C1_SendByte(0x41);  //Leseadresse
>    I2C1_WaitAck();
>    input = I2C1_ReceiveByte();
>    I2C1_NoAck();
>    I2C1_Stop();

DAS ist das Lesen.

>    new_input = (input) >> 4;  //Eingelesene Daten direkt wieder ausgeben

Warum dann schieben? Lass es so wie es ist.

>    I2C1_Start();
>    I2C1_SendByte(0x40);       //Schreibadresse
>    while(I2C1_WaitAck());
>    I2C1_SendByte(new_input);
>    I2C1_Stop();

>Was übersehe ich?

Siehe oben. Man muss die Port P4-7 nur EINMAL mit 0xF beschreiben, die 
bleiben dann high, wenn man es richtig macht. Eher so.
1
my_i2c_write (uint8_t data) {
2
    
3
    I2C1_Start(); 
4
    I2C1_SendByte(0x40);  //Schreibadresse
5
    I2C1_WaitAck();
6
    I2C1_SendByte(0xF0 | data);  //P4-P7 Eingänge ->HIGH
7
    I2C1_Stop();
8
}
9

10
uint8_t my_i2c_read() {
11

12
    uint8_t input;
13

14
    I2C1_Start(); 
15
    I2C1_SendByte(0x41);  //Leseadresse
16
    I2C1_WaitAck();
17
    input = I2C1_ReceiveByte();
18
    I2C1_NoAck();       
19
    I2C1_Stop();
20
    return input;
21
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren