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????
Schreib doch mal bitte kurz, was das für Register sind, hab das Datenblatt grad nicht zur Hand! Patrick...
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...
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.
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...
Die infos sind einfach zu Spärlich... Sorry, aber mit dem nassen Finger debuggen bringts nicht! Gruß, Patrick...
Hier ist die canreg_write und canreg_read Funktion
Hier ist das Hauptprogramm. In dem WOrd Doku befindet sich noch ein Bild. (Bild -> Empfang PEAK CAN Dongle)
Ist das Bild immer noch repräsentativ für das, was Du empfängst, oder hat sich das mittlerweile geändert?
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.
>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?
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???
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!
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???
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?
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???
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...
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???
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!
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!
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????
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.
wie ist der RST pin des SJA1000 besachaltet ? falls direkt mit Vcc dann wird kein richtiger Hardware-Reset durchgeführt!
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
Hier habe ich mal das Bild vom PEAK Dongle gepostet. Die empfangenen Botschaften sind unplausibel!
Hier stelle ich auch mal meine CAN.C Datei zur Verfügung. Vielleicht ist da auch noch ein Fehler.
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...
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.
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???
Wäre ganz nett, wenn Du mal beschreibst, woran es lag! Gruß, Patrick...
beschaltung reset pin siehe datenblatt, lohnt sich übrigens immer ganz zu lesen! neo
War das jetzt die Lösung? Irgendwie steh ich da grad auf der Leitung :) Patrick...
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??
Weiss jemand wie ich den ISA Slot per Software ansteuern kann??? (Windows2000). Da müsste es doch eine DLL geben oder???
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.