Hallo, ich befasse mich gerade neu mit der MSP430 Plattform, nachdem ich bereits einige Erfahrung mit ATmegas sammeln konnte. Bisher hatte ich ein myAVR Board und ein STK500 in Nutzung, nun habe ich mir für den MSP430 das TI Board gekauft: http://focus.ti.com/docs/toolsw/folders/print/msp-exp430fg4618.html Ich habe dazu nun einige Anfängerfragen, da es sich doch etwas von einem Board wie dem myAVR unterscheidet. Zur Beantwortung braucht es vermutlich jemanden der oben genanntes Board selbst besitzt oder schon mal benutzt hat. a) Das Board wird ja über den MSP-FET430UIF via USB mit Strom versorgt. Der 4618 läuft normalerweise mit 3,3V soweit ich weiß. Kann ich denn an dem Board auch irgendwie die 3.3V direkt oder gar die 5V von USB abgreifen um weitere Bauteile wie Sensoren o.ä. mit Strom zu versorgen? Soweit ich weiß, soll man ja nach Möglichkeit nicht den µC als Stromquelle nutzen, da der schnell überlastet sein kann? Gibt es denn auf dem Board auch eine Möglichkeit entsprechend GND anzuschließen?? Entweder für die entsprechende externe Komponente oder z.B. für ein Oszi? Das myAVR Board oder auch das STK500 hat ja extra GND Pins. Hier habe ich im Schaltplan keine expliziten PINs gefunden... Hmm, da gibt es ja noch diese "Breadboard area", aber die Löcher sind weiter als bei einem richtigen Breadboard, d.h. Jumperwires etc. haben da Spiel, dass kann ja eigentlich auch nicht der Sinn sein? b) Mit etwas Mühe(tm) ist es mit gelungen, den on-board UART anzusprechen und Meldungen über die serielle Schnittstelle auszugeben (über die PINs 2.4 und 2.5). Dies möchte ich beibehalten um eine einfache Möglichkeit zu haben, zu debuggen (zusätzlich zum FET-Debugger). Aktuell möchte ich nun einen ADXL345-Sensor über SPI ansprechen, da das mit den AVR-Board nicht so recht funktionieren wollte und ich möchte sehen, ob es an meiner 5V->3.3V Wandlerschaltung lag oder ob der Sensor vlt. wirklich nen Hau hat (scheint ein wenig "picky" zu sein, was man so liest) Ich habe nun also im Schaltplan nachgesehen, welche PINs am 4618er für SPI vorgesehen sind und bin aber immer noch verwirrt: * Seite 14 im Manual: Header H1, SPI Configuration: 1-2 SDI-UCB0SIMON, 3-4 SDO-UCB0SOMI, 5-6 P1.4-P3.0 (CS), 7-8 SCLK-UCB0CLK, "no communication possible via SPI". An jenem besagten Header sind bei mir 1-2 und 3-4 gebrückt. Geht jetzt SPI oder nicht? Für SPI bräuchte ich aber doch auch noch ein CLK Signal? Und damit müsste ja auch 7-8 gebrückt werden, oder? Den Sinn von 5-6 sehe ich nicht, denn den jeweiligen Sensor könnte ich doch im Prinzip mit einem beliebigen Pin selektieren, den ich auf Low schalte? Laut Datenblatt Seite 15 scheint sich dieser Header aber ja ohnehin nur auf den 2013 Chip zu beziehen der auch noch on board ist und gar nicht auf den 4618er?? Verstehe ich das richtig? * Wo schließe ich denn nun meine vier Kabel für CLK, MOSI, MISO und SS\ an? Muß ja wohl an den Header PINs passieren. Ah OK, an H6 gibt es UCA0SOMI (3), UCA0SIMO (2) und UCA0CLK (4). Das wäre ja eigentlich alles was ich brauche. Hmm, da fällt mir auf: Meine serielle Schnittstelle, die ich zum Debuggen nutze hängt an P2.4/P2.4 UCA0TXD/UCA0RXD, also auch UCA0 - heißt dass nun, ich kann gar nicht parallel SPI und UART nutzen?? Oder kann der UCA0-Baustein zeitgleich SPI und UART? * Wenn ich das richtig sehe, muß ich also die Pins P7.3-P7.1 entsprechend konfigurieren, da dort UCA0CLK/... nach außen geführt wird. Allerdings sehe ich bei P3.1-P3.3 auch UCB(!)0SOMI/SIMO/CLK. Dafür finde ich aber keine Header-PINs. Heißt das dann, dass ich diese Pins gar nicht wirklich für diesen Zweck nutzen kann?? Ich kann ja nur die Pins einsetzen, an denen ich auch wirklich was anschließen kann? * Dann sehe ich auch noch P4.3-4.5, diesmal UCLK1, SOMI1, SIMO1. Auch hier scheint es keinen "externen Zugang" zu geben? Was mache ich damit? * Oder ist es so, dass ich immer nur grundsätzlich die Bezeichnung ausserhalb der Chipfläche auf dem Schaltplan betrachten muß, weil die die entsprechende Verschaltung angibt und die Beschreibung "innerhalb" des Chips (z.B. P3.1/UCB0SIMO/UCB0SDA) für dieses Board einfach nicht relevant ist? Vielen Dank für die "Starthilfe" Markus
Was die Stromversorgung angeht: Das Board muss nicht per USB versorgt werden, sondern sieht auch die Versorgung mit einem Netzteil vor. Wenn Du eigene Hardware daran betreiben willst, solltest Du diese Option auch nutzen. Sieh Dir mal Seite 6 in slau213a.pdf an. Markus D. schrieb: > Hmm, da gibt es ja noch diese "Breadboard area", aber die Löcher sind > weiter als bei einem richtigen Breadboard, d.h. Jumperwires etc. haben > da Spiel, dass kann ja eigentlich auch nicht der Sinn sein? Das sind Lötaugen, keine Steckkontakte. Im Englischen werden auch Lochrasterplatinen als "breadboard" bezeichnet, nicht nur diese Plastikdinger, in die man bedrahtete Bauteile hineinstecken kann. Die restlichen Fragen sollten durch näheres Betrachten des Schaltplanes in slau213a.pdf und des User's Guide des 'F4618 zu klären sein. Das Board sieht eine bestimmte Beschaltung vor, wie z.B. die Nutzung des zweiten MSP430, des 'F2013, der über eine I2C-Schnittstelle mit dem 'F4618 verbunden wird. Das muss man aber nicht nutzen; wenn man die Jumper auf H1 weglässt, sind die korrespondierenden Pins des 'F4618 nicht mehr mit dem anderen Kram verbunden. Wenn Du SPI nutzen willst, solltest Du Dir ansehen, welche Schnittstellenperipheriemodule der 'F4618 einsetzt (TI hat in seinen verschiedenen Mitgliedern der MSP430-Reihe verschiedene Varianten im Einsatz), und dann solltest Du ansehen, wieviele davon im Controller vorhanden sind. Die seriellen Schnittstellen sind oft so aufgebaut, daß ein Peripheriemodul nur alternativ als UART oder SPI-Interface genutzt werden kann, da dieselben Pins dafür verwendet werden. Üblicherweise gibt es aber mehrere dieser Funktionsblöcke, so daß Du da schon was aussuchen können solltest. Ob das Board jetzt der Weisheit letzter Schrei ist, das steht auf einem ganz anderen Blatt - TI liefert gerne Boards, die darauf aus sind, ein ganz bestimmtes "feature set" zu demonstrieren, und die sich weniger als allgemeine Test- und Bastelplatinen eignen. So etwas liefert dann z.B. die Firma Olimex.
Rufus Τ. Firefly schrieb: > Was die Stromversorgung angeht: Das Board muss nicht per USB versorgt > werden, sondern sieht auch die Versorgung mit einem Netzteil vor. Wenn > Du eigene Hardware daran betreiben willst, solltest Du diese Option auch > nutzen. > > Sieh Dir mal Seite 6 in slau213a.pdf an. > Das heißt ich muß hier VCC und GND auch mit einem entsprechenden Jumperwire direkt auf die PINs zuführen? Eine andere Buchse für ne "Wandwarze" gibt es ja offenbar nicht. Dann habe ich aber dann trotzdem immer noch keinen PIN an dem ich externe Sensoren/Bauteile direkt von der Stromversorgung speisen kann, sondern nur über PINs des µC, oder verstehe ich das falsch? Was ist denn die maximale Spannung die ich anlegen darf? 3.3V? > > Markus D. schrieb: >> Hmm, da gibt es ja noch diese "Breadboard area", aber die Löcher sind >> weiter als bei einem richtigen Breadboard, d.h. Jumperwires etc. haben >> da Spiel, dass kann ja eigentlich auch nicht der Sinn sein? > > Das sind Lötaugen, keine Steckkontakte. Im Englischen werden auch > Lochrasterplatinen als "breadboard" bezeichnet, nicht nur diese > Plastikdinger, in die man bedrahtete Bauteile hineinstecken kann. > Das heißt die erwarten, dass ich da wirklich was in das 100 EUR Board reinlöte??? Wer macht denn sowas, das kriegt man doch nie wieder ganz sauber raus?? > Die restlichen Fragen sollten durch näheres Betrachten des Schaltplanes > in slau213a.pdf und des User's Guide des 'F4618 zu klären sein. Das > Board sieht eine bestimmte Beschaltung vor, wie z.B. die Nutzung des > zweiten MSP430, des 'F2013, der über eine I2C-Schnittstelle mit dem > 'F4618 verbunden wird. Das muss man aber nicht nutzen; wenn man die > Jumper auf H1 weglässt, sind die korrespondierenden Pins des 'F4618 > nicht mehr mit dem anderen Kram verbunden. Ich habe mir die Anleitung ja durchaus schon angesehen (mehrfach), aber ich bin in diesen Themen leider nicht so fit, möchte es aber gerne lernen. Du spielst vermutlich auf Abschnitt 6.2.3 und Table B-1 an? Heißt das, ich muss dann die beiden Jumper 1-2 und 3-4 entfernen (ah, Augen auf, direkt über "SPI Configuration" kommt ja der gleiche Header nochmal in i2c Comm vor... ok!) Ok, ich versuche das mal nachzuvollziehen. Bitte um Antwort ob ich das dann richtig verstanden habe. Die PINs 3.1 - 3.3 sind erstmal nicht frei nutzbar, sondern auf dem Mainboard über den H1 direkt mit dem 2013er verbunden, damit man dort entsprechende Beispiele ablaufen lassen kann, die demonstrieren wie die beiden 430er miteinander kommunizieren. Wenn ich in H1 dann aber J1-2 und J3-4 ziehe, ist die Verbindung unterbrochen und ich kann das i2c Signal direkt am Pin 2/4 des H1 abgreifen - ODER, wenn ich P3.1 P3.2 entsprechend umkonfiguriere als SPI anstatt i2c, dann auch UCB0SIMO und UCB0SOMI. Die SPI CLK wäre dann Pin8 auf dem H1, der ohnehin unbelegt ist? Da ich für meine serielle Verbindung zum PC den UCA0 nutze und für SPI dann den UCB0, kann ich dann beides parallel nutzen. P3.0 könnte ich beispielsweise (oder einen der P6.x Pins z.B.) dann als SS\ nutzen um den Sensor auszuwählen. > Wenn Du SPI nutzen willst, solltest Du Dir ansehen, welche > Schnittstellenperipheriemodule der 'F4618 einsetzt (TI hat in seinen > verschiedenen Mitgliedern der MSP430-Reihe verschiedene Varianten im > Einsatz), und dann solltest Du ansehen, wieviele davon im Controller > vorhanden sind. Die seriellen Schnittstellen sind oft so aufgebaut, daß > ein Peripheriemodul nur alternativ als UART oder SPI-Interface genutzt > werden kann, da dieselben Pins dafür verwendet werden. > Üblicherweise gibt es aber mehrere dieser Funktionsblöcke, so daß Du da > schon was aussuchen können solltest. > Ok, am Beispiel des konkreten Boards heißt dass dann: Der UCA kann paralle SPI und RS232, da er dafür in Summe 5 Pins vorhält (P2.4/P2.5, P7.1-P7.3), der UCB kann aber nur entweder SPI oder i2c, da bei beiden Die Pins 3.1-3.3 verwendet werden. So richtig? Beim UCA habe ich im Moment aber dennoch nicht die Wahl, da ich ja hier auf RS232 festgelegt bin, zwecks Debugausgaben. Was mich aber wundert: Wenn die Funktion alternativ ist/wäre, warum hat TI dann hier in Summe 5 anstatt 3 Pins spendiert. Kann es bei dem konkreten Controller 4618 dann doch sein, dass der mit UCA gleichzeitig RS232 und SPI kann? Ich habe mir schon mal im Manual des 4618 das ganze Thema mit der seriellen Kommunikation angesehen, aber ich muß gestehen, die Datasheets von AVR finde ich weitaus verständlicher :-/ > Ob das Board jetzt der Weisheit letzter Schrei ist, das steht auf einem > ganz anderen Blatt - TI liefert gerne Boards, die darauf aus sind, ein > ganz bestimmtes "feature set" zu demonstrieren, und die sich weniger als > allgemeine Test- und Bastelplatinen eignen. > > So etwas liefert dann z.B. die Firma Olimex. Hast Du hier ein paar Empfehlungen welche Boards? Danke für Deine Mühe!
Markus D. schrieb: > Das heißt die erwarten, dass ich da wirklich was in das 100 EUR Board > reinlöte??? Wer macht denn sowas, das kriegt man doch nie wieder ganz > sauber raus?? Ja, selbstverständlich. Das ist keine Hobbyware, das ist ein Testboard, das im Labor/der Entwicklungabteilung mal für 'ne Woche zum Spielen und Testen genutzt wird und danach im Schrank landet. > Hast Du hier ein paar Empfehlungen welche Boards? Für den 'FG4618 hat Olimex nichts, nur für den Bruder 4619. Und das ist auch nur so ein Test-Board: http://olimex.com/dev/msp-4619lcd.html Bei anderen MSP430-Derivaten sehen die Boards z.B. so aus: http://olimex.com/dev/msp-p2274.html Der Lochrasterbereich ist auch hier dafür gedacht, Bauteile einzulöten. Wenn Du wirklich mit diesen Plastiksteckbrettern arbeiten willst, ist vielleicht die Kombination aus so einem Ding und so etwas http://olimex.com/dev/msp-h2618.html für Dich geeignet.
Okay, danke. Da haben wohl alle mehr oder weniger ein paar Nachteile (das Std.-alone Board hat ja z.B. keine JTAG-Buchse, die ich erst dran basteln müssten bei den anderen muss man einlöten)... Mal sehen, da wird sich schon was finden. Das 4619er Board sieht diesbezüglich ja am Besten aus... Blöde Frage: Mit meinem original JTAG-FET kann ich die ja alle proggen/debuggen, oder? Ich brauche nicht den Olimex-JTAG-Adapter? Könntest Du bzgl. meiner "Analyse" der UCA* Pins noch was schreiben, ob ich da richtig liege, bitte?
Markus D. schrieb: > Blöde Frage: Mit meinem original JTAG-FET kann ich die ja alle > proggen/debuggen, oder? Ich brauche nicht den Olimex-JTAG-Adapter? Ja, das Original funktioniert mit jedem MSP430. Das Olimex-Teil ist ein Nachbau, der andere Devicetreiber benötigt (da eine andere USB-Anbindung genutzt wird). Dafür ist der Olimex-Nachbau etwas schneller. Der 'FG4618 hat zwei unterschiedliche für serielle Schnittstellen zuständige Module, USART1 und die zweigeteilte USCI_A0/_B0 USART1 kann als asynchrone serielle Schnittstelle und als SPI-Interface genutzt werden, USCI_A0 kann ebenso als asynchrone serielle Schnittstelle, für SPI und für IrDA genutzt werden, währenddem USCI_B0 nur die synchronen Schnittstellen SPI und I2C unterstützt. Du hast also drei unterschiedliche Möglichkeiten, eine SPI-Schnittstelle zu nutzen: - per USART1 als Alternativbelegung zu P4.2-P4.5 P4.2 ist nur erforderlich, wenn ein SPI-Slave implementiert wird Die anderen Leitungen sind im Schaltplan mit UCLK1, SOMI1 und SIMO1 bezeichnet (unten rechts an U3, Pins 48..50), sind auf H3 geführt. - per USCI_A0 als Alternativbelegung zu P7.0-P7.3 P7.0 ist nur erforderlich, wenn ein SPI-Slave implementiert wird Hier heißen die Leitungen UCA0CLK, UCA0SOMI und UCA0SIMO (U3, Pins 42..44), wird auf H6 geführt. - per USCI_B0 als Alternativbelegung zu P3.0-P3.3 P3.0 ist nur erforderlich, wenn ein SPI-Slave implementiert wird Im Schaltplan als UCB0CLK, UCB0SCL und UCB0SDA (U3 Pins 68..70) bezeichnet, weil das als I2C-Schnittstelle für die Verbindung mit dem 'F2013 genutzt wird. Wird auf H1 und H7 geführt. (und natürlich als reine Softwarelösung per "Bitbanging" auf jedem beliebigen Port)
Hallo Rufus, danke für die ausführliche Beschreibung. Ich denke, ich habe es nun verstanden und werde mich mal an eine Umsetzung meiner Idee machen! :-)
So, habe nun doch wieder Probleme... Vielleicht kann mir nochmal jemand helfen bitte: Anbei ein Ausschnitt (Hilfsfunktionen usw. sind explizit rausgelassen) aus meinem Programm:
1 | #include <msp430FG4618.h> |
2 | #include <stdio.h> |
3 | |
4 | void uart_putstring(char *); |
5 | void uart_putchar(char); |
6 | |
7 | volatile char state = 0; |
8 | |
9 | void main(void) |
10 | {
|
11 | volatile unsigned long i; |
12 | volatile unsigned char Data; |
13 | |
14 | WDTCTL = WDTPW+WDTHOLD; // Stop WDT |
15 | FLL_CTL0 |= XCAP14PF; // Configure load caps |
16 | |
17 | do { |
18 | IFG1 &= ~OFIFG; // Clear OSCFault flag |
19 | for (i = 0x47FF; i > 0; i--); // Time for flag to set |
20 | }
|
21 | while ((IFG1 & OFIFG)); // OSCFault flag still set? |
22 | |
23 | // Setup timer, up mode up to TACCR0 value
|
24 | /*
|
25 | TACTL |= TASSEL0; // Set bit 8 = ACLK
|
26 | TACTL |= ID0; // Set prescaler /2
|
27 | TACTL |= MC0; // UP mode
|
28 | TACTL |= TAIE;// Enable interrupt for Timer_A
|
29 |
|
30 | TACCTL0 |= CCIE; // Enable compare interrupt
|
31 | */
|
32 | CCTL0 = CCIE; |
33 | CCR0 = 20000-1; |
34 | TACTL = TASSEL_1 + MC0; |
35 | |
36 | |
37 | // LEDs are configured on P2.1 (2) and P2.2 (4)
|
38 | |
39 | // Configure SPI
|
40 | // On a MSP430F2274:
|
41 | // P3.0 = UCB0STE/UCA0CLK --> on a 4618: P3.0 (UCB0STE), P7.3 (UCA0CLK)
|
42 | // P3.1 = UCB0SIMO/UCB0SDA --> on a 4618: P3.1 (UCB0SIMO/UCB0SDA)
|
43 | // P3.2 = UCB0SOMI/UCB0SCL --> on a 4618: P3.2 (UCB0SOMI/UCB0SCL)
|
44 | // P3.3 = UCB0CLK/UCA0STE --> on a 4618: P3.3 (UCB0CLK)
|
45 | // P3.4 = UCA0TXD/UCA0SIMO --> on a 4618: P4.3 (SIMO1), P7.1 (UCA0SIMO)
|
46 | // P3.5 = UCA0RXD/UCA0SOMI --> on a 4618: P4.4 (SOMI1), P7.2 (UCA0SOMI)
|
47 | |
48 | // H6: 2 = UCA0SIMO, 2=UCA0SOMI, 4=UCA0CLK, H7: 2 = UCB0SDA, 3=UCB0SCL, 4=UCB0CLK
|
49 | |
50 | // Configure SPI
|
51 | |
52 | P3SEL |= 0x0f; // P3.0, P3.1, P3.2, P3.3 USCI_B0 option select |
53 | P3DIR |= 0x0b; // Outputs on P3.0 (SS\), P3.1 (MOSI), P3.3 (CLK). [P3.2 = MISO as input) |
54 | P3OUT |= 0x01; |
55 | // SPI Initialization
|
56 | UCB0CTL0 |= UCCKPH + UCCKPL + UCMSB + UCMST + UCMODE1 + UCSYNC; // 4-pin, 8-bit SPI master, STE active low |
57 | UCB0CTL1 |= UCSSEL_2; // Select SMCLK as CLK |
58 | UCB0BR0 |= 0x02; |
59 | UCB0BR1 = 0; |
60 | UCB0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** |
61 | |
62 | uart_putstring("RS232 and SPI configured...\r\n"); |
63 | |
64 | while(1) |
65 | {
|
66 | uart_putstring("Selecting sensor\r\n"); |
67 | P3OUT &= ~0x1; // Chip select active low on P3.0 |
68 | [...]
|
69 | // Deactivate sensor
|
70 | uart_putstring("Got back answer"); |
71 | P3OUT |= 0x1; |
72 | }
|
73 | |
74 | }
|
Das Problem ist nun, dass sich an dem Pin 3.0 nie etwas tut. Mit P3DIR=0x0b wurde er ja als Output-Pin definiert und mit P3OUT |= 0x01 hätte ich erwartet, dass der Pegel dann von 0 auf 3,3V geht? (Messe mit dem Oszi nach). Ich wollte also einfach mal sehen, ob ich die richtigen Pins "erwischt habe". Weder der Pin H7.1 noch H1.6 (bei gezogenem Jumper) ändert sich. Ich bin also eigentlich noch gar nicht so weit, überhaupt via SPI was zu versenden, aber das klappt schon nicht... Oder ist das jetzt so, dass das USCI Modul selbst die Kontroller über den P3.0 Pin hat durch meine P3SEL Anweisung, und ich da hinschreiben kann was ich will und es sich nicht ändert? Habe ich das richtig verstanden, dass ich den Jumper 1-2 und 3-4 bei H1 gar nicht ziehen müsste, da alle Signale ja auch bei H7 anliegt? Apropos Oszi: Wie eingangs ja schon geschrieben, brauche ich ja auch für das Oszi zum Messen eine Masse. Aus Ermangelung eines Pins habe ich Masse vom Oszi nun an GND der Spannungsversorgung am Steckbrett geclipst wo mein Sensor drinnen sitzt (Läuft mit 3.3V)
Hmm, ok es war wirklich das "P3SEL |= 0x0f". In diesem Fall wird wohl auch P3.0 vom USCI kontrolliert. Kann mir nochmal jemand mit dem Schreiben über SPI helfen bitte? Ich habe es so versucht:
1 | IFG2 &= ~UCB0TXIFG; // Clear int flag |
2 | // Send a byte
|
3 | UCB0TXBUF = 0x00; |
4 | while ((IFG2 & UCA0RXIFG) == 0); // Wait until MC received a byte back |
5 | IFG2 &= ~UCB0RXIFG; // Clear int flag |
6 | // Send another byte
|
7 | UCB0TXBUF = 0x00; |
8 | while ((IFG2 & UCB0RXIFG) == 0); |
9 | return UCB0RXBUF; |
Aber es scheint wiederum nie was "auf die Leitung" zu gehen (ich habe versucht auf CLK zu triggern, auf SS, ...)
Sieh Dir die Codebeispiele an, die TI für die verschiedenen MSP430-Familien zur Verfügung stellt, die beschreiben i.d.R. recht gut, wie mit bestimmten Peripheriemodulen umzugehen ist. http://www.ti.com/lit/zip/slac118
OK, habe ich gemacht und mich auch eng an die Beispiele gehalten... Für alle die es sonst vlt. noch interessiert: Der Fehler war, dass ich den USCI in "4-wire mode" konfiguriert hatte, anstatt 3-wire. Mich hatte die Beschreibung verwundert, da ich ja immer 4-Drähte habe (MOSI/MISO, CLK und SS\). Das ist aber nach MSP430 Lesart der 3-Wire mode, da SS\ wohl immer vom Anwender gesetzt werden muß. Leider hat sich hier beim MSP430 das gleiche Fehlerbild gezeigt, wie bei meinen anfänglichen Versuchen mit dem ATmega... Der ADXL 345 reagiert extrem seltsam auf Verbindungsversuche: Beim Abfragen der Device-ID kommt auf MISO ein sauberes Signal rein, allerdings bei jeder zweiten Abfrage ein anderes (immer im Wechsel) [Anm.: Nein, es handelt sich hierbei nicht um die eigentliche Antwort, die um 1 Byte versetzt kommt. Ich meinte hiermit schon die jeweils 2 Byte Übertragungen im Wechsel]. Wenn ich dann Versuche den Sensor zum Messen zu überreden kommt ein Signal zurück, was so um die 0.2-0.3 V rumeiert (vorher waren die Flanken sauber umrissen) und was dann natürlich als logisch 0 interpretiert wird und nach 3-4 weiteren Versuchen kann es sein, dass er sich komplett weghängt. Ich habe daraufhin noch mit der CLK-Geschwindigkeit rumgespielt, da ich mir dachte, vlt. sendet der MSP430 zu schnell, aber außer dass dann alle Signale entsprechend länger wurden tat sich nichts... Vielleicht versuche ich jetzt nochmal den Chip mittels i2c anzusprechen, aber wenn das auch nicht klappt, dann scheint der Chip wohl wie bei so vielen hinüber zu sein... :-( Wen es interessiert, hier der Code:
1 | /*
|
2 | * 20101218 - MSP430FG4618/2013 Experimenter's board and ADXL 345 sensor
|
3 | *
|
4 | * This code connects to an ADXL 345 sensor via SPI and
|
5 | * tries to set the measurement mode by writing the value 0x28 to the register at 0x2d (POWER_CTL register)
|
6 | *
|
7 | * Sensor: http://www.sparkfun.com/products/9156 (Triple Axis Accelerometer Breakout - ADXL345)
|
8 | *
|
9 | * 4 jumperwires a needed to connect the sensor
|
10 | *
|
11 | * - P3.0 is the SS\ wire
|
12 | * - P3.1 is the UCB0SIMO pin routed to H7.2
|
13 | * - P3.2 is the UCB0SOMI pin routed to H7.3
|
14 | * - P3.3 is the UCB0CLK pin routed to H7.4
|
15 | *
|
16 | * Chip is selected by pulling P3.0 low
|
17 | *
|
18 | * Status: Code should be ok, but does not work on my setup:
|
19 | * The chip responses are erratic.
|
20 | * Queriing the device ID (register 0x00) does also not return the
|
21 | * fixed response 11100101
|
22 | *
|
23 | * This code was based on http://e2e.ti.com/support/microcontrollers/msp43016-bit_ultra-low_power_mcus/f/166/t/52871.aspx
|
24 | * which also tried to access an ADXL 345
|
25 | * However, there, other registers are used.
|
26 | *
|
27 | * Debug output is send via UART to the PC
|
28 | */
|
29 | |
30 | #include <msp430FG4618.h> |
31 | #include <stdio.h> |
32 | |
33 | void uart_putstring(char *); |
34 | void uart_putchar(char); |
35 | |
36 | volatile char state = 0; |
37 | |
38 | void main(void) |
39 | {
|
40 | volatile unsigned long i; |
41 | volatile unsigned char Data; |
42 | char buffer[20]; |
43 | WDTCTL = WDTPW+WDTHOLD; // Stop WDT |
44 | FLL_CTL0 |= XCAP14PF; // Configure load caps |
45 | |
46 | do { |
47 | IFG1 &= ~OFIFG; // Clear OSCFault flag |
48 | for (i = 0x47FF; i > 0; i--); // Time for flag to set |
49 | }
|
50 | while ((IFG1 & OFIFG)); // OSCFault flag still set? |
51 | |
52 | // Configure UCA0 for RS232
|
53 | P2SEL |= 0x30; // // P2.4 + P2.5 = USCI_A0 RXD/TXD, P2.1 & P2.2 stay GPIO |
54 | UCA0CTL1 |= UCSSEL_2; // SMCLK |
55 | UCA0BR0 = 0x09; // 1MHz 115200 |
56 | UCA0BR1 = 0x00; // 1MHz 115200 |
57 | UCA0MCTL = 0x02; // Modulation |
58 | UCA0CTL1 &= ~UCSWRST; // Start UART |
59 | |
60 | // Configure UCB0 for SPI
|
61 | |
62 | P3SEL |= 0x0e; // P3.1, P3.2, P3.3 USCI_B0 option select |
63 | P3DIR |= 0x0b; // Outputs on P3.0 (SS\), P3.1 (MOSI), P3.3 (CLK). [P3.2 = MISO as input) |
64 | |
65 | // SPI Initialization
|
66 | UCB0CTL0 |= UCCKPH + UCCKPL + UCMSB + UCMST + UCSYNC; // 4-pin, 8-bit SPI master, MSB first |
67 | UCB0CTL1 |= UCSSEL_2; // Select SMCLK as CLK |
68 | UCB0BR0 |= 0x02; |
69 | UCB0BR1 = 0; |
70 | |
71 | P3OUT |= 0x01; // Deselect sensor |
72 | UCB0CTL1 &= ~UCSWRST; // Start SPI |
73 | |
74 | uart_putstring("RS232 and SPI configured...\r\n"); |
75 | |
76 | while(state!=0x28) |
77 | {
|
78 | for(i = 0xFFFF; i > 0; i--); |
79 | |
80 | // Set measurement mode
|
81 | P3OUT &= ~0x1; |
82 | UCB0TXBUF = 0x2D; // 2D |
83 | while (!(IFG2 & UCB0RXIFG)); |
84 | UCB0TXBUF = 0x28; // 28 |
85 | while (!(IFG2 & UCB0RXIFG)); |
86 | P3OUT |= 0x1; |
87 | |
88 | for(i = 0xFFFF; i > 0; i--); |
89 | |
90 | // Query measurement mode
|
91 | P3OUT &= ~0x1; |
92 | UCB0TXBUF = 0xAD; |
93 | while (!(IFG2 & UCB0RXIFG)); |
94 | UCB0TXBUF = 0x00; |
95 | while (!(IFG2 & UCB0RXIFG)); |
96 | state = UCB0RXBUF; |
97 | P3OUT |= 0x1; |
98 | |
99 | sprintf(buffer, "Power is: %x\r\n", state); |
100 | uart_putstring(buffer); |
101 | }
|
102 | uart_putstring("Measurement mode activated!\r\n"); |
103 | while(1); |
104 | }
|
105 | |
106 | void uart_putstring(char *str) { |
107 | while (*str!=0) uart_putchar(*str++); |
108 | }
|
109 | |
110 | void uart_putchar(char c) { |
111 | while(!(IFG2&UCA0TXIFG)); |
112 | UCA0TXBUF = c; |
113 | }
|
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.