MCP2515 (CAN) und SPI

Gast #176754
Lesenswert?

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
Angehängte Dateien:
Gast #176756
Lesenswert?

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
Angehängte Dateien:
Gast #176757
Lesenswert?

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).
Gast #176758
Lesenswert?

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!
Angehängte Dateien:
Gast #176759
Lesenswert?

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
Gast #176761
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren