Forum: Mikrocontroller und Digitale Elektronik MSP430FG4618/2013 Experimenters Board - Anfängerfrage


von Markus D. (daubsi)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Markus D. (daubsi)


Lesenswert?

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!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Markus D. (daubsi)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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)

von Markus D. (daubsi)


Lesenswert?

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! :-)

von Markus D. (daubsi)


Lesenswert?

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)

von Markus D. (daubsi)


Lesenswert?

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, ...)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von Markus D. (daubsi)


Lesenswert?

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
Noch kein Account? Hier anmelden.