Forum: Mikrocontroller und Digitale Elektronik Can Controller "SJA1000" Probleme mit Register


von Leo (Gast)


Lesenswert?

Kann jetzt mit dem PEAK CAN Dongle die Botschaften empfangen.
Aber die Botschaft entspricht nicht dem was ich gesendet habe!
Ich habe mal jetzt jedes Register ausgelesen und auf dem Display
dargestellt.
Mir ist da folgendes ausgefall:
Rigster 5, 10, 11, 12, 13 lassen sich nicht beschreiben bzw denn
reingeschriebebeb Wert auslesen.
Die anderen Register da habe ich keine Probleme. Meine schreib und lese
Routinen funktionieren ja.
Wenn meine Routinen falsch währen, dann könnte ich ja gar nichts
schreiben bzw. auslesen.
Ich habe sogar mal einen zweiten SJA1000 eingebaut, da tritt dies
genauso auf!
Hmmm....was kann ich da noch tun????

von OldBug (Gast)


Lesenswert?

Schreib doch mal bitte kurz, was das für Register sind, hab das
Datenblatt grad nicht zur Hand!

Patrick...

von OldBug (Gast)


Lesenswert?

Hast Du eigentlich mal die dump-Routinen eingebaut?
Poste doch mal das, was Du laut dump sendest, und das, was Du
Empfängst.
Mit "es kommt nicht das an, was ich gesendet habe" kann man doch nur
sehr wenig anfangen. Höchstwarscheinlich kommt nämlich genau das an,
was Du gesendet hast! Bedenke, daß verschiedene Register bits haben,
die man geseondert setzen/lesen muss. Der SJA1000 hat ausserdem in den
verschiedenen Modi (BasicCan/PeliCAN) ein unterschiedliches
Registermapping.

Gruß,
Patrick...

von Leo (Gast)


Angehängte Dateien:

Lesenswert?

Dies Betrifft folgende Register:
5,10,11,12,13
Zum Beispiel habe ich in die Register den Wert (Daten) 0x11
reingeschrieben. Wenn ich anschließend die Werte auslesen will,
dann erhalte ich bei m Register 5 den Wert 96dez..
Bei den anderen Register bekomme ich nur NULL raus.
Ich habe den PELI Mode nicht in Benutzung.
Register 10 bis 19 sind für das Senden von Nachrichten zuständig
und Register 4 und 5 für den Akzeptanzfilter.

von Leo (Gast)


Lesenswert?

Was mir da noch einfällt.
Ich habe den Chip Select vom SJA1000 direkt auf Masse gelegt.
Vielleicht muss ich den Chip Select auch noch über einen Portpin
ansteuern??? Hmm...

von OldBug (Gast)


Lesenswert?

Die infos sind einfach zu Spärlich... Sorry, aber mit dem nassen Finger
debuggen bringts nicht!

Gruß,
Patrick...

von Leo (Gast)


Angehängte Dateien:

Lesenswert?

Übersicht vom Aufbau

