Ich habe eine Versuchsschaltung aufgebaut in der ein Mega8 mit einem Mega32 verbunden sind. Die Pins sind korrekt miteinander verbunden. Mega8 ist Slave. Der Bus arbeitet mit 125KHz, weniger geht nicht. s | m ----------- MOSI | MOSI MISO | MISO SCK | SCK SS | PB0 Master sendet die Daten, was mit einem Oszi sichtbar ist. Im Programm vom Slave habe ich noch zusätlich eine Kontrolle eingebaut. Pin1 am PortB soll ein Rechtecksignal generieren. Das ist nicht der Fall. Also muss der uC irgendwo hängen. Meiner Ansicht nach kann er das nur in der Routine "SPI_SlaveReceive". Das Bit SPIF wird also nicht gesetzt. Warum? Quellcode im Anhang.
Komisch, habe das Slave-Prgramm mit AVR Studio simuliert, es funktioniert. Ich habe den SCK-Takt des SPI und die "Daten" mit der Maus eingegeben indem ich die Bits am PIND verändert habe. Das Byte wird anschließend am PortD ausgegeben, so wie es sein sollte. Der Fehler liegt also in der Hardware. Vielleicht ist die Verbindung zu anfällig für EM-Strahlung? Es sind aber nur etwa 7cm Kabel beim SCK und MOSI, außerdem liegt der Takt bei 125KHz, was ja ziemlich unkritisch ist. Zum Verzweifeln, sitze schon seit gestern an diesem Problem.
Du hast mit einem Scope nachgeprueft, ob die Daten auch den Master verlassen ? SCLK stimmt ?
Ja, sowohl der Takt als auch die Daten liegen an den jeweiligen Leitungen an und der SS-Pin wird auch auf Masse gezogen und nach der Übertragung wieder auf VCC. Ich habe gerade entdeckt, dass im Master-Programm das Flag MSTR im Register SPCR zurückgesetzt wird. Das passiert sofort nach der Initialisierung. Jetzt habe ich gestern im Datenblatt gelesen, dass der Master auf Slave zurückgesetzt wird, falls der SS-Pin des Masters als Eingang konfiguriert ist und nicht an VCC anliegt. Das wird wohl der Fehler sein. Ich löte kurz um, mal schauen. Komisch ist ja nur, dass die Daten trotzdem gesendet werden.
So, habe den SS-Pin des Masters als Ausgang definiert. Jetzt wird das MSTR-Flag nicht mehr zurückgesetzt. Aber ansonsten hat sich nichts verändert. Kann doch nicht sein!
Hi Welche Taktfrequenz benutzt du? Der SPI-Clock darf maximal 1/4 der Taktfrequenz des Slave-Controllers betragen. MfG Spess
Ich brauche Vorschläge, wie man den Fehler finden kann. Bin mit meinen Ideen am Ende.
Na, der Inhalt des slaves wird ja rausgeschoeben, wenn der Master was reinschiebt. Kannst du das verifizieren ? Schreib mal 0x55 beim slave ins SDR Register und schau ob das bein Master ankommt. Falls ja, ist nur das Problem, dass der Slave keinen Interrupt generiert. Alternativ koennte man im slave auch pollen, warten bis das SP Ready da ist., dann lesen und schreiben
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.