Tach allerseits, ich habe Probleme das bit-timing der CAN controller zu verstehen. So viel habe ich gerafft: Als erstes wird eine bit clock aus dem IO clock per prescaler erzeugt. Die längen der bit Segmente werden dann als natürliche Vielfache der bit clock angegeben. Die bitrate wird dann als Summe aller Segmentlängen berechnet. Des weiteren scheint es wohl Standard zu sein das sync Segment und die resync jump width auf 1 zu setzten. Nun ein Paar Fragen: Unter 19.4.3 im Datenblatt wird erwähnt, dass wenn der prescaler auf 0 steht der sample point zu früh kommt. Dies zeigt sich auch unter 19.12 Tabelle 19-2 16MHz 1MBaud 16TQ. Der sample point kommt nach 11 und nicht 12 TQs. Er liegt damit noch innerhalb des phase segment 1 obwohl er ersts danach stattfinden sollte. Ist das mit "This leads to a fail according the ISO16845 Test plan." unter 19.4.3 gemeint? Außerdem frage ich mich ob das überhaupt schlim ist, denn Atmel schreibt ja selbst, dass man den sample point verschieben kann um sich an die Gegebenheiten des Bus anzupassen. ZB lange Laufzeiten vs. hohe Datenraten. Außerdem habe ich nicht ganz verstanden warum es Sinn macht ein bit in mehr als 8 TQs aufzuspalten. Warum mehr nehmen als mann muss? Thor
Hat noch keiner hier die baudrate eines AVR CAN controllers eingestellt? Thor
Gast
#3044990
Hab es so gemacht: Für AT90CAN128 mit 16MHz Quarz -> SCLOCK == 8 führt nur zu einem anderen Prescaler! Der Aufruf erfolgt dann meist so für 250kb/s: CAN128_init(250,0,0);
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
Hoffe es hilft dir.
Ah ja, das ist gut. Ich habe momentan das Problem, dass ich wegen eines dämlichen UARTs mit hoher baudrate ein binäres Quarz verwenden muss (18,432MHz). Der CAN läuft auf 125kBaud. Das ist ekelig. Die nächste baudrate die man nach Atmel Vorschlag bekommen würde ist 128kBaud. Das ist deutlich zu weit daneben. Ich habe mal ein wenig rumgerechnet und bin auf folgendes Ergebnis gestoßen. Kannst du das mal verifizieren? Prescaler auf 21 und 7 bitclocks: 2 prs + 2 ph1 + 2 ph2 + 1 sync Gibt eine baudrate von 125.387baud. Das liegt 0,31% daneben. Sample point sollte bei 71,43% liegen. Eigentlich ziemlich gut. Wenns stimmt... Hier noch die Register settings: CANBT1 = 0x28 CANBT2 = 0x02 CANBT3 = 0x12 Thor
Gast
#3046115
Sorry, habe es nie selbst gerechnet. Die Werte stammen aus der Tabelle im Datenblatt. Benutze nur niedrige Baudraten und da passt es.
OK, ich werde dann einfach hier noch mal einen post drunter setzten, wenn ich Gelegenheit hatte es auszuprobieren. Das kann allerdings noch einen Monat dauern. Thor
Jap, geht. Thor
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.