USB 2.0 heeft snelheden van 1.5Mbit/s en 12Mbit/s. Gemakshalve nemen we voor het vertalen van pakket lengtes naar 'bits' aan dat de bitsnelheid hetzelfde is (dat is niet altijd zo, denk aan USB3.0)
Een usb pakket kan makkelijk 64 bytes lang zijn, immers is de maximale grootte van een bulk endpoint op deze snelheid 64 bytes.
64 bytes * 8 = 256 bits (daar komen nog headers en checksums overheen)
1 bit tijd op 12MHz 83ns.
256 bits op 12MHz is 21.333 us.
Als je 256 bits verstuurd hebt en er max. een halve bit naast moet zitten, mogen de clocks dus maar 0.2% afwijken. In de praktijk zie je vaak ook een crystal nauwkeurigheid van beter dan 0.25% voor USB2.0FS. Enkele uCs hebben deze al ingebouwd zodat je geen external crystal meer nodig hebt.
Als je snellere protocollen maakt met langere pakketen (anders teveel overhead), betekent dat je crystal op den duur belachelijk nauwkeurig moet zijn. Om dat te verhelpen gebruikt men vaak met PLLs om de transmit/receive clocks te synchroniseren tijdens start van een pakket (hoewel lastig vanwege drift), maar ook dankzij de encoding techniek die gebruikt wordt (8b/10b encoding, manchester code, etc.).
Deze zelfde theorie kan je herhalen voor seriele UARTs. Echter is bij elke byte een synchronisatie (start) bit toegewezen, dus vanwege de korte tijdspan relatief fout tolerant.
Op veel controllers worden ook dividers van 4x of 16x gebruikt waardoor je een best hoge clock nodig hebt om een baud rate nauwkeurig te kunnen instellen. Denk maar aan baud rate 115200 (veel gebruikt); met een 16MHz clock kom je uit op division instellingen van:
-> 16M / 16 / 115200 = 8.68x
Stel je 8 in krijg je 125000 Baud (+8.5%)
Stel je 9 in krijg je 111111 Baud (-3.5%)
Tenzij je op een factor 4x kan samplen; of een fractional baud rate divider hebt; of een hogere clock, kan je eigenlijk niet op 115200Baud werken. Immers komt deze statische afwijking boven op de mogelijke afwijking van je kristal. Zoals gezegd, in de praktijk wil je max 1-2% afwijking hebben om met UARTs te werken. Daarom werden vroeger crystallen gebruikt zoals 14.7456 MHz gebruikt, want dat is exact 128x 115200Baud.
Tenzij beide controllers natuurlijk dezelfde fout hebben (bvb 2 AVRs tegen over elkaar), maar dan kan je eigenlijk niet meer spreken van 115200Baud maar draai je daadwerkelijk op 125000 of 111111Baud.
Een usb pakket kan makkelijk 64 bytes lang zijn, immers is de maximale grootte van een bulk endpoint op deze snelheid 64 bytes.
64 bytes * 8 = 256 bits (daar komen nog headers en checksums overheen)
1 bit tijd op 12MHz 83ns.
256 bits op 12MHz is 21.333 us.
Als je 256 bits verstuurd hebt en er max. een halve bit naast moet zitten, mogen de clocks dus maar 0.2% afwijken. In de praktijk zie je vaak ook een crystal nauwkeurigheid van beter dan 0.25% voor USB2.0FS. Enkele uCs hebben deze al ingebouwd zodat je geen external crystal meer nodig hebt.
Als je snellere protocollen maakt met langere pakketen (anders teveel overhead), betekent dat je crystal op den duur belachelijk nauwkeurig moet zijn. Om dat te verhelpen gebruikt men vaak met PLLs om de transmit/receive clocks te synchroniseren tijdens start van een pakket (hoewel lastig vanwege drift), maar ook dankzij de encoding techniek die gebruikt wordt (8b/10b encoding, manchester code, etc.).
Deze zelfde theorie kan je herhalen voor seriele UARTs. Echter is bij elke byte een synchronisatie (start) bit toegewezen, dus vanwege de korte tijdspan relatief fout tolerant.
Op veel controllers worden ook dividers van 4x of 16x gebruikt waardoor je een best hoge clock nodig hebt om een baud rate nauwkeurig te kunnen instellen. Denk maar aan baud rate 115200 (veel gebruikt); met een 16MHz clock kom je uit op division instellingen van:
-> 16M / 16 / 115200 = 8.68x
Stel je 8 in krijg je 125000 Baud (+8.5%)
Stel je 9 in krijg je 111111 Baud (-3.5%)
Tenzij je op een factor 4x kan samplen; of een fractional baud rate divider hebt; of een hogere clock, kan je eigenlijk niet op 115200Baud werken. Immers komt deze statische afwijking boven op de mogelijke afwijking van je kristal. Zoals gezegd, in de praktijk wil je max 1-2% afwijking hebben om met UARTs te werken. Daarom werden vroeger crystallen gebruikt zoals 14.7456 MHz gebruikt, want dat is exact 128x 115200Baud.
Tenzij beide controllers natuurlijk dezelfde fout hebben (bvb 2 AVRs tegen over elkaar), maar dan kan je eigenlijk niet meer spreken van 115200Baud maar draai je daadwerkelijk op 125000 of 111111Baud.