Softwarové USB

Z MAM wiki

Přejít na: navigace, hledání

Většina běžně dostupných AVR procesorů nemá hardwarové USB rozhraní. Je možné připojit k AVR speciální integrované obvody, realizující USB rozhraní, často jsou však dražší, než samotný procesor. Pro nízké rychlosti je možno realizovat USB i čistě softwarově s minimem dalších součástek s použitím knihovny V-USB Virtual USB.

Projekty používající softwarové USB:


Potřebný hardware je minimální, je však přece jen třeba vyřešit konverzi napěťových úrovní a volbu hodinového knitočtu. V zapojení lze použít malé Zenerovy diody 3,6V, třeba BZX83V003.6. (Nemáme-li právě po ruce správnou Zenerovu diodu, můžeme místo ní použít dvě LED v sérii. Správný úbytek nejspíš vytvoříme z nějakých červených, či z červené a zelené - nutno změřit!) Pak už jen zbývá správně zapojit USB konektory a kabely.


Informace o USB:

[editovat] Konfigurační soubor usbconfig.h

Tento konfigurační soubor je obsažen ve všech projektech, které používají softwarové USB. Mimo jiné popisuje, na které piny procesoru jsou připojeny USB signály D+ a D- a jaký je hodinový kmitočet. Tyto údaje budeme často chtít přizpůsobit. V knihovně verze 2010-07-15 je defaultně nastaveno toto:

#define USB_CFG_IOPORTNAME      D
#define USB_CFG_DMINUS_BIT      4
#define USB_CFG_DPLUS_BIT       2
#define USB_CFG_CLOCK_KHZ       (F_CPU/1000)

tedy USB signál D+ na bitu 2 portu D, USB signál D- na bitu 4 portu D a hodinový kmitočet odvozený z makra F_CPU, které tedy musí být při překladu správně nastaveno. Signál D+ musí být zaveden také na pin INT0, což je často stejný pin, jako bit 2 portu D. (Použít libovolné dva bity portu je možno od verze 2006-03-26. Dříve bylo pro D- možno použít jen bit 0 a třeba v AVRUSBBoot toto omezení zůstalo.)

Pro krystal 16MHz bychom mohli definovat přímo:

#define USB_CFG_CLOCK_KHZ       16000

a pro použití interního RC oscilátoru (ale jen s PLL) existuje velmi speciální hodnota, která dovolí až 1% odchylku:

#define USB_CFG_CLOCK_KHZ       16500

a pro použití interního RC oscilátoru u procesorů bez PLL existuje v posledních verzích knihovny ještě druhá velmi speciální hodnota, která také dovolí až 1% odchylku, a používá oscilátor divoce zkalibrovaný:

#define USB_CFG_CLOCK_KHZ       12800

Nechceme-li přivádět D+ na dva různé piny, musíme použít ten port a ten bit, který sdílí pin se signálem INT0, tedy například port D bit 2 u ATmega88 či port B bit 2 u ATtiny45. Pokud nám toto omezení vadí (třeba proto, že bychom u ATmega88 chtěli ISP konektor alternativně použít i pro připojení USB), je asi možné změnit používaný interrupt na PCINTn pomocí maker, která jsou naznačena na konci konfiguračního souboru (nad vhodnými hodnotami bude ale třeba se zamyslet):

/* #define USB_INTR_CFG            MCUCR */
/* #define USB_INTR_CFG_SET        ((1 << ISC00) | (1 << ISC01)) */
/* #define USB_INTR_CFG_CLR        0 */
/* #define USB_INTR_ENABLE         GIMSK */
/* #define USB_INTR_ENABLE_BIT     INT0 */
/* #define USB_INTR_PENDING        GIFR */
/* #define USB_INTR_PENDING_BIT    INTF0 */
/* #define USB_INTR_VECTOR         INT0_vect */

[editovat] Konfigurace USB v některých zajímavých projektech

Pokud se chystáme se stejným zapojením zkusit několik různých věcí, je dobré vědět, jak je USB nakonfigurované v projektech, které nás zajímají. (Je samozřejmě možné projekt přeložit s jinou konfigurací, ale vždy je dobré neměnit zbytečně mnoho a třeba i použít již přeložený program.)

projekt verze procesor MHz IOPORTNAME DMINUS_BIT DPLUS_BIT jumper
USBasp 2009-02-28 ATmega8, ATmega48 12 B 0 1
USBaspLoader 2010-07-27 ATmega88 a další 12,15,16,20 D 4 2 D7
AVRUSBboot 2006-06-25 ATmega8 12 D 0 2
BootloadHID 2010-07-29 ATmega8 12 D 0 2 D3

[editovat] Další implementace softwarového USB

Softwarové USB dle Application Note AVR309: AVR309: Software Universal Serial Bus (USB) pdf popis a AVR309.zip zdrojový kód (spolu s dalšími AppNotes obojí zde)


USBtiny

Osobní nástroje