von Leo (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist die canreg_write und canreg_read Funktion

von Leo (Gast)


Lesenswert?

Hier ist das Hauptprogramm.
In dem WOrd Doku befindet sich noch ein Bild.
(Bild -> Empfang PEAK CAN Dongle)

von OldBug (Gast)


Lesenswert?

Ist das Bild immer noch repräsentativ für das, was Du empfängst, oder
hat sich das mittlerweile geändert?

von Leo (Gast)


Lesenswert?

Ich habe jetzt mal folgendes gemacht


Die Nachricht ID 125h rtr=0 dlc=2 Byte0=10h und Byte1=20h senden

In der Funktion canreg_write habe ich jetzt malfolgendes eingefügt:
  canreg_write (10,0x24);
  canreg_write (11,0xA2);
  canreg_write (12,0x10);
  canreg_write (13,0x20);
  canreg_writte (1,0x01);

Auf dem Peak DOngle kann ich jetzt eine ID sehen bzw DLC und Daten.
Aber die empfangene Nachricht entspricht nicht der gesendeten
Nachricht.

von Leo (Gast)


Lesenswert?

Hab sogar mal einen anderen SJA1000 eingebaut.
Immer noch das gleiche.

von OldBug (Gast)


Lesenswert?

>Auf dem Peak DOngle kann ich jetzt eine ID sehen bzw DLC und Daten.
>Aber die empfangene Nachricht entspricht nicht der gesendeten
>Nachricht.

Was kommt denn raus? Oder ist das Geheim?

von Leo (Gast)


Lesenswert?

Rauskommen müsste:
Die Nachricht ID 125h rtr=0 dlc=2 Byte0=10h und Byte1=20h

Die PEAK CAN Dongle Software zeigt mit einen riesen großen Identifier
an. Die Daten sind insgesamt 10 byte lang. Und bei der Datenläge
sehe ich 15.
Hab leider kein Bild dazu. Ich kann es heute abend mal ins Forum
reinstellen.
Hast du mal meine beiden Funktionen gesehen???
Was meinst du, wenn der Chip Select auf Masse liegt, beeinträchtigt
doch nicht meine Funktionen oder???

von neo (Gast)


Lesenswert?

gibt es für den SJA1000 einen richtigen hardware RESET? mal in der
initalisierung den richtigen mode (BASIC oder PeliCAN) setzen, da es
unterschiede in der addressmap gibt!

von Leo (Gast)


Lesenswert?

In diesem Register habe ich nichts getan.
Im Datenblatt steht, ich muss bei BASIC CAn das 8Bit vom
Register 31 auf NULL setzten.
Vielleicht sollte ich da noch tun.

Muss man dieses Bit setzten???

von OldBug (Gast)


Lesenswert?

Du brauchst die Bilder hier nicht reinstellen, schreib doch einfach
anstelle von "riesen groß" das, was da steht.
Ich versuche ja, Dir zu helfen, aber Du redest um den heissen Brei...
Hm, mal sehen, ob mir nicht zufällig doch noch was auffällt.
Bist Du denn sicher, daß der Controller im BasicCAN-Mode ist?

von Leo (Gast)


Lesenswert?

Hab wie gesagt in diesem Register nichts getan.
Ist das erforderlich das das BIT 8 auf NULL stehen muss???
Was meinst du zu meinen Funktionen???

von OldBug (Gast)


Lesenswert?

Nach nem Reset ist der CAN-Controller "irgendwo" und MUSS
Initialisiert werden! Also auf jeden fall den Modus selektieren und
Akzeptanzmasken/Filter setzen, Baudrate einstellen usw...

von Leo (Gast)


Lesenswert?

Ach so ok!
Das CDR.7 Bit (Register 31) muss ich beim BASIC CAN auf NULL setzten.
Wie muss ich das Register maskieren. Hab voll die denkblokade,
so dass ich die anderen Bits nicht beeinflusse???

von OldBug (Gast)


Lesenswert?

Clear Bit (CBI) geht so:
sfr &= ~BITx

Set Bit (SBI) geht so:
sfr |= BITx

Wenn das Register also "CDR" heist, dann würde ein 'CBI CDR, 7' so
aussehen:
CDR &= ~BIT7

BIT0 bis BIT7 sollten in den headerfiles schon als Makrios definiert
sein, ansonsten:

#define BIT0 0x01
#define BITx 0x0x
..
#define BIT7 0x07

Hoffentlich klappts jetzt!

von OldBug (Gast)


Lesenswert?

Achtung, tpepiheflr:
BIT0 bis BIT7 sollten in den headerfiles schon als Makrios definiert
sein, ansonsten:

#define BIT0 0x01
#define BITx 0x0x
..
#define BIT7 0x07 <-- #define BIT7 0x08

...so muss es natürlich lauten!

von Leo (Gast)


Lesenswert?

Ich kann es erst heute abend testen.
Ist dies wahrscheinlich der Fehler???
Das heisst wenn ich den Modus nicht auswähle, dann
befindet sich der CAN COntroller auf irgend einem Modús???
Angenommen: Ich tue den Mode nicht auswählen und
lese das register 31 aus. Dabei stelle ich fest dass das 8Bit auf
NULL steht, dann müsste sich doch der COntroller im BASIC CAN Modus
befinden oder nicht????

von Leo (Gast)


Lesenswert?

Wenn der SJA1000 mit Spannung versorgt wird, dann
ist der MODUS Basic CAN aktiv. (laut Datenbank)
--> das Bit CDR.7 (Register31) wird automatisch auf 0 gesetzt.
Das heisst das nicht unbedingt es an dem liegt.

von neo (Gast)


Lesenswert?

wie ist der RST pin des SJA1000 besachaltet ?

falls direkt mit Vcc dann wird kein richtiger Hardware-Reset
durchgeführt!

von Leo (Gast)


Lesenswert?

Hallo Neo!

Ich habe den RST Pin über einen 10KOhm Widerstand an VCC angehängt.
Ist das falsch????
Wie müsste der Reset angeschlossen werden???

So hab jetzt mal den Basic Can Modus aktiviert. Leider
gibt es bei den Registern 5,10,11,12 immer noch Probleme

von Leo (Gast)


Angehängte Dateien:

Lesenswert?

Hier habe ich mal das Bild vom PEAK Dongle gepostet.
Die empfangenen Botschaften sind unplausibel!

von Leo (Gast)


Angehängte Dateien:

Lesenswert?

Hier stelle ich auch mal meine CAN.C Datei zur Verfügung.
Vielleicht ist da auch noch ein Fehler.

von OldBug (Gast)


Lesenswert?

Das einzige, was mir da jetzt so auf die Schnelle am Sonntag morgen
auffällt, ist, daß Du "Remote Request" frames schickst.

Werde nachher noch mal reinschauen...

Patrick...

von LtData (Gast)


Lesenswert?

Ich hatte mal ähnliche Probleme, aber im Peli CAN Mode. Es hat mich zum
verzweifeln gebracht, da ich einfach keinen Fehler in meinem Prog
finden konnte (hatte sogar auch deswegen hier mal gepostet, aber keiner
konnte helfen)
Irgendwann habe ich mal den Platz für den Stack vergrößert und siehe
da, es ging! Dämlicher Fehler! Vielleicht liegts bei dir auch daran,
bei mir wurde teilweise ne komplette CAN Msg auf dem Stack gesichert
und die bestehen ja bekanntlich aus einigen Bytes (besonders im Peli
CAN Mode, die sind ja noch länger). Dann noch ein oder 2
Funktionsaufrufe geschachtelt und das hat den Stack dann wohl
gesprengt. Lustigerweise ist der MC nicht abgeschmiert, sondern immer
brav weitergelaufen - sonst wäre ich vielleicht schon eher drauf
gekommen.

von Leo (Gast)


Lesenswert?

So hab es endlich geschaft.
Ich kann jetzt Botschaften senden und empfangen!
Hab noch ne kleine Frage:
Was bedeutet eigentlich REMOTE REQUEST???
(bzw. Remote Betrieb)
Kann mir da jemand ein Beispiel dazu geben???

von OldBug (Gast)


Lesenswert?

Wäre ganz nett, wenn Du mal beschreibst, woran es lag!

Gruß,
Patrick...

von neo (Gast)


Lesenswert?

beschaltung reset pin siehe datenblatt, lohnt sich übrigens immer ganz
zu lesen!

neo

von OldBug (Gast)


Lesenswert?

War das jetzt die Lösung?
Irgendwie steh ich da grad auf der Leitung :)

