EEPROM mit I2C schreiben/lesen

Gast #1838164
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.
1
UCB0I2CSA =  0x50;    //Slave Adress
2
UCB0CTL1 |= UCTR + UCTXSTT;  //Transmitter Mode, send Start-Condition
3
while(!(IFG2 & UCB0TXIFG));  //Wait for empty TXBuffer
4
UCB0TXBUF = 0x01;    //Write into TXBuffer  
5
while(UCB0CTL1 & UCTXSTT);  //Wait for Ack from Slave
6
while(!(IFG2 & UCB0TXIFG));  //Wait for empty TXBuffer
7
UCB0TXBUF = 0xFF;
8
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?
1
UCB0CTL1 |= UCSWRST;            //hold USCI-Modul in Reset-Mode
2
UCB0CTL0 |= UCMST + UCMODE_3 + UCSYNC;    //USCI Modul in synchronous, Master-I2C-Mode
3
UCB0CTL1 |= UCSSEL_1;            //ACLK Source
4
UCB0BR0 = 144;
5
UCB0BR1 = 1;
6
P3SEL |= BIT1 + BIT2;      //secondary port function 
7
P4DIR |= BIT4;          
8
P4OUT &= ~BIT4;          //disable write protection
9
UCB0CTL1 &= ~UCSWRST;      //leave Reset-Mode
10
IE2 |= UCB0TXIE;
Angehängte Dateien:
Gast
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.
Gast
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
Gast
>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.
Gast
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.....
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.