PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MCP2515 CAN-Controller



arok
28.04.2007, 11:13
Hallo,

ich habe einen MCP2515 per SPI an einem AT-Mega128 hängen. Wenn ich aber die Config-Register beschreibe (z.B. CNF1) und wieder auslese, steht nicht das in dem Register was ich reingeschrieben habe. Die SPI-Kommunikation funktionierrt einwandfrei, das hab ich mir mit dem Oszi angeschaut, und wenn ich das Statusregister abfrage, kommt auch der richitge Wert, (Initialisierungswert laut Datenblatt) . Befor ich das Register beschriebe führe ich einen Softwarereset des MCP2515 durch, danach sollte er im Konfigurationsmodus sein. Hat von Euch einer eine Idee, was ich falsch mache?

MFG und Danke für Hinweise!

Vitis
07.05.2007, 22:32
Hallo, ich arbeite mit selbigem MCP2515 am Mega16 unter Bascom.
Die Kommunikation hab ich bei mir am Laufen,
um Deinen Code zu debuggen müsste man mal diesen
am Besten mal sehen, das machts leichter.

bluelight_electronic
11.05.2007, 14:23
Hi Arok,

welche SPI Geschwindigkeit hast den ? Probier einfach mal langsammer zu werden ... längere Leitungen unschöne Verlegung .. können auch solche probleme verursachen...

hatte bei mir mal solche Auswirkungen ;)

feitzi
29.05.2007, 08:34
Hallo
Ich quäle mich schon länger mit dem MCP2515 rum. aber ich bekomme kein laufendes Programm zusammen. In C gibt es genug hinweise, jedoch kann ich nichts damit anfangen.
Wenn jemand einen Code in Basic hat würde ich mich sehr freuen.

Schockwellenreiter
31.05.2007, 08:23
Hallo,

ich hatte ein ähnliches Problem, die CNFx Register wollten meine Werte auch nicht behalten. Ich habe die Register dann 2x hintereinander mit dem Wert beschrieben und dann hats geklappt.
Auch musst du bei einigen Headers, die im Internet sind, aufpassen, da stimmen teilweise die Registeradressen nicht.

MfG

feitzi
31.05.2007, 09:09
Danke für Deine Antwort

Die Registeradressen dürften gepeichert bleiben. nur Krig ich die Komunikation nicht hin.
Kannst Du eventuell mal mein Programm ansehen ??

Danke Manfred

Vitis
31.05.2007, 12:55
aha, nen ersten Fehler hab ich schonmal ausgekuckt:

Du verwendest Hardware SPI:
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Noss = 1 , Clockrate = 16 'Test mir Atmega wegen HardwareSPI

und weiter im Code dann:
Spiout Mcphilf , 1
Set Css

Das kann schonmal klemmen.
Der SPI hat nen Ausgangspuffer, den Du mit SPIOUT beschreibst.
Nun braucht die Übertragung aber n kleines Weilchen, weil die Daten
ja seriell rausgeschoben werden. Beim SPIOUT-Befehl bin ich mir nicht sicher,
ob das Programm an der Stelle anhält bis dieDaten raus sind, oder obs weiter läuft.
Es könnte in zweitem Falle dann geschehen, das Du den Chip Select setzt,
bevor die Daten dann auch wirklich drüben sind.

ich gehe da so vor:

Spdr = Mcphilf
Do
Loop Until Spsr.spif = 1
Set Css

Das Seelbige haste auch so ziemlich in allen Kommunikationsroutinen
für den MCP drinne. Das Spsr.spif hättste auch schon bei den
C-Sample-Codes sehen können ;)

feitzi
31.05.2007, 15:26
Hallo

Danke für Deine Antwort.
aber ich komm da nicht ganz mit.
Meinst Du eventuell so:

Sub Mcp2515_write_register(byval Adress As Byte , Byval Daten As Byte)
Print "Reg: " ; Adress ; " Val: " ; Daten
Reset Css
Spdr = Spi_write
Do
Loop Until Spsr.spif = 1
Set Css
Reset Css
Spdr = Adress
Do
Loop Until Spsr.spif = 1
Set Css
Reset Css
Spdr = Daten
Do
Loop Until Spsr.spif = 1
Set Css
End Sub

Gruß Manfred

Vitis
31.05.2007, 19:47
nö, eher so:
Sub Mcp2515_write_register(byval Adress As Byte , Byval Daten As Byte)
Print "Reg: " ; Adress ; " Val: " ; Daten
Reset Css
Spdr = Spi_write
Do
Loop Until Spsr.spif = 1
Spdr = Adress
Do
Loop Until Spsr.spif = 1
Spdr = Daten
Do
Loop Until Spsr.spif = 1
Set Css
End Sub

feitzi
06.06.2007, 21:01
Hallo

Ich habe es ausprobiert, so wie Du es beschrieben hast. Die Schleife Loop Util.... wartet auf eine Antwort, dass die Nachricht gesendet worden ist. Ich hoffe ich verstehe das richtig. Leider bekomme ich keine Antwort.
Was soll ich tun ??

Danke im voraus
Manfred

Vitis
07.06.2007, 12:10
nein, die do loop wartet darauf, dass das jeweilige byte auch tatsächlich über die SPI-Schnittstelle übertragen ist. Antworten gibts nur, wenn auch die entsprechende Anweisung an den MCP geschickt wird.

feitzi
07.06.2007, 23:51
Hallo
Am libsten ist es mir wenn ich mir ein Programm selbst erarbeite.
Aber in diesem Fall verzweifle ich langsam.
Kanst Du mir eventuell den Bascom-Code posten ??

Gruß Manfred

Vitis
08.06.2007, 12:26
schau mal dort:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=15245&highlight=

ich hab da mal nen Auszug aus nem Listing eines meiner Projekte gepostet.
Wie immer gibts keine Gewähr und Garantie dafür, aber zur Verdeutlichung
wies in etwa geht denk ich ists recht anschaulich.

feitzi
13.06.2007, 12:10
So ich habs geschaft. Der MCP2515 ist initialisiert, und sendet. Ein Modul von C-Control kann die Daten empfangen.
Jetzt will ich natürlich über den MCP2515 auch daten empfangen und auslesen. Über die Interruptleitung erkenne ich ob Daten in einem Buffer sind. Aber wie mit welchen registern bekomme ich jetzt die Daten raus. Und muss ich dann den interrupt löschen ??

Gruß
Manfred