Bussnelheid en -lengte
Bit timing
De bus snelheid is afhankelijk van de bus timing, die in CAN van de kristal gestuurde systeem kloksnelheid wordt afgeleid. Met behulp van een ‘baudrate pre-sclaler’ wordt deze systeem kloksnelheid teruggebracht tot een basis CAN kloksnelheid (=Time Quatum). Dat is nog niet de CAN bus snelheid want in CAN wordt, op deze basis, de timing van een bit opgebouwd:
- SYNC_SEG is 1 Time Quantum lang. Wordt gebruik om de verschillende nodes te synchroniseren. CAN-logica synchroniseerd op de bitflanken;
- PROP_SEG is programmeerbaar 1 - 8 Time Quanta groot. Het wordt gebruik om signaalvertraging over het netwerk op te vangen;
- PHASE_SEG1 is programmeerbaar 1- 8 Time Quanta groot. Het wordt gebruikt om op- en neergaande flankfouten te compenseren en kan tijdens synchronisatie dynamisch verlengd worden. Deze dynamische synchronisatie kan tussen 1 en 4 Time Quanta ingesteld worden. Dit wordt met Synchronisation Jump Width (SJW) aangeduid;
- PHASE_SEG2 is ook programmeerbaar 1- 8 Time Quanta groot. Het wordt ook gebruikt om op- en neergaande flankfouten te compenseren en kan tijdens synchronisatie juist dynamisch verkort worden (negatieve SJW).
- Op het sample punt worden 3 samples genomen (halve Time Quantum afstand), waarvan de meerderheid de waarde bepaald;
- De totale bit timing mag tussen de 8 tot 25 Time Quanta groot zijn.
Met deze waarden kan het exacte sample punt nauwkeurig bepaald worden: een laat sample punt maakt een maximale bus lengte mogelijk, een vroeg sample punt maakt tragere op- en neergaande bit flanken mogelijk en daardoor minder uitstraling en verstoringen. In het algemeen gesproken is een bus timing die zoveel mogelijk Time Qunata bevat én waarbij het sample punt op circa 80% van de totale bit tijd ligt, het beste. De uiteindelijke gewenste bus timing wordt in de standaard Timing Registers 0 en 1 van de CAN-controller geprogrammeerd.
Bitstuffing
De CAN-bitstroom is gecodeerd volgens de Non-Return-to-Zero (NRZ) methode. Dit komt er op neer dat tijdens een bit tijd een bit constant dominant (‘0’) of recessief (‘1’) is en dus niet wijzigt. De CAN-logica maakt echter gebruik van flanken om de datastroom te synchroniseren, zie de bovenstaande bit opbouw. Hierbij is het wel noodzakelijk dat er voldoende flanken in de stroom voor komen. Om die reden zal de CAN-controller na vijf opeenvolgende dezelfde ‘0’-en of ‘1’-en automatisch een tegengesteld bit aan de datastroom toevoegen. De ontvangende CAN-controllers weten dat en zullen dus na vijf dezelfde bits het volgende bit weer uit de stroom verwijderen. Dit mechanisme wordt bitstuffing genoemd. De gebruiker merkt hier verder niets van, maar bitstuffing heeft wel een (beperkte) invloed op de datasnelheid.
Bus lengte
Bij klassieke seriële verbindingen is de lengte van de bus niet zo van belang: wat aan de ene kant verzonden wordt komt (vroeg of laat) aan de andere kant wel aan. Het principe van arbitrage per bit, dat door CAN wordt gebruikt, vereist echter een vergelijking tussen de locale bitniveaus van alle nodes die binnen een bepaalde tijdsinterval per bit over de bus zijn verdeeld. Zoals de voor de signaaldistributie in de bus vereiste signaalvoortplantingstijd in verhouding is met de lengte van de bus (circa 5 ns/m), zo wordt ook de benodigde duur van een bit-interval verlengd conform de mate waarin de lengte van de bus toeneemt. Een andere node moet immers, tijdens arbitrage en later bij de acknowledge, binnen de bittijd reageren. Hierdoor is de lengte van de bus beperkt.
De maximale buslengte en de maximale bitsnelheid zijn dus omgekeerd evenredig. Houdt er rekening mee dat (afwijkende) fysical layers, repeaters en dergelijke de totale vertagingstijd (soms fors) vergroten en daarmee de maximale buslengte verder beperken.
Standaard bus timing en lengte
Het zal duidelijk zijn dat het bepalen van de juiste bit timing een hele opgave kan zijn. Uitgaande van standaard physical layers en standaard bus lengtes heeft de CiA de volgende standaard bus snelheden, en bijbehorende bus timing, vastgelegd.
CANopen index | Baudrate | Maximale bus lengte | BTR0 | BTR1 |
---|---|---|---|---|
BTR0/1 = Bus Timing registerwaarden voor NXP 82C200 @16Mhz x-tal | ||||
0 | 1000 kBit/s | 25 m | 00h | 14h |
1 | 800 kBit/s | 50 m | 00h | 16h |
2 | 500 kBit/s | 100 m | 00h | 1Ch |
3 | 250 kBit/s | 250 m | 01h | 1Ch |
4 | 125 kBit/s | 500 m | 03h | 1Ch |
5 | Gereserveerd | |||
6 | 50 kBit/s | 1000 m | 09h | 1Ch |
7 | 20 kBit/s | 2500 m | 18h | 1Ch |
8 | 10 kBit/s | 5000 m | 31h | 1Ch |
In verreweg de meeste gevallen zullen deze waarden uitstekend functioneren. Bij maximale bus lengte, bussen met grote aftakkingen of toepassing van (meerdere) repeaters kunnen deze waarden wellicht niet toereikend zijn.