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


von reflection (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Christian R. (supachris)


Lesenswert?

Kann man z.B. mit dem kleinen UP abpollen:
1
void SPI1WaitForComplete(void)
2
{
3
  while (!(IFG2 & UTXIFG1));                // USART1 TX buffer ready?
4
  do
5
  {
6
    IFG2 &= ~URXIFG1;
7
  }
8
  while (URXIFG1 & IFG2); 
9
}

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.

von reflection (Gast)


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"

von Christian R. (supachris)


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.

von reflection (Gast)


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

von reflection (Gast)


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"

von Christian R. (supachris)


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.

von reflection (Gast)


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

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.