MCP2515 (CAN) und SPI

Gast #176754
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
Schlag nochmal nach was SPI eigentlich ist. Tip: es gibt keinen
Unterschied zwischen den Vorgängen "schreiben" und "lesen", es
passiert immer beides gleichzeitig.
Gast
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
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
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
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
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
Gast
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

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.