www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI Frage MSP430


Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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_Int...

(erster Absatz)

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry hab einen SCA100T - D01 (is aber so gesehen (fast) gleich)

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian R. (supachris)
Datum:

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

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.