Forum: Mikrocontroller und Digitale Elektronik MCP2515 Initialisierung


von Georg B. (schorschi)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
für das mitlesen am CAN BUS (100Kb/s) habe ich mir eine Schaltung mit 
AtMega328P und MCP2515 und MCP2551 aufgebaut. Sowohl der ATMega wie auch 
der MCP haben einen eigenen 16MHz Quarz. Den Basiscode  (ursprünglich 
für ATMega8) habe ich hier aus dem Forum den ich nochmal anhand des 
Datenblattes und der Erklärungen von der Seite Kreatives Chaos gegen 
gelesen habe und aufgefallen ist mir nichts falsches. Der ATMega8 hat 
das gleiche Pinlayout wie der ATMega328p und war so gut zuersetzen - 
nahezu Pinkompatibel. Genutzt wird die Hardware SPI

Der Code läßt sich kompelieren und auch in den MC laden, leider schein 
es bei der Initialisierung schon nicht hinzuhauen. Die Ini... läuft so 
durch und der MC hängt sich auch nicht weg, daher vermutet ich das die 
Routinen auch gehen.
Nach der Initialisierung lese ich die Register aus und überall ist nur 
255 drin. nichts geht........wie auch wenn ich die Register nicht 
gesetzt bekomme.

Was mache ich falsch. ich brüte Stunde um Stunde schon seit Wochen und 
komm nicht dahinter.
Anbei der Code und ein Abbild des Terminals.

von Hans (Gast)


Lesenswert?

SPI-Problem? CPOL CPHA
Hardware? /CS

von Lutz (Gast)


Lesenswert?

Na ja, mit Bascom kenne ich mich nun leider gar nicht aus. Da aber die 
Resetwerte der Register üblicherweise Null sind, scheint es wohl schon 
an der grundlegenden Kommunikation mit dem Chip zu liegen.

'Initialisierung nochmal auslesen

  Mcp2515_read_register Caninte
  Print "CANINTE: " ; Canin

  Mcp2515_read_register Canintf
  Print "CANINTF: " ; Canin

Wenn Canin eine Variable ist, wird die jetzt bei allen Prints einfach 
rausgeschrieben und nie upgedatet? Auf die Schnelle habe ich jetzt nur 
ein mal gesehen, daß Canin in Mcp25_read_register den Wert vom Spdr 
zugewiesen bekommt.

von Georg B. (schorschi)


Lesenswert?

Hallo,
was meinst du mit SPI-Problem? CPOL CPHA - Hardware? /CS

Also CS wird immer genau wie im Code geschaltet
Allerdings kann ich mit CPOL CPHA jetzt nichts anfangen !!!!
Im Datenblatt des ATMega328 steht was von Data Modes, die in Bascom wohl 
durch Master = Yes , Polarity = Low , Phase = 0  eingestellt werden und 
so auch auf die Multi Slave hinweisen - da möchte ich später mal hin 
wenn 2 MCP am ATMega laufen..........

Hardware SPI
Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , 
Phase = 0 , Noss = 1 , Clockrate = 4       'Test mir Atmega wegen 
HardwareSPI

Gruß
Schorschi

von Hans (Gast)


Lesenswert?

Am Ende des Artikel ist eine Tabelle mit Erklärung.

http://de.wikipedia.org/wiki/Serial_Peripheral_Interface

von Georg B. (schorschi)


Lesenswert?

Hallo Lutz
mit dieser Routine wird die Variable immer nach Durchlauf mit den Werten 
neu beschrieben. Die Adresse von Caninte ( Const Caninte = &H2B )mit 
übergeben und in die Canin zurückgeschrieben

  Mcp2515_read_register Caninte
  Print "CANINTE: " ; Canin

  Mcp2515_read_register Canintf
  Print "CANINTF: " ; Canin


'--------------         MCP2515  lesen    ----------------------------
 Sub Mcp2515_read_register(byval Adress As Byte )
 Mcphilf = Spi_read
 Reset Css
 Spdr = Mcphilf
 Do
 Loop Until Spsr.spif = 1
 Waitms 2
 Spdr = Adress ----------> hier rein Caninte = &H2B
 Do
 Loop Until Spsr.spif = 1
 Spdr = 0
   Do
   Loop Until Spsr.spif = 1
   Canin = Spdr   ---------------> und hier zurück ???????????
 Set Css
 End Sub
'---------------------------------------------------------------------

oder interpretiere ich da was falsch ????????????
och muß sagen das das so in allen Beispielen aussieht die ich gefunden 
habe.

Gruß
Schorschi

von Georg B. (schorschi)


Lesenswert?

