MSP430 und PCF8574 Problem

Gast #866956
Lesenswert?
• ▲
▼
Hallo zusammen,

ich versuche gerade an meinem MSP einen PCF8574 ans Laufen zu bekommen. 
Später soll darüber mal ein Display gesteuert werden.

Ich habe hier im Forum schon einige Beiträge dazu gefunden auch schon 
einen, bei dem anscheind jemand das gleiche Problem hatte wie ich, aber 
leider habe ich  noch keine Lösung gefunden.

Ich nutze die I2C-Bibliothek von mathar.com Die funktioniert auch prima. 
Ich steuere damit schon erfolgreich einen Temperatursensor an, doch den 
PCF8574 bekomme ich irgendwie nicht zum laufen.

Hier einmal die Funktionsaufrufe zu Ansprechen des Bausteins:
1
int main(void)
2
{
3
  WDTCTL = WDTPW + WDTHOLD;// Watchdog Timer stoppen 
4
  
5
  InitPorts();             // Ports initialisieren
6
  
7
  I2C_start();            // START senden
8
  I2C_init(0x40, 'w');
9
  while (!(I2C_gotACK()));
10
  I2C_sendbyte(0x40);
11
  while (!(I2C_gotACK()));
12
  I2C_stop();             // STOP senden  
13

14
}/* int main(void) */

Nun meine Frage, ob das erst einmal die richtige Reihenfolge ist. Das 
habe ich so aus den Angaben aus dem Datenblatt verstanden.

Das Problem scheint nun zu sein, dass kein Ack nach dem Senden der 
Adresse kommt. Das Programm bleibt beim ersten while (!(I2C_gotACK())); 
hängen. Dabei habe ich festgestellt, dass die Clock weiterläuft und SDA 
die ganze Zeit auf HIGH ist.

Hat jemand eine Idee, woran das liegen könnte?

Bin für jeden Tip dankbar. Ich habe auch leider keinen Logik-Analyser 
oder so etwas, nur eine Oszi.

Vielen Dank.

Gruß
Florian
Gast #867159
Lesenswert?
• ▲
▼
Hallo,

SDA und SCL sind im ruhezustand high? JA

Es passiert tatsächlich was auf der SDA Leitung? JA, aber was genau kann 
ich
nicht sagen, habe kein Speicheroszi.

Das erste ACK von der Adresse kommt? NEIN, genau in der While-Schleife 
bleibt er hängen.

Passiert was wenn du lesen willst?  Wenn ich lesen will, passiert das 
gleiche. Auf SDA und SCL passiert was, die Clock läuft, aber es kommt 
kein Ack.

Was macht die Funktion I2C_init()? Ich habe die I2C Funktionen einmal 
angehägt, darin ist dan auch die I2C_init() enthalten.
1
void I2C_init(char address, char r_w) // I2C-device mit Adresse "address" lesend 
2
{                                     // oder schreibend initialisieren
3
    char i;
4
    SDA_write();                      // Sicherheitshalber erst mal SDA und SCL 
5
    SCL_write();                      // auf wWrite setzen
6
    SCL_low();                        // Sicherheitshalber erst mal SCL auf LOW 
7
                                      // setzen
8
    for (i=7; i>0; i--)               // 7-Bit-I2C-Adresse senden
9
    {
10
        if (address&(1<<(i-1))) 
11
            SDA_high(); 
12
        else 
13
            SDA_low();
14
        SCL_clock();
15
    }/* for (i=7; i>0; i--) */
16
    if (r_w=='r') 
17
        SDA_high(); 
18
    else 
19
        SDA_low();
20
    SCL_clock();                         // 1 oder 0 senden (read oder write)
21
}/* void I2C_init(char address, char r_w) */

Vieleicht ist es ja auch ein PCF8574*A*. Nein, ist kein A


Gruß
Florian
Angehängte Dateien:
Gast #867488
Lesenswert?
• ▲
▼
> Mal ins Errata-Sheet geschaut? Einige MSP430 Revisionen hatten glaube
> ein Problem mit dem I2C
Aber nicht wen man I²C in Software macht :)

> // 7-Bit-I2C-Adresse senden
Kann es sein das du anstatt 0x40 eher 0x20 senden musst? Das R/W bit 
wird ja anscheinend separat gesetzt.
Gast #868693
Lesenswert?
• ▲
▼
Hallo,

genau das wars, also das mit der Adresse. Ich muss 0x20 anstatt 0x40 
senden, bzw an die Funktion I2c_Init übergeben, da das R/W bit ja 
separat gesetzt wird...

Vielen Dank für die Hilfe...

Ein kleiner Denkfehler mit großer Wirkung....

Vielen Dank.

Gruß
Florian

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.