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