Hallo,
ich frage über einen MSP430F2618 einen LTC1867L ab. Der ADC verfügt über
8 AD Kanäle, auslesen lässt sich der ADC über SPI. Das ganze mache ich
folgendermassen...
Zuerst initialisiere ich die Ansteuerung des SPI, das sollte soweit
stimmen. Ich habe die Einstellungen auf CPOL = 0 und CPHA = 0 (bei den
MSPs entspricht CPHA = 0 -> UCCKPH = 1):
1 | void init_SPI()
|
2 | {
|
3 | UCB0CTL1 |= UCSWRST;
|
4 | UCB0CTL0 |= (UCCKPH | UCMSB | UCMST | UCMODE_0 | UCSYNC);
|
5 | UCB0CTL1 |= UCSSEL_1;
|
6 | UCB0BR0 = 1;
|
7 | UCB0BR1 = 0;
|
8 | UCB0CTL1 &= ~UCSWRST;
|
9 | }
|
Ich lese anschließend mit folgender Funktion alle Kanäle aus, wobei
"command_vector[8]" die Kommandos zum Auslesen der Kanäle 0-7 enthält.
Diese sind definitiv korrekt.
1 | void read_all_channels()
|
2 | {
|
3 | u8_t command_vector[8] = {0x84,0xC4,0x94,0xD4,0xA4,0xE4,0xB4,0xF4};
|
4 | u8_t channel = 0;
|
5 | u8_t high_byte = 0, low_byte = 0;
|
6 |
|
7 | for (channel=0; channel<=7; channel++)
|
8 | {
|
9 | CS_HIGH; //Chip Select High
|
10 | CS_LOW; //Chip Select Low
|
11 | delay(8); //conversion time Tconv abwarten
|
12 |
|
13 |
|
14 | while(!TX0_COMPLETE);
|
15 | UCB0TXBUF = ADC1_command_vector[channel]; // TX buffer beschreiben
|
16 | while (!RX0_COMPLETE);
|
17 | high_byte = UCB0RXBUF; // RX buffer lesen
|
18 | while(!TX0_COMPLETE);
|
19 | UCB0TXBUF = 0xFF; // TX buffer beschreiben um 2. Byte zu lesen (Wert = don't care)
|
20 | while (!RX0_COMPLETE);
|
21 | low_byte = UCB0RXBUF; // RX buffer lesen
|
22 |
|
23 | voltages[channel] = ((high_byte << 8) + low_byte);
|
24 | }
|
25 |
|
26 | return;
|
27 | }
|
Nach dem Aufrufen der Funktion sind die Werte im Array voltages[]
allerdings, wider erwarten nicht in der richtigen Reihenfolge. So ist
der Wert für Channel0 bei voltages[1], der für Channel1 bei voltages[2]
usw...
Es scheint so, als würde beim ersten Lesevorgang die Werte nicht
ausgelesen, stattdessen hängen die wohl noch im Speicher des ADCs fest.
Erst beim 2. Lesen bekommt man diese dann.
Ist das Verhalten bekannt? Hat jemand einen Hinweis für mich, was ich
falsch machen?
Besten Dank!