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