Kanalabfrage des ADC ltc1867L - eigenartiges Verhalten?

Gast #2080853
Lesenswert?

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!
Gast #2080859
Lesenswert?

Oben war noch ein FEhler, der zweite Codeblock lautet natürlich so hier:
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 = 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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren