Časování CAN sběrnice

Obecných informací o CAN sběrnici je na internetu mnoho i v češtině, srozumitelných informací o časování CAN sběrnice je v češtině jako šafránu. Pokusíme se tak problematiku trochu osvětlit.

V praxi při vývoji postačuje použít některou kalkulačku časování (bit timing calculator), dostupné jsou jak aplikace pro PC tak webowé aplikace. Velmi dobrá kalkulačka pro velkou rodinu řadičů/MCU a podobně je na stránce http://www.bittiming.can-wiki.info/. Nicméně je dobré těmto vypočteným číslům trochu porozumět.

Vysvětleme si teď některé pojmy, začněmě sychronizací. CAN bus je asynchronní, jednotlivé jednotky nemají společný hodinový signál. Aby se zpráva přijala správně, tedy vzorkoval se bit zprávy ve správném místě, je potřeba nějaká synchronizace, která eliminuje například různou přesnost hodinových signálů pro CAN controller (uzel). CAN bus používá dva druhy synchronizace, "Hard synchronization" a "Resynchronization".

Hard synchronization - je synchronizace příjmače na začátku rámce / zprávy v bitu Start of frame, kdy přechází sběrnice z recesivního do dominantního stavu. CAN FD pak používa ještě druhou hard synchronizaci, ale o tom jindy.

Resynchronization - je prováděna při přechodu recesivního do dominantního stavu s vyjímkou Start of Frame. Protože by mohlo dojít k situaci, že nějaká část rámce je tvořena dlouhou sekvencí bitů stejné hodnoty, používá se takzvaný bit stuffing, který vynutí vložení bitu s opačnou hodnotou a tedy i případnou resynchronizaci. Více informací k bit stuffingu najdete například zde.

Z uvedeného je zřejmé že synchronizace se vždy provádí jen na sestupnou hranu (z recesivní do dominantní) a je prováděna pouze jednou na bit a to pokud nastala podmínka sestupné hrany.

Time quantum - doba každého bitu CAN rámce je rozdělena na časová kvanta. Délka časového kvanta je určena děličkou hodinového signálu. Z těchto časových kvant jsou tvořeny segmenty a tyto segmenty pak vytváří jeden CAN bit.

Na uvedeném obrázku je nakreslen případ, kdy je jeden CAN bit tvořen 8 kvanty a sample point je na 75 procentech. Tedy v tomto případě za 6 kvantem.

SYNC_SEG: Synchronization segment
Tento segment se používá k synchronizaci uzlů na CANu. V tomto segmentu se očekává hrana signálu. Pokud jsou  změřeny jakékoli odchylky, buď předčasná nebo zpožděná hrana signálu, dojde k posunutí vzorkovacího bodu.

PROP_SEG: Propagation Time Segment
Segment se používá ke kompenzaci časů fyzického zpoždění v síti, jako je zpoždění šíření signálu (délka sběrnice), zpoždění budiče CANu a podobně. Délka segmentu musí být dvojnásobkem těchto časů zpoždění, aby se kompenzovalo zpoždění od odesílatele k příjemci a zpět k odesílateli. To je nutné zejména pro okamžik, kdy je odesílán identifikátor (arbitrážní pole) a uzly bojují o to, kdo získá přístup (menší hodnota identifikátoru, tedy dominantní bity 0 přebíjí bity recesivní 1).

Pro délku tohoto segmentu plat

Propagation delay >= 2 * [MAX(Tx node output delay+ bus line delay + Rx node input delay)]

Vypočtená hodnota se zvětšuje o 10 procent.

PHASE_SEG1,PHASE_SEG2:

Tyto segmety určují polohu bodu vzorkování a slouží ke kompenzaci fázových chyb hran signálu. K této kompenzaci dochází posunem tohoto bodu o hodnotu SJW (Synchronization Jump Width, někdy nazývána i RJW).

Na předchozím obrázku je patrný skutečný vstupní signál který je posunut - opožděn vůči ideálnímu stavu. Phase segment 1 je tak zvětšen o hodnotu SJW a reálný sample point je opožděn. Synchronizační segment následujícího bitu více odpovídá realitě.

Tento obrázek představuje opačnou situaci, skutečná hrana nastala ještě před synchronizačním segmentem. V této situaci dojde ke zkrácení Phase segmentu 2 o hodnotu SJW. Poloha reálného sample pointu se nemění (mění se však poměrové umístění v bitu). Opět synchronizační segment následujícího bitu více odpovídá realitě.

SJW má obvykle nastavenu hodnotu na 1 TQ (časové kvantum). Maximální hodnota je 4 TQ.

Obecně platí že:

SJW = 1 = malá tolerance chyby reálné rychlosti jednotlivých uzlů (stejně navržený HW- např: stejné krystaly, budiče, větší rychlosti sběrnice)
SJW = 4 = velká tolerance. (různý HW, malé rychlosti sběrnice)

Nastavená hodnota SJW je maximální možná hodnota, jak se může sample point pohnout vrámci Phase segmentu 1 a Phase segmentu 2.

Chceme li určit minimální SJW, lze postupovat například takto:

Platí že resynchronizace probíhá na sestupné hraně (z recesivní do dominantní úrově). Odtud je zřejmé že proběhne díky bitstuffingu nejpozději po 10 bitech. 

Musí platit:

10 * Tb(A) > 10 * Tb(B) + Tsjw(B)

Tb je doba jednoho bitu, lze ji určit měřením, výpočtem z tolerance krystalu

Tb(A) je pak doba bitu nejpomalejšího uzlu, bereme tedy v úvahu například uzel s nejhorší přesností hodin

Tb(B) je analogicky doba nejrychlějšího uzlu

10 je pak maximální doba mezi dvěma resynchronizacemi.

Praktický příklad:

  • rychlost CANu 1Mbit/s, tedy délka 1 bitu je 1μs.
  • tolerance oscilátoru/krystalu je 1,25%.
  • počet TQ na bit  = 8

Tb(A) = 1μs/100*101.25 = 1,0125μs

Tb(B) = 1μs/100*98.75 = 0,9875μs

Kvantum A= 1,0125μs / 8 = 0,1265625μs

Kvantum B = 0,9875μs / 8 = 0,1234375μs

Maximální rozdíl je tedy:

(10 * 1,0125μs) - (10 * 0,9875μs) = 0,25μs = 250ns

Počet kvant nutných pro SJW se pak určí takto:

#TQSJW > tSJW(B) / TQ(B)

#TQSJW - počet kvant

tSJW(B) - vypočtená hodnota času SJW

TQ(B) -doba kvanta nejrychlejšího uzlu

250ns / 0,1234375μs  = 250 / 123,4375 = 2,02531

Jelikož počet kvant je celé číslo a musí být větší, má SJW hodnotu rovnou 3.

Pro nastavení uvedených 4 typů segmentů platí tato pravidla:

  • Sync_Seg = 1TQ
  • 1TQ ≤ Prop_Seg ≤ 8TQ
  • 1TQ ≤ Phase_Seg1 ≤ 8TQ
  • 2TQ ≤ Phase_Seg2 ≤ 8TQ
  • 1TQ ≤ SJW ≤ MIN(Phase_Seg1 , 4 )