SPI bei ATMEGA 32

Gast #696017
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
Gast #696174
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
Gast #696181
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
Gast #696191
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
Gast #696198
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
Gast #696206
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
Gast #696262
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren