mikrocontroller.net

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


Autor: Steffen Hausinger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steffen Hausinger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Steffen Hausinger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.