mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI bei ATMEGA 32


Autor: ill son (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hilfsbereiter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Tip:
Komm mal mit etwas genaueren Infos rüber.

Autor: D. G-s (mandrake)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ill son (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ill son (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ill son (Gast)
Datum:

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

Gruß, Alex

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ill son (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ill son (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.