Hallo Lutz,
der Ansatz war schon mal ein super Tipp.
Wenn ich den MCP2115 aus dem Sockel nehme werden mit Print die gleichen 
Werte ausgeworfen.

Ein Ansatz zum suchen.

Gruß
Schorschi

von Georg B. (schorschi)


Lesenswert?

Hallo
und danke für die kompetente Unterstützung..........ich habs gefunden
Es war ein Hardware Verdrahtungsfehler (Mosi und Miso vertauscht).

Gruß
Schorschi

von Schorschi (Gast)


Lesenswert?

Hallo,
nachdem die Komunikation mit dem MCP2515 funktioniert stehe ich vor dem 
nächsten Problem. Der Empfang über Buffer0 geht einwandfrei, leider ist 
die Abfolge der Frames so hoch das Buffer0 es nicht allein schafft - es 
gehen mir Frames verloren. Mit meinen bescheidenen Englischkenntnissen 
konnte ich dem Datenblatt entlocken das ich bei setzen von Bit 3 = 1 
BUKT im Rxb0ctrl Register auch Frames auf Buffer1 bekomme wenn Buffer0 
gerade voll ist - Rollover. Nach Auslesen des Register Canintf sind dann 
tatsächlich auch die letzten beiden Bits gesetzt aber das Programm steht 
dann.

Die Frage ist kann ich die Register Rxb0ctrl und Rxb1ctrl in Bit 5 und 6 
(11 = Turn mask/filters off; receive any message) stehen lassen oder muß 
ich in der tat dann die Register Rxb0ctrl und Rxb1ctrl in Bit 5 und 6 
(01 = Receive only valid messages with standard identifiers that meet 
filter criteria )  Maske und Filter so einstellen das allen Frames durch 
gehen können.
Ich hatte in einem anderem Beitrag gelesen das der uneingeschränkte 
Empfang mit Buffer0 und 1 möglich ist. Ob der jenige aber Maske und 
Filter auf "0" gesetzt hatte oder nicht weiß ich leider nicht.

Kann mir da jemand weiter helfen ???????

vielen Dank
Schorsch

'-------------    MCP2515 Initialisieren 
------------------------------
 '**** CAN Sequenzen 
************************************************************
 Mcp2515_init:

 'MCP2515 per Software Reset zurücksetzen
 Mcphilf = Spi_reset
   Reset Css
   Waitus 10
   Spdr = Mcphilf
   Do
   Loop Until Spsr.spif = 1
   Waitus 10
   Set Css

 'einstellen des Bit Timings
 Print "einstellen des Bit Timings "

 'Einstellung für 100KBit
 Mcp2515_write_register Cnf1 , &H03
 Mcp2515_write_register Cnf2 , &HBA
 Mcp2515_write_register Cnf3 , &H07
 Print "einstellen des Bit Timings ...100KBits......OK"


 'Interrupt einstellen Buffer 0 und 1
 Mcp2515_write_register Caninte , &B00000011

 'Einstellen der Filter
 'Buffer 0: Empfangen aller Nachrichten
 'wenn Buffer 0 voll dann mit Buffer 1 empfangen durch setzen Bit 3 =1 
BUKT Rollover
 Mcp2515_write_register Rxb0ctrl , &B01100100

 'Buffer 1: Empfang aller Nachrichten
 Mcp2515_write_register Rxb1ctrl , &B01100000

 'alle Bits der Empfangsmaske löschen
 'damit werden alle Nachrichten empfangen
  Mcp2515_write_register Rxm0sidh , 0
 Mcp2515_write_register Rxm0sidl , 0
 Mcp2515_write_register Rxm0eid8 , 0
 Mcp2515_write_register Rxm0eid0 , 0

 Mcp2515_write_register Rxm1sidh , 0
 Mcp2515_write_register Rxm1sidl , 0
 Mcp2515_write_register Rxm1eid8 , 0
 Mcp2515_write_register Rxm1eid0 , 0

 'Einstellen der Pin Funktionen
 'Deaktivieren der Pins RXnBF Pins (High Impedance State)
 Mcp2515_write_register Bfpctrl , 0

 'TXnRTS Bits als Input schalten
 Mcp2515_write_register Txrtsctrl , 0

 'Device zurück in den normalen Modus versetzen
 Mcp2515_bitmodify Canctrl , &B11100000 , &B00000000

 Print "ende MCP2515_init "
 Return

von Schorschi (Gast)


Lesenswert?

Kleine Verbesserung Rxb0ctrl BUKT ist nicht Bit 3 sondern Bit 2

von Schorschi (Gast)


Lesenswert?

Echt keiner eine Ahnung ????

Gruß
Schorsch

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.