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
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?
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
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
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
@ 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
ich messe am Pin der Platine, der ist aber mit dem Beinchen des uC verbunden, habe ich geprüft. Gruß, Alex
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.