Du musst das SPIF zurücksetzen.
Ist zwar C, aber das raffst du schonCode:SPDR = data; // wait for xmission to complete while (!(SPSR & (1 << SPIF))); // clear SPIF data = SPDR;![]()
Hallo
Mein CAN Controller (Slave) will einfach nicht funktionieren.
Vielleicht ist das SPI falsch konfiguriert. Wäre echt schön wenn jemand
helfen könnte. Das ganze ist auf nem Steckbrett aufgebaut. Hier der Code der im Mega8515 (Master) abgelegt ist:
; -------------------------- KONFIGURIEREN -------------------
ldi temp, 0b10100000 ; Output = SCK & MOSI
out DDRB, temp
ldi temp, 0b01010001 ; SPIEnabled, MasterMode, SPI Clock Rate=
; OSC/16 = 250kHz @ 4MHz OSC
out SPCR, temp
; ---------------------- per SPI was senden ------------------
cbi PortB, 4 ; /CS pull down
ldi temp, 0b00000010 ; WRITE-Instruction
rcall spiout
sbi PortB, 4 ; release /CS
; -------------------- SUBFUNKTION FÜR SENDEN ------------
spiout:
out SPDR, temp
wait_spi:
sbis SPSR,SPIF ; Transmission complete?
rjmp wait_spi
ret ; back...
Ich bin schon am verzweifeln, ich weis echt nicht wo ich den Fehler
suchen soll. Mein restliches Programm bin ich schon hundertmal
durchgegangen. Leider programmieren das alle bis auch mich in C.
Deshalb krieg ich auch von nirgendwo Hilfe. Ist doch zum heulen.
Du musst das SPIF zurücksetzen.
Ist zwar C, aber das raffst du schonCode:SPDR = data; // wait for xmission to complete while (!(SPSR & (1 << SPIF))); // clear SPIF data = SPDR;![]()
Disclaimer: none. Sue me.
und ich dachte schon das wärs gewesen... ich habs so gemacht:
spiout:
out SPDR, temp
wait_spi:
sbis SPSR,SPIF ; Transmission complete?
rjmp wait_spi
; SPIF is set
in temp2, SPSR
in temp2, SPDR ; release SPIF by reading Register
ret ; back to programm..
leider nicht geholfen, aber ich denke dass es einer von vielen Fehlern ist.
Dank Dir!
CS wird nicht als OUT geschaltet. Zumindest passt's nicht zu deinem Kommentar...
Disclaimer: none. Sue me.
Du meinst diese Zeile?
ldi temp, 0b10100000 ; Output = SCK & MOSI
SCK ist bit 7 und MOSI bit 5
beide = 1 = output
Oder hab ich was übersehen?
Port B.4 schaltet ein CS-Signal, momentan zwischen high-Z und Pullup. Mag sein, daß es ok ist. Sieht aber etwas wunderlich aus...
Disclaimer: none. Sue me.
ach so wenn du das meinst, dass VOR
cbi PortB, 4 ; /CS pull down
eigentlich noch stehen müsste:
sbi PortB, 4 ; /CS up
dann hast du recht. Das habe ich auch gerade bemerkt. Erst hoch , dann tief, am Ende wieder hoch. So muss es.
Ein weiterer schwerer Fehler ist:
Ich habe /SS auf Input gehabt.
Es muss aber Output sein. (Laut Datenblatt unlogisch)
Jetzt geht die CAN Verbindung. Nur ist wieder etwas komisch:
Das gesendete Byte wird ca. 12 mal übertragen (eben warens 15 Mal) danach steht die Übertragung still. Weis jemand Rat?
Wenn ich das Sendeintervall halbiere (halb so lange Pause zwischen dem Senden) werden doppelt so viele Bytes übertragen.... also etwa 24. Danach scheint die Verbindung wie unterbrochen...
Kann sein daß der CAN-Controller abschmiert? (Puffer voll, ...)
Disclaimer: none. Sue me.
Lesezeichen