MSP430 SPI 16Bit Wert übertragen

Gast #687897
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
#687920
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.
Gast #687952
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"
#687987
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.
Gast #688042
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);
}
Gast #688056
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"
Gast #688117
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren