Forum: Mikrocontroller und Digitale Elektronik SPI bei ATMEGA 32


von ill son (Gast)


Lesenswert?

Guten Tag,

seit einiger Zeit stellt sich mir folgendes Problem:

ich möchte einen AMEGA32 und einen 8-fach ADC von Analog Device per SPI 
miteinander verheiraten (uC Master, ADC Slave).
Nun funktioniert auch das Schreiben des ADC Controlregisters. Das weiß 
ich weil ich, wenn ich den ADC auslese, die richtige Adresse (zuvor 
geschrieben). Gesendet wird, allerdings kann ich das nur auf dem Oszi 
sehen, denn - und das ist mein Problem - im SPDR des uC kommt nix an, 
respektive Lesen desselben liefert immer Null.
Kann mir da jemand 'nen Tip geben?

Danke, Alex

von Hilfsbereiter (Gast)


Lesenswert?

Mein Tip:
Komm mal mit etwas genaueren Infos rüber.

von D. G. (mandrake)


Lesenswert?

Hatte ein ähnliches Problem bei einem ARM-Controller. Da war es das 
Slave-Select (SS) Signal das geschaltet sein muss. Villeicht liegt es 
bei dir auch daran?

von ill son (Gast)


Lesenswert?

Ahoi,

hier die etwas genaueren Infos:

Konfiguration SPI:

void SPI_masterinit(void) {

         //set MOSI, SCK and SS output, all others input
  DDRB |= (1<<DDB7)|(1<<DDB5)|(1<<DDB4);

         SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

PORTD &= ~(1<<TFS);                 //frame sync transmit low
SPDR = 0xD0;                        //send data ADC
while(!(SPSR &(1<<SPIF)));
mswait(1);
PORTD |= (1<<TFS);                  //frame synch transmit high
while(getchar_uart() != 0x6B);  //chill until a 'k' has been received
mswait(10);                         //10ms
PORTD &= ~(1<<RFS);                 //frame sync receive low
SPDR = 0x00;                        //send dummy
while(!(SPSR &(1<<SPIF)));
PORTD |= (1<<RFS);
tmp = SPDR;

das war's im Groben. Wie gesagt, im SPDR steht nicht das, was das Oszi 
sagt. Achso, es handelt sich um einen ADC AD7890. Ich hoffe, das war 
präzise.

Gruß, Alex

von Jörg X. (Gast)


Lesenswert?

Dir ist bewusst, dass Hardware-SPI nur dann empfangen kann, wenn es auch 
sendet?
SPDR auslesen und hoffen, dass was angekommen ist reicht nicht, schick 
einfach ein paar dummy bytes (0, 0xff, oder etwas das man auf dem Oszi 
besser erkennt (0x55, 0xf0 o.ä.).

hth. Jörg
ps.: bin gespannt, ob meine Glaskugel funktioniert :P

von ill son (Gast)


Lesenswert?

Hallo Jörg X,

ich sende doch ein Dummy (siehe Kommentar im Quellcode weiter oben). Und 
danach lese ich das SPDR aus, wie Du schon sagtest, in der Hoffnung, 
dass was drin steht. Wenn daran was falsch ist, lasse ich mich gern 
belehren.

Gruß, Alex

von Falk B. (falk)


Lesenswert?

@ ill son (Gast)

>das war's im Groben. Wie gesagt, im SPDR steht nicht das, was das Oszi
>sagt.

Misst du direkt am Pin vom AVR? Ist MISO auch richtig angeschlossen?

MFG
Falk

von ill son (Gast)


Lesenswert?

ich messe am Pin der Platine, der ist aber mit dem Beinchen des uC 
verbunden, habe ich geprüft.

Gruß, Alex

von Jörg X. (Gast)


Lesenswert?

mmh.- Da hab ich falsch getippt ;)
- Ist der SMODE Pin von dem AD7890 'richtig', d.h. an VCC, 
angeschlossen?
- stell mal auf SPI-'Mode1' 
("SPCR|=(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPHA);") das sieht dem AD.. 
DAtenblatt am ähnlichsten (Mode 2 sollte auch gehen).
- lies auch beide Bytes aus ;)
- wenn du #RFS und #TFS gleichzeitig ansteuerst, kannst du mit dem 
ersten Dummy-Byte den nächsten Kanal setzen.

hth. Jörg

von ill son (Gast)


Lesenswert?

vielen Dank, probier ich gleich aus. Das mit Lesen-Schreiben parallel 
hatte ich erst, bin dann aber "back to the roots", als es nicht lief, um 
erst mal die Ursache dafür zu finden. Ich tüftele noch ein bisschen, 
dann melde ich mich wieder - glücklich oder verzweifelt ;-)

Bis dahin, Alex

von ill son (Gast)


Lesenswert?

Ahoi,

ich nochmal. Also es läuft. Der Fehler lag allerdings woanders. Hatte 
mir bei der Ausgabe der Daten auf dem Terminal einen derben Schnitzer 
geleistet. Trotzdem vielen Dank für die schnellen Hinweise.

Gruß, Alex

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.