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


von Maddin (Gast)


Angehängte Dateien:

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.
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;

von holger (Gast)


Lesenswert?

>UCB0I2CSA =  0x50;    //Slave Adress

Die ist 0xA0.

von Peter D. (peda)


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

von Maddin (Gast)


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.

von Peter D. (peda)


Lesenswert?

Maddin schrieb:
> oder habe ich das was falsch verstanden.

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


Peter

von Maddin (Gast)


Lesenswert?

MSP430F2274

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

Gruß Maddin

von holger (Gast)


Lesenswert?


von Maddin (Gast)


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

von holger (Gast)


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.

von Maddin (Gast)


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.....

von holger (Gast)


Lesenswert?

>Und woher will der Herr wissen wo ich Pullups habe oder nich?

Das ist eine sehr gute Frage;)

von Maddin (Gast)


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

von Jörg S. (joerg-s)


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"

von Maddin (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.