Forum: Mikrocontroller und Digitale Elektronik Kanalabfrage des ADC ltc1867L - eigenartiges Verhalten?


von MaWe (Gast)


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!

von MaWe (Gast)


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
}

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.