Forum: Mikrocontroller und Digitale Elektronik MSP430 mit ADXL345 kommunizieren lassen


von Roko S. (roc)


Lesenswert?

Hi! Mein Ziel ist es an den MSP430F5438A den ADXL345 anzuschliessen (IAR 
als Entwicklungsumgebung) und diese miteinander kommunizieren zu lassen. 
Ich habe die SPI Kommunikation geschrieben und mir herausgesucht welche 
Register und Bits im ADXL345 wie arbeiten sollen und welche 
Informationen ich mit dem MSP430 wieder erhaltten möchte, aber ich habe 
Probleme die Kommuniaktion geschickt zu verwirklichen. Da ich zuvor 
einige Errors hatte. Habe ich mich entschlossen den Code zunächst zu 
vereinachen und es so zu versuchen.
Unten ist der vereinfachte Code, der leider trotzdem noch einige Errors 
aufweist. Kann mir jemand Tipps und Ratschläge beim Aufbau der 
Kommuniaktion geben?

Vielen Dank im Vorraus. Bei Bedarf kann ich auch weitere Details zum 
auskommentierten lägeren Teil nachliefern.

Gruss


#include "msp430x54x.h"                 // einfügen der 
Mikroprozessordaten
#include "EHAL\hal_board.h"

void main (void) // Hauptprogramm starten
{



  halBoardInit();
  halBoardStartXT1();
  halBoardSetSystemClock(SYSCLK_1MHZ);
  halBoardOutputSystemClock();

 // init_uart();

  while (1)
  {

WDTCTL=WDTPW+WDTHOLD;    // ausschalten des Watchdogs
P10SEL=0x0F;        // PSEL, SPI Konfiguration auswählen, 0b00001111
UCB0CTL1|=UCSWRST;                      // **Put state machine in 
reset** !!!
P10DIR=0x0B  ; // SCLK ist 1 auf P10.3 ; MOSI ist 1 auf P10.1 ; SOMI ist 
0 auf P10.2, CS(low active) auf 1 am P10.0, 0b00001011
// P10REN= 0b00000100;// CS quer dauerhaft auf low gesetzt, um die 
Kommunikation zu bewerkstelligen, keine gute Idee
UCB3CTL0|=UCSYNC | UCMODE1 | UCMST | UCMSB;     // synchroner Modus, 4 
pin SPI einstellen , Master Modus eingestellt, MSB zuerst

UCB3CTL0|=UCSSEL_2;// Zeitgeber auswählen, SMCLK
// UCB3BR0 = 0x02; // Zeitgeber einstellen, UCA3BR0 und UCA3BR1, 
(UCAxBR0 + UCAxBR1 × 256)
// UCB3BR1 = 0;  // später ncoh einmal die Berechnung bedenken und mit 
den Angaben im Datenblatt vergleichen
__bis_SR_register(GIE);// globales Interrupt zulassen

// ?Polarität und Phase der seriellen clock definieren? nur Zusatz

UCB3CTL1&=~UCSWRST; // Initialisierung der State machine

UCB3IE|=UCRXIE;// Interrupt zulassen

spi_senden(0x31,0x4E);  //als Test soll die ID gesendet werden

unsigned char spi_empfang(unsigned char receive_byte);

  return;

  }

} // beenden des Hauptprogrammes





void spi_senden(unsigned char addr,unsigned char data)  //
  {
         P10OUT&=~BIT0;       // CSquer auf low setzen, um die 
Übertragung anzufangen, nicht P10REN benutzen!
         while(!(IFG3&UCB3TXIFG));   // nicht UCB3IFG benutzen, sondern 
IFG3
                                         // eventuell das Flag löschen

          UCB3TXBUF=addr;                      // Addresse,  0x31;
          delay(10);  // Wartezeit definieren, 10 Zyklen, eventuell zu 
kurz

      while(!(IFG3&UCA3TXIFG));             // nicht UCB3IFG benutzen, 
sondern IFG3
          UCB3TXBUF=data;  //  SELF_TEST | SPI | INT_INVERT | 0 | 
FULL_RES | Justify | Range       0b01001110,  0x4E;
          delay(10);  // Wartezeit definieren, 10 Zyklen, eventuell zu 
kurz
       P10OUT|=BIT0;            // CSquer auf high setzen, um die 
Übertragung zu beenden}

  };


    unsigned char spi_empfang(unsigned char receive_byte) // für x 
