www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 SPI 16Bit Wert übertragen


Autor: reflection (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haloi zusammen

Habe wieder mal ein Prob (Siehe auch Thread Probleme mit Code für Gyro 
ADIS16250)

Dieser Sensor wird via SPI ausgelesen. So, nun soll man immer 16Bit 
Pakete senden, der TXBuf beim MSP430 hat ja aber nur deren 8 :o( Wisst 
ihr ob das trotzdem geht, oder ob mein Problem das ich keine Daten 
auslesen kann, von dem stammen könnte?

Wenn ich 16Bit übertragen muss mache ich das immer so:

TXBUF0 = 0x00
Dummy = RXBUF0  // Daten löschen um Buffer frei zu machen
TXBUF0 = 0xFF

Somit hätte ich ja auch 16Bit gesendet 0000 0000 1111 1111

Bin kurz vor dem Verzweifeln, habe gestern den ganzen Tag probiert dem 
Ding das sprechen bei zu bringen, aber er spricht nur russisch mit mir 
:o)

Ach ja, könnte mein Prob vielleicht auch an den Einstellungen des SPI 
beim MSP liegen? (Quellcode siehe Thread Probleme mit Code für Gyro 
ADIS16250)

Gruss und schon mal danke für die Hilfe!

reflection

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

Bewertung
0 lesenswert
nicht lesenswert
Du solltest auch abwarten, daß das in TXBUF0 geschriebene Byte auch 
fertig übertragen wurde, bevor Du erneut TXBUF0 beschreibst.
Je nach SPI-Takt dauert das ja eine gewisse Zeit.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann man z.B. mit dem kleinen UP abpollen:
void SPI1WaitForComplete(void)
{
  while (!(IFG2 & UTXIFG1));                // USART1 TX buffer ready?
  do
  {
    IFG2 &= ~URXIFG1;
  }
  while (URXIFG1 & IFG2); 
}

Ist aus einem Code-Beispiel von TI. Für die USART0 musst du natürlich 
die Register und Bits anpassen.

Der Prozessor ist ja mindestens Faktor 2 schneller als der SPI Takt, da 
dauerts halt bissl, bis das Byte raus ist.

Autor: reflection (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber Grundsätzlich würde das so funktionieren? Also kann ich einfach 
2x8Bit übertragen anstatt 1x16? Versteht das Gyro das dann als einzelnen 
Befehl oder habe ich zwischen den zwei Paketen zu je 8Bit eine "Pause"?

Gruss reflection

PS: Sorry, habe ich vergessen, ich mach es im Moment so:

TXBUF0 = address;                   // Sende Adresse
  while ((IFG1 & UTXIFG0) == 0);    // USART0 TX buffer ready?
  while ((IFG1 & URXIFG0) == 0);    // USART0 RX buffer ready?

  char dummy = RXBUF0;              // RXBUF0 auslesen (somit: löschen
  TXBUF0 = 0x00;                    // Sende Dummy Byte um SCLK zu
generieren
  while ((IFG1 & UTXIFG0) == 0);    // USART0 TX buffer ready?
  while ((IFG1 & URXIFG0) == 0);    // USART0 RX buffer ready?

  dummy = RXBUF0;

Hier noch der Link zu meinem eigentlichen Prob:

Beitrag "Probleme mit Code für Gyro ADIS16250"

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das sollte dem Gyro egal sein, du musst ja eh irgendwie ein 
Chip-Select bedienen, das darfst du natürlich zwischen den Einzelbytes 
nicht wegnehmen.

Das while ((IFG1 & URXIFG0) == 0); reicht übrigens nicht, dann 
verhaspelt sich die State-Machine irgendwie. Liegt wohl den doppelt 
gepuffertem Senderegister.

Autor: reflection (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo supachris

Dann würdest Du es so machen wenn ich das richtig verstehe, oder?

Gruss reflection


TXBUF0 = address;                 // Sende Adresse
SPI0WaitForComplete();
char dummy = RXBUF0;              // RXBUF0 auslesen (somit: löschen
TXBUF0 = 0x00;                    // Sende Dummy Byte um SCLK zu
SPI0WaitForComplete();
dummy = RXBUF0;

void SPI0WaitForComplete(void)
{
  while (!(IFG1 & UTXIFG0));      // USART1 TX buffer ready?
  do
  {
    IFG1 &= ~URXIFG0;
  }
  while (URXIFG0 & IFG1);
}

Autor: reflection (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, hast Du vielleicht mal meinen anderen Thread angeschaut? 
Könntest Du mir sagen ob ich den SPI richtig Initialisiert habe für das 
Gyro? (Datenblatt Seite 11) Würde mir schon enorm weiterhelfen um das 
Problem einzugrenzen. WEiss nicht genau ob das mit dem CKPL so stimmt, 
oder ob ich noch das andere setzen muss CKPH.

Gruss reflection

Beitrag "Probleme mit Code für Gyro ADIS16250"

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Och nö, soviel Zeit hab ich nicht. Dummy Daten musst du nicht auslesen, 
wenn du den Rückgabewert nicht brauchst.
Schau halt mal in den User Guide, dann vergleich die SPI-Diagramme mit 
dem im Datenblatt und such dir die Einstellungen für CKPOL und CKPH 
raus.

Autor: reflection (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kann ich verstehen. Habe ich auch gemacht, aber bin mir halt nicht 
zu 100% sicher und dachte es wäre nicht schlecht wenn vielleicht mal 
jemand anderes das anschauen könnte weil ich es erst das zweite Mal 
mache und mir halt nicht ganz so sicher bin. Naja, werde ich halt mal 
alle Zustände durchprobieren, vielleicht finde ich so raus ob ich die 
korrekte Einstellung habe oder nicht. Es ist halt schwer als Anfänger 
einen Fehler einzugrenzen wenn man bei fast allem nicht sicher ist ob 
man es richtig macht. Ansonsten werde ich halt nochmal im Web schauen, 
vielleicht gibts ja dort ein Beispiel...

Gruss

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.