1 | #include <msp430.h>
|
2 |
|
3 | /*
|
4 | * ADXL362
|
5 | * Auslesen der z-Achse
|
6 | *
|
7 | * P1.5 CS
|
8 | * P1.6 MOSI
|
9 | * P1.7 MISO
|
10 | * P2.2 CLOCK
|
11 | */
|
12 |
|
13 | void writeOneRegister(char value, char adress);
|
14 | void writeTwoRegister(int value, char adress);
|
15 | int readOneRegister(char adress);
|
16 | int readTwoRegister(char adress);
|
17 | void reset(void);
|
18 |
|
19 | int value;
|
20 | char valueH;
|
21 | char valueL;
|
22 | int zAxis;
|
23 |
|
24 |
|
25 | int main(void) {
|
26 |
|
27 | WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
|
28 |
|
29 | // Pin Konfiguration
|
30 | P1SEL1 |= BIT6 + BIT7; // P1.6 als UCB0SIMO, P1.7 als UCB0SOMI
|
31 | P2SEL1 |= BIT2; // P2.2 als UCB0CLK
|
32 | P1DIR |= BIT5; // P1.5 als CS
|
33 | P1OUT |= BIT5; // CS high setzen
|
34 | P4DIR |= BIT6; // LED1
|
35 | P4OUT |= BIT6; // LED1 an
|
36 | P1IE |= BIT3 + BIT4; // P1.3 + P1.4 als INT1/2 für ADXL362
|
37 |
|
38 | PM5CTL0 &= ~LOCKLPM5;
|
39 |
|
40 | // Setup SPI (eUSCI_B)
|
41 | UCB0CTLW0 |= UCSWRST; // UCB0 hold in reset state for configuration
|
42 | UCB0CTLW0 |= UCCKPH + UCMSB + UCMST + UCMODE_0 + UCSYNC + UCSSEL_2; // Data captured on first edge + MSB first + Master Mode + 3-pin SPI + Synchronous Mode + SMCLK
|
43 | UCB0BRW = 0; // Prescaler 1 -> CLK sollte mind. 1 MHz sein laut dem ADXL362 Datenblatt
|
44 |
|
45 | // Setup ADXL362
|
46 |
|
47 | writeOneRegister(0x15, 0x2C); // FILTER_CTL --> HALF_BW + ODR = 400Hz
|
48 | writeOneRegister(0x02, 0x2D); // POWER_CTL --> Measurement Mode
|
49 | reset();
|
50 | while(1) {
|
51 | P4OUT ^= BIT6; // Toggle LED1
|
52 | zAxis = readTwoRegister(0x12); // Wert der z-Achse auselesen
|
53 | __delay_cycles(100000); // 100ms Delay
|
54 | }
|
55 | }
|
56 |
|
57 | // Hilfsfunktionen
|
58 |
|
59 | void writeOneRegister(char value, char adress) { // 1 Byte in Register schreiben
|
60 | UCB0CTLW0 &= ~UCSWRST; // reset released for operation
|
61 | P1OUT &= ~BIT5; // CS enabled
|
62 | UCB0TXBUF = 0x0A; // Schreib-Befehl senden
|
63 | while(!(UCB0IFG & UCTXIFG)); // warten bis Shift-Register leer ist
|
64 | UCB0TXBUF = adress; // Register-Adresse senden
|
65 | while(!(UCB0IFG & UCTXIFG)); // warten bis Shift-Register leer ist
|
66 | UCB0TXBUF = value; // Register-Wert senden
|
67 | while(!(UCB0IFG & UCTXIFG)); // warten bis Shift-Register leer ist
|
68 | P1OUT |= BIT5; // CS disabled
|
69 | }
|
70 |
|
71 | int readOneRegister(char adress) { // 1-Byte Register lesen
|
72 | UCB0CTLW0 &= ~UCSWRST; // reset released for operation
|
73 | P1OUT &= ~BIT5; // CS enabled
|
74 | UCB0TXBUF = 0x0B; // Lese-Befehl senden
|
75 | while(!(UCB0IFG & UCTXIFG)); // warten bis Shift-Register leer ist
|
76 | UCB0TXBUF = adress; // Register-Adresse senden
|
77 | while(!(UCB0IFG & UCTXIFG)); // warten bis Shift-Register leer ist
|
78 | value = UCB0RXBUF; // Register-Wert lesen
|
79 | while(!(UCB0IFG & UCRXIFG)); // warten bis Shift-Register voll ist
|
80 | P1OUT |= BIT5; // CS disabled
|
81 | return value; // Wert zurückgeben
|
82 | }
|
83 |
|
84 | void writeTwoRegister(int value, char adress) {
|
85 | valueH = value >> 8;
|
86 | valueL = value;
|
87 | UCB0CTLW0 &= ~UCSWRST;
|
88 | P1OUT &= ~BIT5;
|
89 | UCB0TXBUF = 0x0A;
|
90 | while(!(UCB0IFG & UCTXIFG));
|
91 | UCB0TXBUF = adress;
|
92 | while(!(UCB0IFG & UCTXIFG));
|
93 | UCB0TXBUF = valueL;
|
94 | while(!(UCB0IFG & UCTXIFG));
|
95 | UCB0TXBUF = valueH;
|
96 | while(!(UCB0IFG & UCTXIFG));
|
97 | P1OUT |= BIT5;
|
98 | }
|
99 |
|
100 | int readTwoRegister(char adress) {
|
101 | UCB0CTLW0 &= ~UCSWRST;
|
102 | P1OUT &= ~BIT5;
|
103 | UCB0TXBUF = 0x0B;
|
104 | while(!(UCB0IFG & UCTXIFG));
|
105 | UCB0TXBUF = adress;
|
106 | while(!(UCB0IFG & UCTXIFG));
|
107 | valueL = UCB0RXBUF;
|
108 | while(!(UCB0IFG & UCRXIFG));
|
109 | valueH = UCB0RXBUF;
|
110 | while(!(UCB0IFG & UCRXIFG));
|
111 | P1OUT |= BIT5;
|
112 | value = valueL + (valueH << 8);
|
113 | return value;
|
114 | }
|
115 |
|
116 | void reset(void) {
|
117 | UCB0CTLW0 &= ~UCSWRST;
|
118 | P1OUT &= ~BIT5;
|
119 | UCB0TXBUF = 0x0B;
|
120 | while(!(UCB0IFG & UCTXIFG));
|
121 | UCB0TXBUF = 0x0B;
|
122 | while(!(UCB0IFG & UCTXIFG));
|
123 | value = UCB0RXBUF;
|
124 | while(!(UCB0IFG & UCRXIFG));
|
125 | P1OUT |= BIT5;
|
126 | }
|