Empfangsmetode erstellen, UCA3RXBUF-Inhalt soll empfangenen Daten 
gefüllt werden
    {


    P10OUT&=~BIT0;                         // CSquer auf low setzen, um 
die Übertragung anzufangen


      //           Register 0x32-  DATAX0   least significant byte 
X-axes

      while(!(IFG3&UCA3RXIFG));             // nicht UCB3IFG benutzen, 
sondern IFG3


         receive_byte=UCB3RXBUF;                       // Addresse
          delay(10);  // Wartezeit definieren, 10 Zyklen, eventuell zu 
kurz


               IFG3=~UCB3IFG;  // Flag löschen
               P10OUT|=BIT0;                        // CSquer auf high 
setzen, um die Übertragung zu beenden}


    };

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das ist komplett unlesbar.

Den Code bitte richtig formatieren (Einrückungen beachten) und in die 
oberhalb des Eingabefeldes beschriebenen Formatierungszeichen für C-Code 
einschließen.

Und wenn der Code "einige Errors aufweist", dann könntest Du auch darauf 
hinweisen, was für Fehler das sein sollen. Ist der Compiler 
unglücklich, oder funktioniert die Kommunikation nicht so wie erwartet?

Das hier jedenfalls
1
unsigned char spi_empfang(unsigned char receive_byte);
2
3
  return;
hat am Ende von main() rein gar nichts verloren.

Hast Du schon mal ein C-Buch gesehen?

von go MSP (Gast)


Lesenswert?

Hallo Roko,

schau dir die Chronos an:

Die hat auch einen 3-Achsen Sensor und die Quellen sind verfügbar. Das 
erleichtert dir den Einstieg. Du kannst dir das Ganze dann aus dem 
Handgelenk schütteln. ;-)))

http://de.farnell.com/jsp/displayProduct.jsp?sku=1779769&CMP=e-2072-00001000&gross_price=true&mckv={ifsearch:s}{ifcontent:c}UGpAyJBA|pcrid|productlistings

von Roko S. (roc)


Angehängte Dateien:

Lesenswert?

Hi!

Ich habe den Code im Anhang, um mehr Übersicht zu erzeielen.
Versuche eine 4 wire SPI Verbindung aufzubauen, aber ich kann keine 
vernünftigen Daten empfangen. Zunächst möchte ich die ID vom Sensor 
zurücklesen und dann später nach gewünschter Konfiguration die x-,y-, 
und z-Achse zurücklesen.

Im zugehörigen UCB3RXBUF erscheint nur 0x00 statt der geforderten 0xE5.
Der Wert im zugehörigen TXBUF passt mit 0x80. Was mache ich falsch?

Hat jemand vielleicht einen einfachen Beispielcode für eine 
Empfangsmethode?

Danke.

Gruss

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Weder sendest Du irgendwo etwas, noch machst Du irgendetwas mit den 
aktivierten Interrupts.

Hast Du Dir schon mal angesehen, was eine SPI-Schnittstelle überhaupt 
ist?

Wie kann auf einer SPI-Schnittstelle etwas empfangen werden, ohne daß 
etwas gesendet wird?

von Roko S. (roc)


Angehängte Dateien:

Lesenswert?

Hi!

Es tut mir Leid. Habe den falschen Stand gepostet gehabt und die 
Kommunikation war im letzten Beitrag natürlich nicht möglich. Mein 
Fehler.Entschuldigung. Ich war zu schnell.

Ich habe zwei Ausschnitte angehängt. Der Code liefert nur bei jedem
zweiten Durchlauf die richtige ID von 0xE5. Habe dies mit einem 
Breakpoint getestet. Siehe  die beiden Screenshots im Anhang. Warum ist 
das so? Ich weiss es nicht.

Danke

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.