Forum: Mikrocontroller und Digitale Elektronik SPI Frage MSP430


von Christoph (Gast)


Lesenswert?

hallo,
hab da mal eine frage:
ich verwende den msp430f169, hab (so glaube ich)
den µp richtig initialisiert, und jetzt möchte ich
daten auf mosi schreiben.
meine frage: taktet der µp automatisch, sobald ich meine daten
ins register U0TXBUF geschrieben hat (hab die CS leitung zuerst auf LOW 
gesetzt) diese raus, und schaltet dann den takt wieder ab? oder kann ich 
das steuern wie lang der takt zB. noch nachläuft?
besten dank, gruß christoph

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> taktet der µp automatisch, sobald ich meine daten
> ins register U0TXBUF geschrieben hat (hab die CS leitung zuerst auf LOW
> gesetzt) diese raus, und schaltet dann den takt wieder ab? oder kann ich
> das steuern wie lang der takt zB. noch nachläuft?

Es sollten exakt soviele Taktimpulse ausgegeben werden, wie Datenbits 
übertragen werden.

Ein "Nachlaufen" darf es nicht geben.

von Christoph (Gast)


Lesenswert?

danke!
heisst das dann auch, dass wenn man z.B von einem Sensor eine
Antwort über MISO bekommt, der Takt dann automatisch vom
µP wieder "eingeschaltet" wird?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nein, der Takt wird immer vom Master erzeugt, hier also dem MSP430. Das 
Einlesen von Daten geschieht simultan mit dem Schreiben von Daten.

Lies Dir mal die Beschreibung des Protokollablaufes hier durch:
http://de.wikipedia.org/wiki/Serial_Peripheral_Interface#Protokollablauf_und_Einstellm.C3.B6glichkeiten

(erster Absatz)

von Christian R. (supachris)


Lesenswert?

Eine Antwort liest man ein, indem man nochmal ein Dummy-Byte raus 
schreibt, Schreiben und lesen erfolgt immer gleichzeitig. Um welchen SPI 
Slave Baustein handelt es sich denn konkret?

von Christoph (Gast)


Lesenswert?

hab ich mir jetzt alles durchgelesen, müsste eigentlich so hinhauen
ich schick zuerst ein "Command- Byte"
und dann ein von dir angesprochenes "Dummy- Byte" bei mir
FF hex, da es sich nicht mit einem Command überschneidet
(Ok der Sensor schickt 11 Bit aber ich will nur mal schauen ob
er überhaupt etwas schickt)

ahm is der Sensor SCA100T - D02

von Christoph (Gast)


Lesenswert?

sorry hab einen SCA100T - D01 (is aber so gesehen (fast) gleich)

von Christian R. (supachris)


Lesenswert?

Ja, also die 8 Bit Temperatur auslesen sollte so funktionieren. Command 
hinschicken, waren bis rausgeschoben ist (auf RX-Int-Flag warten) und 
dann nochmal Dummy-Byte raus, wieder auf das RX-Flag warten und dann 
steht in URXBUF0 dein Temperatur-Wert.

Bei dem 11-Bit Wert wirds schwieriger. Wenn der Sensor nicht allzu blöd 
ist, kannst du ihm 3 Bytes schicken, und die restlichen 5 Bist ignoriert 
er, dann bekommst du den 11 Bit Wert in 2 Bytes zurück. Mit Pech klappts 
so nicht und du musst die SPI in Software nachbilden.

von Christoph (Gast)


Lesenswert?

hab das mal versucht zu programmieren
müsste also so aussehen, hier les ich die Temperatur ständig
wieder ein....


 P3OUT &= ~BIT0; //CSB für Sensor
 U0TXBUF = 0x08; //Commando für Temp lesen RWTR
 while (URXIFG0 != 1)
 {}; //WARTEN

while(1) //somit liest er ständig die Temperatur
{
  U0TXBUF = 0xAF; //DummyByte
  while(URXIFG0 != 1)
  {};//WARTEN
}

oder muss ich immer zunächst ein Command schreiben
um dann die Daten zu erhalten??

von Christian R. (supachris)


Lesenswert?

1. musst du wohl immer das Kommando wieder schreiben, und nach dem 
Einlesen der Temperatur das CS wieder High setzen.

2. while (URXIFG0 != 1) ist auch Quatsch, du musst schon das IFG1 (denke 
ich, dass das da drin war) Register abfragen, ob das URXIFG0 Bit gesetzt 
ist.

von Christoph (Gast)


Lesenswert?

so müssts doch funktionieren oder, den Senor anzusprechen
um zumindest die Temp. auszulesen?

 while (1)
  {
    P3OUT &= ~BIT7; //enable Sensor

    TXBUF0 = 0x08;                   //Kommando Read Write Temp
    while (!(IFG1 & UTXIFG0));       //USART0-> TX frei?
    while (!(IFG1 & URXIFG0));       //Daten empfangen?
    rec_sensor = RXBUF0;

    TXBUF0 = 0x00;                   //Dummy-Byte senden
    while (!(IFG1 & UTXIFG0));       //USART0--> TX frei?
    while (!(IFG1 & URXIFG0));       //Daten empfangen?
    rec_sensor = RXBUF0;

    P3OUT |= BIT7;
  };

irgendwie bekomm ich da keine "richtige" Antwort vom Sensor
vll hat wer eine Idee?
besten Dank

von Christian R. (supachris)


Lesenswert?

Sollte passen....stimmen denn die SPI-Einstellungen? Also SPI Mode 0, 1, 
2 oder 3?

von Christoph (Gast)


Lesenswert?

ME1 |= USPIE0;                     // Enable USART0 SPI
  UCTL0 |= CHAR + SYNC + MM;          // 8-bit SPI Master
  UTCTL0 |=SSEL0+STC;//               // SMCLK, 3-pin mode
  UBR00 = 0x02;
  UBR10 = 0x00;
  UMCTL0 = 0x00;

und dann halt noch Port3 Select, Direction und POUT....

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.