Forum: Mikrocontroller und Digitale Elektronik I2C bei MSP430F2122


von Michael S. (mike1992)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche schon seit einer Weile mit dem µController MSP430F2122 per 
I2C ein Digtalpotentiometer (MAX5477EUD) anzusprechen, jedoch bekomme 
ich kein Signal an den Ausgängen.
Um das Potentiometer anzusprechen muss ich zuerst ein Command-Byte 
senden, wohin ich schreiben möchte, und dannach ein Daten-Byte, welches 
mir den Widerstand einstellt. Jedoch genau hier scheitere ich, da ich 
nicht weiß ob ich die nacheinander etc. senden muss.
Zum kompilieren verwende ich die MSP430-GCC tools. Im Anhang mein 
C-File. Vielleicht hat ja jemand eine Ahnung...

Danke im Voraus
mfg

von Michael S. (mike1992)


Lesenswert?

Hat wirklich noch niemand etwas mit dem MSP430F2122 und I2C gemacht?
Ich wäre für jeden Tipp dankbar...

mfg

von Patrick (helipaddi)


Lesenswert?

Hm... Da fehlt irgendwie noch was... Ich kann dir gleich mal meinen Soft 
I2C Code schicken, welcher bei mir zum auslesen eines Gyros gut 
funktioniert. Vielleicht kannst du damit mal testen.

von Michael S. (mike1992)


Lesenswert?

Es wäre sehr nett wenn du mir den Code schicken würdest.
danke

von Jörg S. (joerg-s)


Lesenswert?

Michael S. schrieb:
> Jedoch genau hier scheitere ich, da ich
> nicht weiß ob ich die nacheinander etc. senden muss.
Alles direkt hintereinander in einem Aufruf.

von Michael S. (mike1992)


Lesenswert?

Jörg S. schrieb:
> Alles direkt hintereinander in einem Aufruf.

also quasi so?:

UCB0TXBUF = TXData1;
UCB0TXBUF = TXData2;

Und die Adresse vom Slave wird immer automatisch gesendet oder?

von Michael S. (mike1992)


Lesenswert?

Also ich glaube jetzt durch Messungen mit dem Oszilloskop darauf 
gekommen zu sein, dass mein Programm nur die Slave-Adresse sendet und 
den Rest ignoriert....
1
char data = 0xff;              //data step 170
2
  char command = 0xff;            //nvreg of both wiper
3
    
4
  while(1)
5
  {
6
  
7
  while(UCB0STAT & UCBBUSY);          //wait for bus to be free
8
    
9
  UCB0I2CSA = 0x28;              //slave address MAX5477EUD = 0101000
10
  UCB0CTL1 &= ~UCSWRST;                       // Clear SW reset, resume operation
11
12
  UCB0CTL1 |= UCTR + UCTXSTT;         //I2C TX, Send Start
13
  
14
  UCB0TXBUF = data;              //wird nicht gesendet ?
15
  UCB0TXBUF = command;
16
  
17
  UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
18
  IFG2 &= ~UCB0TXIFG;                     // Clear USCI_B0 TX int flag
19
  }

Aber warum ist die Frage^^?

von Jörg S. (joerg-s)


Lesenswert?

>UCB0TXBUF = data;              //wird nicht gesendet ?
>UCB0TXBUF = command;
Kann so nicht klappen. Du must immer warten ber der MSP wieder bereit 
ist neue Daten anzunehmen.

von Michael S. (mike1992)


Lesenswert?

> Kann so nicht klappen. Du must immer warten ber der MSP wieder bereit
> ist neue Daten anzunehmen

Würde dieser Befehl davor und dazwischen schon ausreichen oder gibt es 
noch Register die ich nicht beachte?

>while(UCB0STAT & UCBBUSY);

PS: Danke für deine Hilfe :D

von Michael S. (mike1992)


Angehängte Dateien:

Lesenswert?

So jetz hab ich es mit Interrupts gelöst und es funktioniert so wie es 
soll.
Falls jemand Mal das selbe Problem hat häng ich den Code an. Danke an 
alle für die hilfreichen Posts.

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.