Forum: Mikrocontroller und Digitale Elektronik ATmega644PA und MCP2515 SPI Problem


von Remo H. (remoeggel)


Angehängte Dateien:

Lesenswert?

Hallo

Ich übe jetzt schon ca. 1 Woche an der Kommunikation zwischen 
ATmega644PA und MCP2515 mit SPI, herum.

Das Programm wurde in Atmel Studio 7 geschrieben und ist eigentlich ein 
Abbild vom MCP2515-Tutorial, der Seite:
http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515

Mein Programm Initialisiert der Reihe nach, SPI und dann den MCP2515.
Am schluss der Initialisierung des MCP2515 möchte ich zu Testzweck den 
Registerwert von "CNF1" an PortA ausgeben.

Leider ist die Ausgabe an PortA: 0b00000000 anstatt 0b00000111.

Daher schliesse ich auf ein Problem mit der SPI-Kommunikation.

Ich hab auch schon mit einem Oszilloskop jede einzellne SPI übertragung 
der MCP2515 Initialisierung angeschaut und notiert (PDF).
Es müsste eigentlich soweit alles OK sein.

Beim verwendeten CAN-SPI Board habe ich folgende switches, zur 
konfiguration der SPI-PORT-Pin auf ON geschaltet: 3, 5 und 8.
Somit ist die PIN-Konfiguration:
PB0 -> /CS
PB5 -> MOSI
PB6 -> MISO
PB7 -> SCK

Was auch noch speziell ist, dass vom CAN-SPI Board die /CS-Leitung auf 
PB0 geht. Beim ATmega644PA vom HW-SPI der /SS Pin aber auf PB4 wäre.
Deshalb setze ich PB4 auf high in der SPI-Initialisierung, wiel das 
gemäss Datenblatt so sein muss für die korrekte Init. und danach wird 
PB4 auf low gesetzt und PB0 übernimmt die /SS funktion.
Dies sollte doch so ohne weitere Probleme funktionieren, da ja die Daten 
auch über MOSI mit SCK raus gesendet werden.

Ich finde einfach das Problem nicht. :-/

Könnte sich evtl. jemand mein Programm und die Angehängten Dokumente mal 
ansehen ob ein Problem besteht, dass ich nun schon seit sicher 4 Tagen 
übersehe? :-)

Besten dank schon im Voraus für die Aufgewendete Zeit.
Freundliche Grüsse
Remo

von Bastian W. (jackfrost)


Lesenswert?

Hi,

bei meinem AtXMega war der uC zu schnell mit der Initialisierung. Ggf 
war der Takt am MCP2515 noch nicht ganz da. Ich hatte daher eine 
Verzögerung von 10 ms vor dem CAN init gemacht.

Unter 
https://github.com/JackFrost80/Wasserzaehler-CAN-Modul/blob/master/CAN.cpp 
ist meine Init Routine für meine MCP2515, das lesen der Register sind 
noch Überbleibsel vom debuggen.

Hast du mit dem Oszillator mal den CLKOUT gemessen ? Setz den mal auf 
einen anderen Wert als der Startwert, dann siehst du ob der MCP2515 die 
Kommunikation auf empfängt und verarbeitet.

Gruß JackFrost

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

als Master sollte der /SS Pin immer als Ausgang konfiguriert sein.

MfG

von Remo H. (remoeggel)


Lesenswert?

Hallo Bastian und Christian

Danke für eure Tips.


Bastian W. schrieb:
> bei meinem AtXMega war der uC zu schnell mit der Initialisierung. Ggf
> war der Takt am MCP2515 noch nicht ganz da. Ich hatte daher eine
> Verzögerung von 10 ms vor dem CAN init gemacht.

Das habe ich doch mit:
1
_delay_ms(1000);
2
3
mcp2515_init();
auch gemacht und sogar 1000ms.

Christian S. schrieb:
> als Master sollte der /SS Pin immer als Ausgang konfiguriert sein.

Das ist er doch, mit:
1
DDR_CS   |= (1<<P_CS)|(1<<4);
2
PORT_CS  |= (1<<P_CS)|(1<<4);

Oder könnt Ihr mir die jeweiligen Tips nochmals genauer erklären?

Danke und Gruss
Remo

von Harry L. (mysth)


Lesenswert?

Remo H. schrieb:
> Das Programm wurde in Atmel Studio 7 geschrieben und ist eigentlich ein
> Abbild vom MCP2515-Tutorial, der Seite:
> http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515

Und warum verwendest du nicht das Original?

Das funktioniert jedenfalls.

http://www.kreatives-chaos.com/artikel/universelle-can-bibliothek
https://github.com/dergraaf/avr-can-lib

von Remo H. (remoeggel)


Lesenswert?

Hallo Harry

Das ist ja schlussendlich das selbe.
Es hat einfach noch ein bisschen Beigemüse.

Übrigens ist es ja das original, einfach viel Überschaubarer.
Aber wenn die SPI kommunikation nicht funktioniert wird es auch nicht 
gehen.

Gruss
Remo

von Remo H. (remoeggel)


Lesenswert?

Hallo Zusammen :-)

Ich hab soeben einen Geistesblitz gehabt und siehe da es funktioniert!

Das Problem lag wie so üblich zwischen den Ohren. ;-)

Der Reseteingang, sprich PIN PB2 war immer auf 0V gezogen.
Ich habe mich von der Beschriftung auf dem CAN-SPI Board verleiten 
lassen.
Dort ist eben der Negierte CS Pin schön mit /CS angeschrieben und da RST 
ganz normal angeschrieben ist (ohne /), glaubte ich man aktiviert RST 
mit high pegel.
Nach nochmaligem (nicht ersten mal) durchschauen des Datasheet's vom 
MCP2515 habe ich gesehen das RESET auch Negiert ist.

Nun habe ich PB2 vor der MCP2515 Initialisierung auf high gesetzt und 
siehe da ES GEHT!

Besten Dank allerseits für eure Bemühungen.
Freundliche Grüsse
Remo

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.