Datum: 14.05.2008 15:45
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:
int main(void) { WDTCTL = WDTPW + WDTHOLD;// Watchdog Timer stoppen InitPorts(); // Ports initialisieren I2C_start(); // START senden I2C_init(0x40, 'w'); while (!(I2C_gotACK())); I2C_sendbyte(0x40); while (!(I2C_gotACK())); I2C_stop(); // STOP senden }/* 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
Datum: 14.05.2008 18:59
SDA und SCL sind im ruhezustand high? A0-A2 vom PCF liegen auf GND? Es passiert tatsächlich was auf der SDA Leitung? Das erste ACK von der Adresse kommt? Passiert was wenn du lesen willst? Was macht die Funktion I2C_init()?
Datum: 14.05.2008 19:02
Vieleicht ist es ja auch ein PCF8574*A*. Der hat die Basisadresse 0x70.
Datum: 14.05.2008 20:07
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.
void I2C_init(char address, char r_w) // I2C-device mit Adresse "address" lesend { // oder schreibend initialisieren char i; SDA_write(); // Sicherheitshalber erst mal SDA und SCL SCL_write(); // auf wWrite setzen SCL_low(); // Sicherheitshalber erst mal SCL auf LOW // setzen for (i=7; i>0; i--) // 7-Bit-I2C-Adresse senden { if (address&(1<<(i-1))) SDA_high(); else SDA_low(); SCL_clock(); }/* for (i=7; i>0; i--) */ if (r_w=='r') SDA_high(); else SDA_low(); SCL_clock(); // 1 oder 0 senden (read oder write) }/* void I2C_init(char address, char r_w) */ |
Vieleicht ist es ja auch ein PCF8574*A*. Nein, ist kein A Gruß Florian
Datum: 14.05.2008 20:08
Noch was vergessen, A0-A2 vom PCF liegen auf GND? JA Gruß Florian
Datum: 14.05.2008 20:28
Pullups an SDA und SCL sind auch angeschlossen ?
Datum: 14.05.2008 21:34
Ja, sind 10kOhm Pullups. Die Schaltung habe ich aus einem Artikel zum PCF hier auf dieser Seite.
Datum: 15.05.2008 07:31
Mal ins Errata-Sheet geschaut? Einige MSP430 Revisionen hatten glaube ein Problem mit dem I2C
Datum: 15.05.2008 09:07
> 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.
Datum: 16.05.2008 11:35
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
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel


