Forum: Mikrocontroller und Digitale Elektronik AD7705 Antwort immer DRDY


von Diplomand_A (Gast)


Lesenswert?

Hallo Jungs,

nachdem ihr mir gestern mit dem Timer geholfen habt, hat der Timer zwar 
nun funktion, aber die verwendung des Timers bei meinem AD7705 (ADC 16 
Bit unipolar, 0-2.5V, 2.4567Mhz)bringt mich auch nicht weiter. Die 
anderen Forenartikel auch nicht :-(

Also, ich versuche nun schon seit Tagen den AD7705 (auch unter MX7705 
erhältlich!) über SPI ans sprechen zu bekommen.

Problem: Er konvertiert mir keine Daten, keine Daten abrufbar! DRDY = 1 
:-(
(Log 1 = Keine Daten, Log 0 = Daten zum abholen bereit!)

Habe mit dem Oscar verglichen und folgendes festgestellt:

/CS in Ordnung
SCLK in Ordnung
Samplen an Rising Edge
MOSI (uc-->ADC!) in Ordnung
MISO antwortet mir immer nur nach der Anfrage ob Daten konvertiert sind 
mit DRDY nicht ready (log= 1). Auch einfaches ignorieren des DRDY-Pins 
bringt keine Besserung! niemals gibt er mir Null zurück!

Des Weiteren kann ich ja auch die anderen Register(Setup,Commreg etc) 
auslesen und er stellt mir den Inhalt korrekt dar!
Eingebracht sind schon Timer(falls er zu langsam ist!) Des Weiteren 
liegt an Reset =+5V, Vref i.O und Vcc auch i.O. Auch nach jedem Register 
schreiben mit Pause und passendem /CS antwortet er mir immer, das keine 
Daten bereit stehen.

Ausser irgendwann habe ich einmalig aus dem Datenregister CS56 erhalten 
(das macht er meist einmal am Tag!) Wieso verstehe ich da auch nicht!

Also, ggf. hat einer von euch den Exoten schonmal ans laufen bekommen?
Der gekürzte C-Code lautet:
1
//.... 
2
         SPI_MasterTransmit(0x21,SS_ADC12);  //Com Reg  Ch1 write to clk 
3
  set_SS_X(SS_ADC12);  
4
5
    while(tenhsec != 999);    //Delay
6
    tenhsec =1;    
7
8
         unset_SS_X(SS_ADC12);
9
  SPI_MasterTransmit(0x07,SS_ADC12); 
10
  set_SS_X(SS_ADC12);  
11
12
    while(tenhsec != 999);    //Delay
13
    tenhsec =1;    
14
15
          unset_SS_X(SS_ADC12);
16
  SPI_MasterTransmit(0x11,SS_ADC12);  // 10
17
  set_SS_X(SS_ADC12);  
18
19
    while(tenhsec != 999);    //Delay
20
    tenhsec =1;    
21
22
          SPI_MasterTransmit(0x06,SS_ADC12);  //40  //Setup reg//07
23
24
                   while(tenhsec != 999);    //Delay
25
    tenhsec =1;  
26
27
  while(1)
28
    {
29
    unset_SS_X(SS_ADC12);
30
    SPI_MasterTransmit(0x08,SS_ADC12);  //Abfrage ob Daten bereit sind                
31
                  set_SS_X(SS_ADC12);
32
    
33
    while(tenhsec != 999);    //Delay
34
    tenhsec =1;      
35
        
36
        
37
    a = SPI_SlaveReceive(SS_ADC12);
38
39
                  while(tenhsec != 999);    //Delay
40
    tenhsec =1;      
41
        
42
    if  (a == 0x08)
43
      {
44
      unset_SS_X(SS_ADC12);
45
      SPI_MasterTransmit(0x38,SS_ADC12);          set_SS_X(SS_ADC12);
46
47
      a=  SPI_SlaveReceive(SS_ADC12);
48
      a=  SPI_SlaveReceive(SS_ADC12);
49
      a = 0;
50
      }
51
    }
52
//...


Danke!!!

gruß

von Micha (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich arbeite z.Z mit einem AD7706. Als Anhang hab ich dir mal meinen 
C-Code für den ADC angehängt.

Gruß

von Micha (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch die zugehörige Header-Datei.

Es steht dort auch einige Sachen drinne die speziell für mein Projekt 
sind. Also nicht wundern.

von Diplomand_A (Gast)


Lesenswert?

Hallo,

danke für deine Mithilfe! Ich habe nun die beiden Fehlerquellen 
entdeckt. Einmal hat "man mir" falsche Cs bei den Quarzen reingepflanzt 
und auf der anderen Seite habe ich das Fsync falsch gesetzt...Naja, nun 
läuft er!

Danke!

gruß

von Diplomand_A (Gast)


Lesenswert?

Hi,

ggf. kannste mir ja nochmal weiter helfen :-)

Ich spreche den AD7705 nun einwandfrei an und wenn nur AD7705 mit am SPI 
dran hängen, dann gibt er mir auch immer einwandfrei die gewandelten 
Daten zurück. Allerdings sobald ich weitere Hardware an den SPI hänge ( 
tristate fähig und auch in dem Zustand!) sendet mir der ADC immer ein 
0x0DFF zurück(also die 16 Bit-Takte wenn ich Daten aus dem Dataregister 
lesen möchte!). Weiß zufällig einer von euch, warum er mir partout dann 
keine Daten mehr sendet ? Also keine gewandelten? Sobald ich dann die 
Hardware "abstecke" sendet er mir munter die Daten weiter.

Danke für jeden Tipp!

greetz!

von Micha (Gast)


Lesenswert?

Stell am besten mal dein Schaltung rein.
Hört sich für mich an als ob du den ADC nicht oder nicht richtig mit der 
Chip-Select Leitung auswählst.

MfG

von Diplomand_A (Gast)


Lesenswert?

Hallo,

thx4answer.

Hmm, das ist ne gute Idee. Habe auch gerade schon die /CS mittels meines 
Oscars überprüft. Es werden tatsächlich immer nur die "richtigen" CS 
angesprochen.

Hmm, mal auf deinen Vorschlag gerne eingehend, dann würde es doch 
heißen, dass ich eig. nie die Antwort bekommen sollte. Ein rein 
zufälliges /CS für den ADC-X gibt es auch nicht. Es kommt immer zum 
richtigen Zeitpunkt, genau dann wenn ich die beiden Datenregister 
auslese(SLCK am takten/ CS Low und Daten über MISO einlesend; MOSI 
Standby!) Den ohne weitere Hardware am SPI funktioniert die 
Antwortgeberei ja einwandfrei. Habe mir den CS der weiteren Hardware 
auch angeschaut. Dieser ist, wenn ich auslese stets High (so wie die 
weitere SPI-Hardware es gerne möchte!) Die Auskunft des Herstellers hat 
mir zugesichert, dass die zusätzliche SPI-Hardware immer Tristate ist, 
wenn CS High ist. Mal angenommen, das wäre ne falschaussage ("..."), 
dann würde ja immer nen High-Pegel am MISO sein, oder ? Also würde er 
auch kein 0x0DFF antworten? Was meinst du den, würde nen Bustreiber mit 
"wirklichem" Tristate Ausgang hilfreich sein ? Bzw. würde dann die 
Antwort richtig senden?

Die Schaltung kann ich leider aus rechtlichen Diplomgründen nicht 
einstellen :-( Es hängen bis zu 4 ADCs (derzeit 2 ADCS) und 2 weitere 
SPI-Hardware-Bausteine dranne! Alle kriegen jeweils die SPI Leitungen 
und jeder eine einzelnde /CS-Leitung!

Danke für die Mithile :-)

greetz

von Gast_AD (Gast)


Lesenswert?

Hallo Jungs,

ich höre hier gerade sehr gespannt mit und ggf. ist der Thread hier ja 
noch offen :-)

Ich verwende auch nen MX7706 (entsprechendes Pendant!) und er ist 
ebenfalls von 0-2.5V eingestellt.

Bei 2.5V gibt er mir den digitalen Wert von 31807 aus
und bei 0V = 000 Digits...

Also fehlt da doch die Hälfte an Auflösung (Einstellungen wie bei euch!)

Er ist def als UNipolar eingestellt...

Oder muss ich da was mit diesem selfcalib machen, damit der richtig 
läuft?

gruß Frank

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.