Ich habe mich in den letzten Stunden etwas reingelesen in diese interessante Materie.
Grundsätzlich muss man ersteinmal festlegen, in welcher Bertriebsart der Master und der Slave arbeiten soll.
Ich denke, für die meisten Anwendungsfälle (1Master 1Slave) genügt es wenn man ohne Chip-Selct arbeitet.
SS-PIN beim Master und beim Slave.
MASTER:
Wird als Ausgang konfiguriert.
Wird LOW, wenn Master was senden möchte.
SLAVE:
SS ist als Eingang definiert.
Slave bleibt so lange inaktiv, bis SS low wird
Diese Betriebsart wird im
"SPI Control Register – SPCR" festgelegt.
Bei der Grund -Initialisierung des Masters und des Slaves sind / können o.g. Einstellungen vorzunehmen. s.Datenblatt:
SPI_MasterInit:
; Set MOSI and SCK output, all others input
ldi r17,(1<<DD_MOSI)|(1<<DD_SCK)
out DDR_SPI,r17
; Enable SPI, Master, set clock rate fck/16
ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17
ret
SPI_SlaveInit:
; Set MISO output, all others input
ldi r17,(1<<DD_MISO)
out DDR_SPI,r17
; Enable SPI
ldi r17,(1<<SPE)
out SPCR,r17
ret
Überprüfe mal bitte Dein Programmcode, ob die Initialisierung genauso vorgenommen wurde? Ob die gleichen Bits in dem Register SPCR gesetzt wurden sind?
Wenn ich alles jetzt richtig vertstanden habe, dann kein ein Master immer Daten senden !!!, auch wenn kein Slave vorhanden ist, d.h. werden pausenlos Daten vom Master gesendet, dann hat man immer Pegeländerungen an: SCK MOSI und SS oder?
>Grundsätzlich wird der Slave immer mit auf Low-gehaltener /SS Leitung >aktiviert.
Ja das sehe ich auch so, dass der Slave immer mit einem LOW an SS aktiviert wird.
Ich habe etwas im Internet dazu gefunden, ich stell es Dir / Euch mal zur Verfügung.
Ich werde mir als nächstes einen MASTER programmieren,
Also als erstes: ich habe heute die bestellten neuen mcp2515 Tranceiver bekommen und gleich eingesetzt. Das wars aber nicht... Also weitersuchen
Die von dir übernommene Initialisierung für MASTER habe ich auch schon im Datanblatt gefunden. Die ist meiner Meinung aber falsch, denn es wurden 2 Dinge vergessen:
/SS wird dort nicht auf OUT geschaltet,
Am Ende wird SPIF nicht zurückgesetzt
Du hast ja selbst oben geschrieben, dass /SS Ausgang sein muss.
Was sagst du?
Ich werde jetzt mal das Steckbrett und die Quarze austauschen und neue ATMELS versuchen zu bekommen, vieleicht haben dir einen SPI-Fehler.
Das alles schreit nach diesem Murphy-Gesetz:
"Alles, was Du in Ordnung zu bringen versuchst, wird länger dauern und Dich mehr kosten, als Du dachtest."
Das mit den LEDs geht leider nicht. Die Frequenz am SPI ist viel zu hoch als das man was sehen könnte. Man würde ein Flackern garnicht wahr nehmen. Aber ich kanns trotzdem mal machen, vielleicht geht die LED ja irgendwann aus und dann weis man ob SPI abschaltet... Wahrscheinl. meinst du auch genau das
Was natürlich hier gut wäre: ein Oszi !
Wie meinst du denn das:
>> Eine von Avcc gegen PIN
>> und eine von GND gegen PIN
?
Ich habe normal die SPI-Leitungen angezapft mit je einem R und ner LED nach Masse.
Beim Senden an den Slave ist nun folgendes zu beobachten:
/SS leuchtet immer, halbe Leuchtkraft
MISO leuchtet nicht
MOSI leuchtet immer, sehr hell
SCK blinkt intervallmäßig kurz auf (alle 2 sek, wie programmiert)
Die 2 zu übertragenden Bytes werden ca. 3 mal übertragen, danach 2 Bytes Nullen und alles steht still...nur die Sende-LED blitzt normal weiter alle 2 Sek. Also muss das Problem Empfängerseitig liegen.
Hast du bei dir eine ähliche Schaltung, dass du das mal dort testen kannst?
Ich weis nicht woran es noch liegen könnte. Habe den ASM Code nochmal freundlicher gestaltet. Schaue ihn doch mal durch. Vor allem interssiert mich ob ich unten die Unterprogramme (Senden, Lesen,..) richtig habe. Eine C-Datei ist dabei, die funzt auf jeden Fall. Man müsste nur prüfen ob ich daraus den richtigen ASM Code generiert habe.
Lesezeichen