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?
1
...
2
SPI_MasterInit();
3
4
/* one ADC measurement */
5
PORTB&=0xFE;// set SS to low
6
7
// set command to ADS8344: start bit, channel 0, single ended and no power down
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
> 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).
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:
1
unsignedcharMesswerte[16];//Zwischenspeicher für Messwerte
> 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.
@ 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.
> 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.