Hi! Weiss jemand woher ich ein Tool bekomme, womit ich die Baudrate für den CAN (SJA1000) berechnen kann? Gruß Freddi
z.B. 250Kbit/s --> mit welchen Werten muss ich das Register BTR0 und BTR1 laden (Taktfrequenz 8Mhz)?
nee, aber es gibt hier im Forum ein Beitrag von Mike Schaub, wo er seinen Quell-Code zur Verfügung stellt. Darin werden auch die Zeiten bzw. Werte für eine 125kbps-Kommunikation bei 16MHz beschrieben. Arbeitet der SJA auch mit Zeitquanten? Vielleicht hilft dir der Code ja etwas dabei. Es handelt sich beim MCP2515 (im Forum nach MCP oder 2515 suchen) und die CNF-Register. Wenn ich die Zeit finde (ist gerde etwas knapp), kann ich mal gucken, ob ich die Datenblätter dahingehend vergleichen kann. Gruß Rahul
relativ simpel... Soweit ich es verstanden habe, genauso wie beim MCP2515: Gegeben: Taktfrequenz: 8MHz => tCLK = 0,125µs CAN-Geschwindigkeit: 250kbps => Bitlänge = 4µs Laut Datenblatt (Kapitel 6.5.2.2) setzt sich ein Bit aus folgenden Segmenten zusammen: SyncSeg 1 tSCL tSeg1 1-16 tSCL tSeg2 1- 8 tSCL Somit mein Vorschlag: BRP = 1 (Takteilung durch 2, dadurch insgesamt 16 verfügbare Segmente im Bit) SyncSeg = 1 tSCL (fest) tSeg1 = 9 tSCL tSeg2 = 6 tSCL ---------------- 16 tSCL ======= Somit müsste BTR1 = 0x58 und BTR0 = 0x00. Müsste so funktionieren... Garantieren kann ich es dir nicht. Meiner läuft bis jetzt auch noch nicht (bisher nur die Parameter berechnet und die Ansteuerung in C realisiert). Gruß Rahul
Ich habs mir jetzt nicht ganz genau angeschaut, aber hier könnte was dabei sein: http://www.port.de/deutsch/canprod/content/sv_req_form.html http://www.esacademy.com/faq/calc/sja1000.htm
@Rahul ist es vielleicht möglich einblick in deine codes vom mcp2515 / 2510 zu bekommen? ich versuche mich auch gerade mit ihm. mfg tüddel
Bis jetzt habe ich nur den Code von Mike Schaub (http://www.mikrocontroller.net/forum/read-2-137064.html) quasi aktualisiert, und bin gerade am Testen (und auf der Suche nach nem Oszi...). Gruß Rahul
Hallo Rahul! Ich komme mit dieser Berechnung nicht klar. Ich verstehe die Berechnung nicht. SyncSeg 1 tSCL tSeg1 1-16 tSCL tSeg2 1- 8 tSCL Somit mein Vorschlag: BRP = 1 (Takteilung durch 2, dadurch insgesamt 16 verfügbare Segmente im Bit) SyncSeg = 1 tSCL (fest) tSeg1 = 9 tSCL tSeg2 = 6 tSCL ---------------- 16 tSCL ======= Somit müsste BTR1 = 0x58 und BTR0 = 0x00. Gibt es jemand der solch ein Tool besitzt wo dann die Berechnugn automatisch macht?
Super Seite! Danke ElMachel Gibt es auch ein Beispielcode wie sowas berechnet wird?
@Tüddel: Mein Code hängt... .. nicht nur hier hinten dran, sondern auch einfach so. Es passiert nichts (Oszi mit Logic-Analyzer gefunden....)
@Freddie: BTR0 und BTR1 sind die Register deines SJA1000. Wenn Du dir das Datenblatt ansiehst, gibt es da diverse Formeln zur der einzelnen Zeit-Segmente im CAN-Bit. Ich habe einfach die Segmentlängen von Mike Schaub übernommen, und auf die entsprechende Takt- und CAN-Bus-Frequenz umgerechnet. Gruß Rahul
@tüddel: Laut Logik-Analysator funktioniert zumindest die Kommunikation zwischen den beiden Controllern. Der MCP antwortet auf ein READ-Kommando... Jetzt stellt sich wohl die Frage nach der Konfiguration bei 24MHz und 125kbps. Da werde ich wohl auch mal das Tool herunterladen müssen... Schönes Wochenende! Rahul
Nabend Leute, ich bin grad dabei einen SJA1000 in Betrieb zu nehmen. Leider komme ich da irgendwie nicht weiter. Ich habe folgende Konstellation. ATMega16 mit 16MHz Takt SJA1000 mit 16MHz Takt PCA82C251 als Treiber (hier liegt der RS Pin auf GND) Als Gegenstelle habe ich einen CAN_USB Irgendwie bekomme ich die Baudrate nicht eingestellt. Bei 125kBaud hab ich folgendes eingestellt: BTR0 0x0f BTR1 0x14 leider bekomme ich sofort nach dem ersten Sendeversuch einen BusOFF. Ich habe schon mehrer Baudraten durchgetestet. Irgendwie haut das nicht hin. Wenn ich mir die Signale vor dem Bustreiber anschaue würde an sich die Bitlänge zu der Baudrate passen. Aber der CAN_USB sagt was anderes. Ich kann auch nichts empfangen. Die interruptbits bzw. auch die im Statusregister werden nicht gesetzt. Kann mir den jemand erklären wie ich die Baudrate einstelle oder ev. einen informativen Link posten. Vielleicht hat der eine oder andere eine Idee was es ev. sein könnte. Gruss, Schorsch.
Mein SJA1000 hatte die Macke dass ich den unbenutzten TX Ausgang nicht einfach unbeschaltet lassen durfte. Ein Pull-IP oder Pull-Down von 10k angeschlossen und das Problem war weg.
Hi, bist du sicher dass es der TX und nicht der 2 RX Eingang war. Ich teste es aber gleich mal. Ich habe grad noch mal nachgemessen. Meine Bitlängen passen doch nicht. Irgendwie sind diese um welten länger als dass was ich eigentlich einstelle. Mein Quarz schwingt aber mit 16MHz und ist an xtal1 und xtal2 angeschlossen. Entweder stelle ich komplett die falschen werte bei btr0 und btr1 ein oder ich habe hier ein grundsätzliches problem. Was mir grad noch aufgefallen ist dass ich auf der CAN_LOW leitung überhaupt kein signal habe wenn ich vom SJA1000 sende. Das ist doch seltsam. Ich hoffe nur dass der Treiber nicht defekt ist. Ich hab nähmlich grad keinen Ersatz da. Gruss Schorsch
Nabend Leute, jetzt hab ich alles geprüft. Bei CAN Low kommt jetzt auch ein Signal raus. Was ich als erstes festgestellt habe dass die eingestellt Baudtrate nicht stimmt. Meine Bitlänge ist kürzer als berechnet. Könnte dies ev. am 16MHz Quarz liegen???? Des weiteren habe ich festgestellt dass egal was ich Sende das signal auf dem Bus immer gleich aussieht. Kann sich dass jemand erklären? Ich habe jetzt meine komplette initialisierung geprüft und weiss nicht woran dass liegen kann. Hat jemand ein ähnliches Verhalten beobachten können? Gruss, Georg.
wie kommst Du auf die errechneten werte von btr0 un btr1? versuchs mal mit 0x43 und 0x1C
Hi, wie ich auf die Werte gekommen bin weiss ich auch nicht mehr. Ich habe heute Abend mal für 250kBaud mit BTR0 = 0x01 und BTR1 = 0x17 getestet. Mit deinen Werten habe ich eine Bitlänge von 8µsec. Die einzelnen Bits liegen aber 200µsec von einander weg. Was sehr seltsam ist dass auf dem Oszi die Message total seltsam ausschaut. Egal was ich versende ich sehe immer das gleich Muster. Im Anhang hab ich mal ein Oszi Bild angehängt. Zu sehen sind CANLOW und CANHIGH Signal. Ich verstehe das nicht. Bei mir sieht die komplette Nachricht so aus. Im Moment bin ich ziemlich ratlos. Gruss, Georg.
Hallo Georg X., hast Du bei dem CAN-USB die richtige Baudrate eingestellt ? Wie sieht die Initialisierung aus ? Was bedeutet für Dich "Bus-off" ? Was zeigen RX- und TX-Error-Counter des SJA an ? Gruss Otto
Hallo Otto, die Baudrate im CAN_USB ist 100% richtig. Mit Bus-Off mein ich das Bit 7 im Status Register da steht nach dem ersten Sendeverusch 0xC4 drin. Der SJA1000 ist in BasicCAN Mode initialisiert da hab ich keine RX- und TX-Counter. Die initialisierung sieht wie folgt aus: //SetPorts CAN_DATA_WRITE = 0x00; CAN_DATA_DIRECTION = PORT_INPUT; CAN_CONTROL_WRITE |= CAN_CS | CAN_RD | CAN_WR | CAN_RST; CAN_CONTROL_WRITE &= ~CAN_ALE; CAN_CONTROL_DIRECTION |= CAN_ALE | CAN_CS | CAN_RD | CAN_WR | CAN_RST; / CAN_CONTROL_DIRECTION &= ~CAN_INT; //reset SJA1000 after this SJA1000 is in Reset Mode CAN_CONTROL_WRITE &= ~CAN_RST; asm("nop"); CAN_CONTROL_WRITE |= CAN_RST; //set to reset mode for configuration fn_Read_SJA(CAN_CONTROL_R, &uc_Read_Data); uc_Read_Data |= 0x01; fn_Write_SJA(CAN_CONTROL_R, uc_Read_Data); //wait until SJA1000 in Reset mode fn_Read_SJA(CAN_CONTROL_R, &uc_Read_Data); uc_Timeout = 1000; while( ((uc_Read_Data & 0x01) != 0x01) || uc_Timeout <= 0 ) { fn_Read_SJA(CAN_CONTROL_R, &uc_Read_Data); uc_Timeout--; } if (uc_Timeout == 0) return 1; //Clock-Divider-Register setzen fn_Write_SJA(CAN_CLOCK_DIV_R, 0x08); //set acceptance mask and code to filter CAN-Massages fn_Write_SJA(CAN_ACCEPT_CODE_R, ACCEPTANCE_CODE); fn_Write_SJA(CAN_ACCEPT_MASK_R, ACCEPTANCE_MASK); // Bustiming-Register einstellen fn_Write_SJA(CAN_BTR0_R, BTR0_REG); fn_Write_SJA(CAN_BTR1_R, BTR1_REG); //Output Control Register einstellen fn_Write_SJA(CAN_OUTCONTRO_R, 0x1A); //set to normal mode fn_Read_SJA(CAN_CONTROL_R, &uc_Read_Data); uc_Read_Data &= 0xFE; uc_Read_Data |= 0x02; //activate receive interrupt fn_Write_SJA(CAN_CONTROL_R, uc_Read_Data); //wait until SJA1000 in normal mode fn_Read_SJA(CAN_CONTROL_R, &uc_Read_Data); uc_Timeout = 1000; while( ((uc_Read_Data & 0x01) != 0x00) || uc_Timeout <= 0 ) { fn_Read_SJA(CAN_CONTROL_R, &uc_Read_Data); uc_Timeout--; } if (uc_Timeout == 0) return 1; Ich denke dass sollte so weit ok sein. Ich hoffe ihr könnt mir weiter helfen. Gruss, Georg.
> fn_Write_SJA(CAN_CLOCK_DIV_R, 0x08);
Damit schaltest Du den Clockout-Pin aus und den Divider auf CLK/2 -
weshalb ?
Weshalb arbeitest Du nicht im PeliCan-Mode ?
Otto
; #define BTR0_125k 0x07 ; #define BTR1_125k 0x14 Das funktioniert bei mir mit 16MHz Otto
Morgen, den CLOCK Out benötige ich nicht. Deswegen ist der aus. Den SysClk divider könnte ich natürlich auf 1 stellen. PeliCAN - Mode kommt noch. Ich will beide Modi realisieren und hab halt mit dem BasicCAN angefangen. Deine Einstellung probier ich mal heute Abend mal aus. Vorausgesetzt ich komme hier früh genug ausm Geschäft raus. Kannst du dir den Signalverlauf auf den CAN-Leitungen erklären? Gruss, Georg.
Hallo Georg, > Kannst du dir den Signalverlauf auf den CAN-Leitungen erklären? nein - wenn Dein SJA aber kein "ACK" sendet, ist spätestens nach dem ersten gesendeten Frame von Deinem CAN-USB Feierabend und Du siehst sowieso nichts mehr. Daher: versuche mal, mit dem SJA1000 zu senden und prüfe, ob Du mit dem CAN-USB (ggf. nach Anpassung der Baud-Rate) empfangen kannst. Gruss Otto
Hallo Otto, genau dass probier ich doch schon die ganze Zeit. Aber ich bekomme beim Senden nur Errorframes. Da kann ich probieren so viel ich will. Ich denke ich habe da nen Fehler in der Verdrahtung oder in der initialisierung. Wenn ich die Register des SJA beschreibe und danach lese passt alles. Gruss, Georg.
Hallo Georg, es war nicht ganz klar, ob Du sendest oder empfängst.... 1. Zeige mal den Schaltplan. 2. Ist der SJA während der Parametrierung im Reset-Mode ? 3. Beendest Du den Reset-Mode durch schreiben von "0" in SJA_MODE ? 4. Setzt Du SJA_OUTCTR richtig ? Otto
Hallo, zu 1. Schaltplan hab ich grad keinen. Ist noch alles auf dem Steckbrett verdrahtet. Ich habe die Daten und Adressleitungen auf einen Port gehägt und die Steuerleitungen auf ein anderen Port. Alles direckt verbunden nur an der Reset Leitung habe ich einen PullUP drann. Das Lesen und Schreiben der Register funktioniert ja. zu 2. Der SJA ist währen der Parametrierun im Reset Mode. Siehe Code weiter oben. zu 3. Danach wird er auch zurück in Normal Modus gesetzt. zu 4. SJA_OUTCTR wird auf 0x1A gesetzt. Sollte auch passen. Kommunikation mit dem SJA1000 aus µC Seite funktioniert soweit. Nur nach Aussen auf den CAN kommt nichts vernünftig raus.
Hallo Georg, ich habe ebenfalls Daten und Adressleitungen an einem Port (Adressen werden über ALE "gelatched"). Der Transceiver ist der selbe. Das Programm ist allerdings in Assembler geschrieben. .equ CAN_OUTCTR = 0b00011010 ; SJA Daten Output .equ PELI_CLK = 0b11000111 ; SJA Daten PeliCAN,Komp Byp,CLK1:1 Im Register "OUTCTR" steht bei mir "0x1A" siehe oben. Im Register "CLK" ist noch der Komperator Bypass gesetzt. Gruss Otto
Hallo Otto, wie schaut es bei dir mit dem Oszillator aus. Ich habe z.B. einen 16MHz an XTAL1 und XTAL2 parallel 1mOhm und dann jeweils ein 22pF auf Masse. Den Rx1 habe ich an einem Spannungsteiler auf 2,5V gesetzt. Langsam weiss ich wirklich nicht mehr was ich noch falsch machen könnten. Ist bestimmt nur ne kleinigkeit die ich noch nicht beachtet habe. Gruss, Georg.
Hallo Georg, ich habe einen 16MHz Quarz mit 2 22pF-Kondensatoren ohne einen Widerstand - das ist aber nicht Dein Problem, denn der SJA arbeitet ja. Der "RX1" liegt bei mir an GND, der "TX1" ist offen RX0 geht an RX des Transtceivers TX0 an TX des Transceivers Widerstand 33k von RS des Transceivers nach +5V 120 Ohm Abschlusswiderstand zwischen CANH und CANL Fotos siehe: http://www.priuswiki.de/wiki/CAN-Display Gruss Otto
Nabend Leute, ich habs jetzt mit PeliCAN Probiert. Leider das gleiche ergebniss. Am Anfang des Frames wird der Pegel 200µsec lang auf Dominant gezogen danach folgen kurze rezessive signale mit der eingestellten Bitlänge alle 200µsec. Ist mein SJA1000 hinüber oder sehe ich die Bäume vor lauter Wald nicht. Weiss den jemand noch Rat? Gruss, georg.
Funktioniert Dein CAN-USB ? Was zeigen die Errorcounter ? Wie ist der Status ?
Hallo Otto, du wirst es nicht glauben es geht. Ich habe deine Einstellung mal übernommen PELI_CLK = 0b11000111 ; SJA Daten PeliCAN,Komp Byp,CLK1:1 Ich habe hier im PeliCAN Mode 0x88 reingeschrieben. Sollte eigentlich auch funktionieren. Scheinbar aber nicht. Das hätte ich gerne noch verstanden. Gruss, Georg.
Hallo Georg,
> du wirst es nicht glauben es geht.
ich vermute, dass nur Dein CAN-USB geht - was macht Dich so sicher ?
Wie hast Du es geprüft ?
Wenn dieses kein ACK sendet, dann kannst Du nur eine Botschaft versenden
und das war es dann.
Wichtig ist, dass Du Dir alle Register des SJA ansehen kannst.
Der SJA hat ein sehr hilfreiches Statusregister - das gibt deutliche
Hinweise auf die Fehlerursache.
Hast Du die Busbeschaltung überprüft - ist kein Dreher darin ?
Falls Du meinem Link gefolgt bist, hast Du evtl. den Lochrasteraufbau
gesehen. der ohne Probleme mit 500kBAUD und auch mit 1MBaud arbeitet.
Gruss Otto
hi, beim CANUSB kann ich einstellen ob ein ACK gesendet wird oder nicht. Ich kann im Moment so viele Nachrichten senden wie ich will. Die Beschaltung hab ich glaub schon an die 20 mal geprüft. Von deiner zu meiner Einstellung ist der gravierende Unterschied nur das Setzen des Komperator Bypass und dass du den ext. Clockausgang nicht abschaltest. Interessant wäre es zu wissen ob bei dir deine Applikation noch läuft wenn der Bypass und Clockout deaktiviert sind. Die Register im Fehlerfall hab ich mir noch nicht angeschaut. Werde ich aber müßen um das Verhalten zu verstehen. Gruss und Danke, Georg.
Hallo Georg,
Der Unterschied ist, dass Du RX1 auf UB / 2 gelegt hat
> Der "RX1" liegt bei mir an GND, der "TX1" ist offen
Deshalb muss ich den Comperator Bypass setzen.
Mein Controller arbeitet mit externem Clock und zwar dem, der aus
"CLKOUT" des SJA herauskommt.
Meinen RS232-CAN Umsetzer konnte ich im Zweifelsfall immmer am PKW
prüfen.
Damit have ich eine mehrminütige Log-Datei erstellt, mit der ich dann
das Verhalten der Schaltung auch am "Basteltisch" prüfen konnte.
Mir hat die Ausgabe der Register am meißten geholfen.
Wichtig: bevor Du irgendetwas abderes machst, musst Du zumindest im
PELI-CAN zuerst das Register beschreiben, das auf Peli-CAN umschaltet,
da sonst die Adressen nicht stimmen.
Gruss Otto
hi, ich hat den Fehler gefunden. Jetzt gehts auch mit meinen Einstellungen. Ist ganz schön peinlich.... :( Der Spannungsteiler am RX1 war gar keiner. Gingen beide Widerstände auf GND. Ich danke dir herzlich für deine Hilfe. Gruss, Georg.
Hallo Georg, hauptsache ist, dass es jetzt funktioniert ! Bis dann mal.... Gruss Otto
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.