Forum: Mikrocontroller und Digitale Elektronik MCP2515 (CAN) und SPI


von Steffen Hausinger (Gast)


Angehängte Dateien:

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

von A.K. (Gast)


Lesenswert?

Schlag nochmal nach was SPI eigentlich ist. Tip: es gibt keinen
Unterschied zwischen den Vorgängen "schreiben" und "lesen", es
passiert immer beides gleichzeitig.

von Steffen Hausinger (Gast)


Angehängte Dateien:

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

von A.K. (Gast)


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).

von Steffen Hausinger (Gast)


Angehängte Dateien:

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!

von Steffen Hausinger (Gast)


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

von Peter Dannegger (Gast)


Lesenswert?

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

von Steffen Hausinger (Gast)


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

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
Noch kein Account? Hier anmelden.