EEPROM mit I2C schreiben/lesen

Gast #1838164
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;
Angehängte Dateien:
Gast #1838186
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.
Gast #1838230
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
Gast #1841824
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren