Forum: Mikrocontroller und Digitale Elektronik ADC LTC2445 - Funktionskontrolle / Ansteuerung über SPI


von rene p (Gast)


Lesenswert?

Hi Leute,
ich weiß net ob ihr den LTC2445 ADU kennt bzw. schon mit dem Erfahrungen 
habt. Aber ich habe hier jetzt gerade einen und würde den gerne via SPI 
- Ansteuern. Der ADU soll Master sein.
Jetzt mal ganz allgemein und unabhängig von SPI - ich will nur primär 
erstmal gerne Sehen, dass eine Clock vom ADU generiert wird:

Im Datenblatt steht, beim Power-Up wird der ADC auf 
Standard-Einstellungen (Kanal 1,1x-Mode,...)gesetzt
Und wenn man den Pin !EXT auf HIGH stellt, wird der interne Oszillator 
als Clock verwendet.
Außerdem steht da noch wenn man den Chip-Select auf LOW setzt fängt der 
ADC zu arbeiten an.
Also hab ich mal EXT auf HIGH und CS auf LOW gesetzt und natürlich VDD 
und GND angeschlossen. Ich würde jetzt sagen, dass an CLK ein 
Clock-Signal anliegen müsste. Dort liegt aber konstant 5 V an 
(Oszi-Messung)
Also irgendwie braucht der anscheinend doch noch einen Tritt oder ist 
kaputt...

Das Datenblatt findet sich hier
http://cds.linear.com/docs/Datasheet/2444589fb.pdf

Wo ist mein Denkfehler? Bzw. hat da jemand ne Idee?

von rene p (Gast)


Lesenswert?

Ah, die Clock ist nicht immer zu sehen, sondern immer nur alle 2  - 4 ms 
für die Dauer einer Datenübertragung (also 32 mal gehts auf Low runter)
Das scheint also doch irgendwie zu gehen

von rene p (Gast)


Lesenswert?

Hi nochmal,
ich hab jetzt mal probiert, die SPI Daten manuell einzulesen, weil ich 
es gerne verstehen würde. Mir ist klar, dass man das wohl in dem meisten 
Anwendungen mit der SPI-Einheit von nem Microcontroller macht :)

Wie auch immer, mein Versuch war folgender:
1
while(1)
2
  {
3
i=0;
4
  mPORTBClearBits(BIT_2);  //ADU aktivieren
5
6
  while(mPORTFReadBits(BIT_6)) ; // Warten auf fallende Taktflanke 
7
  while(!mPORTFReadBits(BIT_6)); // Warten auf steigende Taktflanke
8
9
  while(i<32)
10
    {
11
    ausgabe[i]=mPORTFReadBits(BIT_7);  // Datenbit lesen
12
    while(mPORTFReadBits(BIT_6)) ;    // Warten auf fallende Taktflanke
13
    while(!mPORTFReadBits(BIT_6)) ;  // Warten auf steigende Taktflanke
14
    i++;  // Nächstes Bit
15
    }
16
  mPORTBSetBits(BIT_2); //ADU deaktivieren
17
  
18
for(i=0;i<=500000;i++) ; //Warten
19
}
Dabei gilt:
BIT_6 ist die externe Clock vom ADU
BIT_7 ist SPI
BIT_2 ist CS - und das wird anscheinend nur zum an und auschalten vom 
ADC-verwendet...

Irgendwie ist aber mein Ergebnis nicht plausibel :( - obwohl ich die 
Spannung am ADU nicht ändere bleiben nicht mal die ersten 2 MSBs 
gleich...und das kann ja irgendwie nicht sein
Fang ich mir hier irgendwelche Bit-Verschiebungen ein?
Ich dachte, dass kann ich abwenden, in dem ich den ADU nach jeder 
Konversation abschalte...

von rene p (Gast)


Lesenswert?

Die externe Clock vom ADU läuft mit 1 MHz.
Kann es sein, das die ALU da nicht schnell genug ist, um da mitzukommen?
Ich verwende das PIC-StarterKit von Microchip mit einem PIC32MX360?

von Niemand (Gast)


Lesenswert?

Hi,
warum erzeugst Du nicht selbst den Takt für die SPI. Ist in den meisten 
Fällen die bessere Wahl

von Purzel H. (hacky)


Lesenswert?

Der Controller sollte immer der Master sein. Alles andere macht wenig 
Sinn.

von rene p (Gast)


Lesenswert?

ja, die Herren, die die Platine fertigen lassen haben, haben das 
verbockt :/ - der eine PIN der dafür verantwortlich ist liegt auf 5 V 
und das ist eine winzig kleine Platine. Und des Ding gibts jetzt in 
x-facher Ausführung. Damit hatte ich gar nix zu tun :] - Aber mir wurde 
jetzt gesagt, ich soll mal schauen, was man da machen kann, dass es 
trotzdem geht. So wie ich die SPI-Architektur verstanden hab, sollte es 
doch eigentlich in beide Richtungen funktionieren...

Hex Oschi schrieb:
> Der Controller sollte immer der Master sein. Alles andere macht wenig
> Sinn.

Warum ist das so schlimm? Weil man die Übertragung der einzelnen 
Datenwerte schlecht voneinander unterscheiden kann?

von rene p (Gast)


Lesenswert?

Ist mein Code denn vom Prinzip her richtig? ?

von rene p (Gast)


Lesenswert?

ah egal, der Code ist einfach richtung und der uC ist mit 80 MHz einfach 
zu langsam um eine 1Mhz Clock und die zugehörigen Datenbits schnell 
genug zu erfassen.

Versteh zwar nicht genau warum, aber anscheinend braucht es mehr als 80 
CPU-Zyklen um einen Port viermal zu lesen :)

Werds über das SPI-Register machen.
Aber warum es ein Problem ist, dass der ADU der Master ist versteh ich 
nicht. Wenn Chips miteinander über SPI kommunizieren muss ja auch einer 
der Slave sein... :)

von Purzel H. (hacky)


Lesenswert?

Das ist richtig. Der Eine davon hat ja vielleicht noch was anderes zu 
tun und wuerde den Zeitpunkt gerne bestimmen. Wenn der Controller den 
Slave spielt, dann muss er hinreichend schnell pollen um keine Aenderung 
zu verpassen. Im wesentlichen muss der slave aufpassen dass er den 
Zeitpunkt der CLK Flanke mitbekommt, dann das Datenbit lesen.

von Niemand (Gast)


Lesenswert?

Hi,
im Prinzip ist auch ein Microcontroller als "Slave" nutzbar. Versuch 
doch mal, denn zeitkritischen Teil in Assembler zu machen. Sind ja nur 
ein paar Zeilen.

von rene p (Gast)


Lesenswert?

Niemand schrieb:
> Hi,
> im Prinzip ist auch ein Microcontroller als "Slave" nutzbar. Versuch
> doch mal, denn zeitkritischen Teil in Assembler zu machen. Sind ja nur
> ein paar Zeilen.

hihi, ich hab leider null Plan von Assembler :)

von rene p (Gast)


Lesenswert?

Mit SPI klappts nun wunderbar, auch wenn der Mikrocontroller Slave ist 
:)

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.