Patrick...

von Leo (Gast)


Lesenswert?

Hab den Reset PIN vom SJA1000 über einen 10KOhm Widerstnd
an VCC (+5V) angehängt. Das reicht aus!
So habe ich es auch beim AVR gemacht.
Es lag an der Funktion can_ini().
Ich Poste mal den Code!

hat jemand eine Ahnung was Remote Betrieb bedeutet??

von Leo (Gast)


Lesenswert?

Weiss jemand wie ich den ISA Slot per Software ansteuern kann???
(Windows2000).
Da müsste es doch eine DLL geben oder???

von LtData (Gast)


Lesenswert?

Remote TRansmission Request... Also ich hole mal nen bisschen aus:
Das Design vom CAN sieht eigentlich so aus, daß jeder Controller
eigenständig arbeitet und die anderen Controller nicht braucht. Er
sendet nur Nachrichten unter SEINER ID auf den Bus die auch andere
Controller interessieren (eigentlicht NICHT um anderen Befehle zu
senden) könnten. Jeder Controller den die Message interessiert, kann
daraufhin irgendwas tun.
Man sendet also NICHT "Relias 0x00FF einschalten" sondern "Taster
0xAA gedrückt" und Controller A empfängt dies und entscheidet VON SICH
AUS, daß das Relias geschaltet werden muss. Andere Controller fangen
mit dieser Information ggf ganz was anderes an.
Temperatursensoneren senden nach dieser Methode z.B. nur wenn sich der
Temperaturwert mal ändert (oder z.B. alle 10 Minuten) und informiert so
die anderen Controller darüber.
Und jetzt kommt Remote Transmission Request ins Spiel: Braucht jetzt
nen anderer Controller sofort den aktuellen Temperaturwert, sendet er
einen Remote Transmission Request, daß den anderen Controller an dem
der Temp Sensor hängt dazu auffordert seine Statusmeldung auf den Bus
zu senden.

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.