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
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.
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.
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"
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.
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); }
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"
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.