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
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