Hallo Ich versuche gerade einen CAN-Controller (MCP2515) mit einem AT90S2313 anzusteuern. Irgendwas stimmt aber mit der Kommunikation nicht. Teilweise kann ich die Register des MCPs zwar schon beschreiben, meistens klappt es aber nicht. Das merke ich daran, dass wenn ich ein Register beschreibe und es gleich wieder auslesen möchte, das Byte nicht richtig gelesen wird. Zwischen den beiden Befehlen habe ich schon eine kleine Warteschleife (testweise 100ms) eingebaut - daran sollte es also nicht liegen! Klar gibts ne Menge Codebeispiele im Forum, aber die behandeln alle nicht die SPI-Schnittstelle, da bei den Beispielen die in Hardware vorliegt. Mein 2313 hat aber kein Hardware SPI. Kann sich jemand meinen Code einmal anschauen (siehe Anhang)? Im Hauptprogramm wird der Code wie folgt aufgerufen: SPI_Init(); // SPI initialisieren ... SPI_On(); // CS auf Low SPI_SendByte(0xAA); // Byte senden SPI_SendByte(0x55); // Byte senden SPI_Off(); // CS auf High Ich würde mich freuen, wenn mir einer von Euch weiterhelfen kann!! Vielen Dank im Voraus, Steffen
Schlag nochmal nach was SPI eigentlich ist. Tip: es gibt keinen Unterschied zwischen den Vorgängen "schreiben" und "lesen", es passiert immer beides gleichzeitig.
Hallo Ok, ich glaube ich weiß, was Du meinst: Beim Schreiben benutze ich die positive Taktflanke von SCK und beim Lesen die negative. Aber selbst wenn ich es ändere, also beim Lesen auch die positive Taktflanke nehme, funktioniert es immer noch nicht... Im Anhang mal einen Ausschnitt des Datenblatts des MCP2515 und was es zum Timing des SPI sagt. Viele Grüsse, Steffen
Ich meinte, dass es keinen Grund gibt, für Lesen und Schreiben getrennte Routinen zu verwenden. Ist eh der gleiche Vorgang. Oben aus Byte rausschieben, unten reinschieben und das Ergebnis retour. Aber die Lese-Flanke was auch falsch. Wie sind denn sie <spi.h> Macros definiert? Obacht übrigens bei diesem Code mit Tinys und Megas. Da darf ein abhängiges IN nicht direkt hinter einem OUT stehen, sonst wird Schrott gelesen (kann bei der Lese-Routine passieren, je nachdem wie der Compiler das umsetzt).
Hmm, ziemlich clever gedacht, dass mit dem gleichzeitigen Lesen und Schreiben! Ok, aber das ist dann ja mehr eine Feinheit und löst nicht mein Problem (wie Du ja auch schreibst). Im Anhang der SPI-Header. Stimmt, die Macros hatte ich gar nicht erwähnt. Ich hatte im AVRStudio alle Routinen getestet und es sieht alles so aus, wie ich es mir vorstelle. Nur irgendwo ist der Wurm drin, aber wo? Kann es am Takt des MCP liegen? Ich verwende beim AVR einen 10MHz Quarz, beim MCP einen 8MHz. Oder ist die SPI-Schnittstelle von diesem Takt unabhängig? Sie hat ja auch ihren SCK-Takt. Das Timing halte ich mit meinem 10MHz Quarz des AVR auf jeden Fall ein!
Also ich habe jetzt nocheinmal das komplette Datenblatt des MCP studiert. Ich bin der Meinung, alles richtig gemacht zu haben. Nur dass irgendwas nicht richtig sein KANN, merke ich ja. Ich habe den RESET-Eingang auf Vcc gelegt, ich resette zu Beginn meines Programms, ich warte etwas, damit sich der Takt des Oszillators aufbauen kann. Wo kann mein Problem bloß liegen? Hat hier jemand irgendeinen heissen Tipp für mich? Braucht ihr vielleicht noch weitere Angaben? Steffen
SCK_Low // Bit mit negativer Tatkflanke anfordern Byte=Byte+SI; // Bit übernehmen Du must nach SCK = High einlesen, mit low wird schon das nächste Bit ausgegeben. Peter
Hallo Peter Ja, den Tipp hatte mir A.K. oben auch unbewusst gegeben. Daran lags aber nicht. Ich habe nämlich endlich den Fehler gefunden: Die richtige Antwort wäre gewesen: Überprüf Dein Steckbrett und bau die Schaltung mal auf einem anderen Brett auf! Mein Steckbrett ist defekt. Mit dem Multimeter sieht zwar alles in Ordnung aus, aber auf dem einen Brett funktioniert es nicht, auf dem anderen dann aber schon. Und ich habe es mehrere Male hin und her gebaut - es funktioniert nur auf dem Anderen! Tut mir leid, dass ich Euch die Mühe gemacht hab. Deshalb vielen Dank für die Antworten!! Jetzt funktionierts endlich, puh! Nochmals vielen Dank! Steffen
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.