mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik EEPROM mit I2C schreiben/lesen


Autor: Maddin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte einen 24LC04P mit dem I2C beschreiben/lesen, nur irgendwie 
habe ich das ungute Gefühl ich mache etwas Grundlegendes falsch.

Hier bleibt in der 4ten Zeile hängen. Entfernt man diese bleibt er bei 
5ten Zeile stehen.
UCB0I2CSA =  0x50;    //Slave Adress
UCB0CTL1 |= UCTR + UCTXSTT;  //Transmitter Mode, send Start-Condition
while(!(IFG2 & UCB0TXIFG));  //Wait for empty TXBuffer
UCB0TXBUF = 0x01;    //Write into TXBuffer  
while(UCB0CTL1 & UCTXSTT);  //Wait for Ack from Slave
while(!(IFG2 & UCB0TXIFG));  //Wait for empty TXBuffer
UCB0TXBUF = 0xFF;
while(UCB0CTL1 & UCTXSTT);  //Wait for Ack from Slave

Heißt für mich also, der Slave sendet keinen ACK. Ich denke es liegt an 
der Slave-Adresse da ich mir auf Grund schlechter (meine Meinung) 
Dokumentation des Datenblattes über dessen Aufbau im Unklaren bin. Im 
Datenblatt des EEPROMs ist die angehängte Übersicht zu sehen und dort 
steht:
"The last bit, B0, is used by the master
device to  ... This bit is, in effect, the
Most Significant bit of the word address."
Heißt das jetzt ich muss die Slave adresse verkehrt herum im Controller 
(MSP) hinterlegen, damit dieses entsprechend andersherrum ausgesendet 
wird?

Angenommen für die x und B0 gelte jeweils low. Dann blieben folgende 
Varianten für die Slave Adresse die ich in den I2C TX Buffer des MSP 
schreibe:
01010000 = 50
00000101 = 5

Nix von beidem funktioniert jedoch. Adress Byte immer noch falsch oder 
liegts vielleicht an meiner Init?
UCB0CTL1 |= UCSWRST;            //hold USCI-Modul in Reset-Mode
UCB0CTL0 |= UCMST + UCMODE_3 + UCSYNC;    //USCI Modul in synchronous, Master-I2C-Mode
UCB0CTL1 |= UCSSEL_1;            //ACLK Source
UCB0BR0 = 144;
UCB0BR1 = 1;
P3SEL |= BIT1 + BIT2;      //secondary port function 
P4DIR |= BIT4;          
P4OUT &= ~BIT4;          //disable write protection
UCB0CTL1 &= ~UCSWRST;      //leave Reset-Mode
IE2 |= UCB0TXIE;

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>UCB0I2CSA =  0x50;    //Slave Adress

Die ist 0xA0.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Adresse ist A0/A2 fürs Schreiben der 1/2.Page bzw. A1/A3 fürs Lesen.

Die Reihenfolge ist:
- sende Start
- sende Adresse
- teste auf ACK
...


Peter

Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm dazu muss ich dann aber Wiederdum Datenblatt/Userguide slau133.pdf 
anführen.

Seite 17-31:

"In 7-bit slave addressing mode Bit 6 is the MSB, Bits 9-7 are ignored"

Demnach muss ich einen 7-Bit Wert ins Register schreiben, denn das R/W 
Bit im Controll-Byte wird ja vom Controller automatisch durch gesetzt 
indem TRANSMIT-Mode oder RECEIVE-Mode gewählt wird.

oder habe ich das was falsch verstanden. Wenn ja wäre ich über 
Aufklärung sehr dankbar.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Maddin schrieb:
> oder habe ich das was falsch verstanden.

Kann Dir keiner sagen, solange Du den Controller-Typ geheim hältst.


Peter

Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MSP430F2274

Beim Senden richte ich mich möglichst strikt nach Seite 17-15, des 
zugehörigen userguides slau144

Gruß Maddin

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Och menno, die Examples kenn ich doch. Hab jetzt nochmal genauso wie 
dort gemacht. Bringt nix.

Aber bevor ich gleich aufgebe. Die Slave-Adresse wird doch automatisch 
gesendet nach der StartCondition..? Das erste Bit das ich also in den 
TXBuffer schreibe wäre in meinem Fall die Speicheradresse für die Daten 
ds EEPROM...?

Gruß

Maddin

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Och menno, die Examples kenn ich doch. Hab jetzt nochmal genauso wie
>dort gemacht. Bringt nix.

Dann mach doch mal Pullups an SDA und SCL. Soll helfen hab ich
gehört.

Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und woher will der Herr wissen wo ich Pullups habe oder nich?

Werds morgen mal oszillen, ich denke das bringt mehr als das jetzt hier 
die willdesten Spekulationen starten.....

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Und woher will der Herr wissen wo ich Pullups habe oder nich?

Das ist eine sehr gute Frage;)

Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm. Mal abgesehen davon das TI Beispiele nicht nach Datenblattvorgabe 
aufgebaut sind, funtkionieren diese ebenfalls nicht.

SDA bleibt bei mir immer high und Clock immer Low. Mit 5k Pullups. Ich 
sag das sch*** Ding is kaputt, wenn jemand noch andere potentielle 
Fehlerquellen hat, immer her damit.

Gruß

Maddin

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Maddin schrieb:
> SDA bleibt bei mir immer high und Clock immer Low.
Immer? D.h. auch gleich nach dem booten, oder erst nach dem ersten 
Kommunikationsversuch?

I2C mit MSP430 siehe auch:
Beitrag "Re: I2C Ansteuerung von PCA9685 mit MSP430"

Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg S. schrieb:
> Immer? D.h. auch gleich nach dem booten, oder erst nach dem ersten
> Kommunikationsversuch?

Ja immer....

Danke für den Link, werd mich mal durcharbeiten.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.