mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADS8344 und AT90CAN128


Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe versucht, einen ADS8344 ADC von TI mit dem AT90CAN128 von Atmel 
über SPI komminizieren zu lassen. Irgendwie klappt das nicht. 
Anscheinend ist das Timing nicht korrekt. Ich lasse meinen Code unten 
stehen. Ist das wahr, SPI-Daten des Slave werden automatisch vorkommen 
während der Master über SPI schreibt?
... 
SPI_MasterInit(); 

/* one ADC measurement */    
PORTB &= 0xFE;   // set SS to low 

// set command to ADS8344: start bit, channel 0, single ended and no power down 
SPI_Master_Transmit_Receive(0x87);    
adc_data[2] = SPI_Master_Transmit_Receive(0x00);   // highst 7 bits 
adc_data[1] = SPI_Master_Transmit_Receive(0x00);   // middle 8 bits 
adc_data[0] = SPI_Master_Transmit_Receive(0x00);   // lowest 1 bit 
PORTB |= 0x01;   // set SS to high 
... 

/*   SPI initialization */ 
void SPI_MasterInit(void) 
{ 
   // set MOSI, SCK and SS as output 
   DDRB = (1 << DDB2) | (1 << DDB1) | (1 << DDB0); 
   //   Enable SPI, Master, set clock rate fck/16 
   SPCR =(1<<SPE)|(1<<MSTR)|(1<<SPR1); 
} 

/*   SPI transmit and receive */ 
UINT8 SPI_Master_Transmit_Receive(UINT8 spi_data) 
{ 
   SPDR = spi_data; 
   while (!(SPSR & (1 << SPIF))); 
   return SPDR; 
}

MfG
Senmeis

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Senmeis,

hast du den Chip richtig angeschlossen? Ich kann mich erinnern, dass der 
einen SHDN Eingang hat. Der sollte auf high liegen! Ansonsten macht der 
ADC nämlich nix ;)

Hast du ein Digitaloszi? Besser noch ein Logic Analyzer :D
Dann könntest du dir mal die Signale anschauen.

Ich wünsche dir viel erfolg

Autor: Bensch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ist das wahr, SPI-Daten des Slave werden automatisch vorkommen
während der Master über SPI schreibt?

vorkommen --> eingelesen ?

Im Datenblatt sieht's anders aus (Fig. 5 und 6).

Autor: Kobaltchlorid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du dir das Datenblatt bezüglich der SPI-Kommunikation auch genau 
angesehen? Der ADS8344 ist etwas eigenwillig in seiner Ansteuerung. Du 
musst nämlich nach dem ersten Steuerbyte eine einzelnes (!) neuntes Bit 
senden.

Bei deinem Code werden drei normale Steuerbytes gesendet, das geht so 
nicht.

Nachfolgend meine (funktionierende) Funktion, mit der ich den ADS8344 
auslese. Ist zwar für CodevisionAVR, das Setzen des Portpins PORTB.5 
(SCK) und die SPI-Funktion muss man für WinAVR umändern, aber das 
Prinzip sollte klar sein. Die einzelnen Bytes der Messwerte muss man 
dann natürlich noch zu einem 16bit-Integer zusammensetzen.

Codeschnipsel:
unsigned char Messwerte[16]; //Zwischenspeicher für Messwerte 
//Steuerbytes für AD-Wandler:
const char Channel[8] =
{0b10001111,0b11001111,0b10011111,0b11011111,
0b10101111,0b11101111,0b10111111,0b11111111};

//Funktion zum Auslesen der ADC-Messwerte:
void read_AD(void)
{
unsigned char i;
for (i=0;i<8;i++)
  { 
  spi(Channel[i]); //Controlbyte senden
  SPCR=0x00; //SPI ausschalten
  //Einen einzelnen Taktimpuls senden:
  //**********************************
  delay_us(10);
  PORTB.5=1; //SCK auf High 
  delay_us(10);
  PORTB.5=0; //SCK wieder auf LOW
  delay_us(10);
  SPCR=0x53; //SPI wieder einschalten 
//*************************************  
  Messwerte[(i*2)+1]=spi(0); //Highbyte einlesen
  Messwerte[i*2]=spi(0); //Lowbyte einlesen
  spi(0);
  };
}

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 115,195 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x53;
SPSR=0x00;

Autor: Bensch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Du musst nämlich nach dem ersten Steuerbyte eine einzelnes (!) neuntes Bit
senden.

Das seh ich aber in Fig. 3,5 und 6 nicht.

Lediglich das Ergebnis ist um 1 Bit verschoben, sodass man für volle 16 
Bit Auflösung 3 Byte lesen muss, das allererste ist immer L.

Autor: Kobaltchlorid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Bensch:

Zitat Datenblatt:
"Since one clock cycle of the serial clock is consumed with
BUSY going HIGH (while the MSB decision is being
made), 16 additional clocks must be given to clock out all 16
bits of data; thus, one conversion takes a minimum of 25
clock cycles to fully read the data."

Ich hab's halt mit einem einzelnen eingeschobenen Taktimpuls gemacht. 
Alternativ dazu kann man natürlich drei Bytes auslesen und diese dann 
mit shiften und umkopieren zu einem 16bit-Wert ummodeln. Jeder wie er 
mag.

Autor: Bensch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich hab's halt mit einem einzelnen eingeschobenen Taktimpuls gemacht.

Bei ner Hardware-SPI? Viel Spass....

Autor: Kobaltchlorid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Bei ner Hardware-SPI? Viel Spass....

Wie darf ich das verstehen? Wie ich den eingeschobenen einzelnen 
Taktpuls erzeuge, steht doch da. Mein Codeschnipsel läuft einwandfrei 
auf einem ATMega8.

Ich empfinde halt diese Lösung als effizienter, als drei Bytes mit 
Herumshifterei und Herumkopiererei zu einem 16bit-Wert zu verwursten.

Aber, wie gesagt, jeder wie er mag. Viele Wege führen nach Rom.

Ach ja, das Auslesen der Messwerte in ein char-Array erfolgt deshalb, 
weil der AD-Wandler als Modul für Mess- und Regelaufgaben auf einem 
RS485-Bus hängt, da muss ich die Messwerte sowieso byteweise absenden. 
Den ADS8344 habe ich damals sehr billig als Restposten bekommen, der war 
eigentlich nicht meine erste Wahl, speziell wegen des winzigen Gehäuses.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.