. : New eShop! - Mobilní verze - Pandatron.cz - Pandatron.sk - Diskuzní fórum - Zakázkový vývoj : .
 
Implementace USB portu na PIC16F628
18. března 2015 - 3:00 | Pandatron | Implementace USB portu na PIC16F628 | Komentářů: 2  

Implementace USB portu na PIC16F628

Open-source projekt softwarové implementace USB portu na 8-bitových mikrokontrolérech z řady PIC16F pomůže v případě požadavku na snížení ceny a malý objem přenášených dat.

Kolik z nás se alespoň jednou za život nesetkalo s mikrokontroléry PIC16F628? Přesto že se jedná o poměrně staré obvody, stále se řadí mezi jedny z nejpopulárnějších mikrokontrolérů společnosti Microchip. A stejně jako kdysi v případě PIC16F84, i tyto obvody pomohly celé řadě programátorů v jejich začátcích. Přesto že jsou dnes již dávno překonány, stále se používají v celé řadě aplikací, ve kterých není kladen požadavek na pokročilé funkce.

Kvůli podpoře moderních komunikačních rozhraní, jsou dnes stále častěji používány obvody s USB portem, jako jsou PIC18F4550 a PIC18F2550. Samozřejmě, ne jen pro jejich integrovaný USB port, ale i pro všechny ostatní prvky, dostupné v mikrokontrolérech řady 18F. Nicméně, i tak se najde celá řada jednodušších projektů, kde je například z důvodu ceny mnohem vhodnější použít staré PIC16F628. Jejich cena je obvykle až třetinová, ve srovnání s PIC18F2550.

Bohužel obvody PIC16F628/628A nemají na svém čipu integrovánu žádnou podporu pro USB rozhraní, takže jejich použití v projektech s USB portem je na první pohled prakticky nemyslitelné (tedy alespoň bez dalších obvodů). Ale co když využijeme implementace USB portu na úrovni firmware? Přesně to je cílem tohoto projektu ze serveru Lendlocus.

16FUSB představuje projekt softwarové implementace USB rozhraní s nízkou rychlost pro mikrokontroléry PIC16F628/628A. O veškerou komunikace se stará firmware, takže v obvodu není nutné žádné další obvody. Dále je k jádru 16FUSB možné implementovat i další protokoly, jako je například SPI, I2C nebo data z USB hostitele (PC) převádět přímo na piny mikrokontroléru PIC. Softwarová Low-speed USB implementace může být výbornou alternativou pro ty, kteří trvají na nižších výrobních nákladech projektu a současně nepožadují vysokou přenosovou rychlost.


Obr. 1: Ukázková implementace 16FUSB ve funkci Direct I/O

Celý projekt je jako open-source umístěn na serveru Google Code, na adrese: http://code.google.com/p/16fusb. Odtud si můžete zdarma stáhnout kompletní zdrojové kódy, stejně jako aktualizovanou diskuzi, errata a podobně. Jediné co je k tomu potřeba je účet Google.

Pro pochopení funkce firmwaru je nezbytná dobrá znalost USB protokolu, který však svým rozsahem značně přesahuje možnosti tohoto článku. Dobrý popis protokolu naleznete například na webu http://www.beyondlogic.org/usbnutshell/usb1.shtml. Jedná se o snadno pochopitelný text, pokrývající všechny základní pojmy nízké i vysoké úrovně protokolu.

Firmware (jádro)
Vývoj takového firmware není nijak triviálním úkolem, zejména s přihlédnutím k technickým omezením jednoduchého mikrokontroléru, jako je například uvedený PIC16F628/628A, především jeho rychlosti.

ObvodyPIC16F628/628A mohou pracovat s frekvencí až 20 MHz. Nicméně, každý instrukční cyklus trvá typ. čtyři hodinové cykly. To znamená, že ve skutečnosti obvod s 20 MHz krystalem běží pouze na frekvenci 5 MHz (20/4 = 5). Jednoduchým použitím krystalu s frekvencí 24 MHz můžeme ve firmware použít rychlost až 6 MHz. A vzhledem k tomu, že rychlost Low-speed USB portu je 1,5 Mbps, máme vždy k dispozici celkem čtyři takty (6/4 = 1,5), které nám pro zpracování každého bitu musí stačit. To znamená, že každý jednotlivý bit na USB sběrnici trvá přesně dobu čtyř instrukcí našeho PIC.

Přesto že se to na první pohled nemusí zdát, pouhé čtyři instrukce nám k enkódování/dekódování NRZI, vložení/vyjmutí a dokonce i ke kontrole konce paketu (EOP), naprosto postačují. Využijme k tomu hned několika zajímavých triků.

Obecně lze firmware, který byl napsán v jazyce assembler, rozdělit na dvě části: ISR a MainLoop.

ISR (Interrupt Service Rutinní) provádí následující operace:

  • Čeká na přenos dat začíná značkou Sync
  • Přijímá a ihned ukládá balíčky dat do vstupní vyrovnávací paměti (RX_BUFFER)
  • Kontroluje adresní řádek aby ověřil, že data jsou skutečně pro naše zařízení
  • Zkontroluje typu paketu (token či data)
  • Pokud se jedná o OUT nebo SETUP token, uloží PID balíčku, indikující původ data v následujícím balíčku
  • Odešle potvrzující paket (ACK) hostiteli
  • Odešle negativní potvrzení (NAK) v případě, kdy zařízení není připravené a vyžaduje odložení přenosu na pozdější dobu
  • Kopíruje data ze zásobníku RX_BUFFER do RXINPUT_BUFFER
  • Oznamuje MainLoop přes ACTION_FLAG, že data byla dekódována v RXINPUT_BUFFER
  • Pokud je paket typu IN Token, pomocí ACTION_FLAG ověřuje zda je odpověď připravena, zakóduje (v NRZI) a odešle celý obsah TX_BUFFER, které musí být předem připraveny (s bitovou výcpavkou nebo CRC)
  • Nastavuje ACTION_FLAG na volno, pokud není k dispozici více dat pro přípravu/odeslání


Obr. 2: Vývojový diagram ISR

MainLoop provádí následující operace:

  • Kontroluje ACTION_FLAG a zajišťuje správné zacházení s daty
  • Dekóduje data z RXINPUT_BUFFER do RXDATA_BUFFER
  • Volá VendorRequest a ProcessOut (pokud se nejedná o standardní požadavek) pro řízení přenosu vlastního kódu (funkce)
  • Vytváří tzv. vycpávky a CRC16 v odpovědi (TX_BUFFER)
  • Stará se o všechny standardní požadavky


Obr. 3: Vývojový diagram MainLoop

Hardware
Základní obvod 16FUSB vychází z typické konfigurace mikrokontrolérů PIC16F628/628A s krystalem a několika dalšími prvky, jak je vidět na obrázku. Napájení obvodu je bráno z napětí USB portu (5V). Diody D1 a D2 na datových pinech USB portu jsou Zenerky a zajišťují omezení napětí z PIC, neboť USB specifikace na těchto pinech definuje 3,3 V signály. Přesto že i bez těchto diod pracoval obvod bez problému, některé citlivější porty by vyšší napětí nemusely zvládnout. Rezistory R3 a R4 omezují proud datovými piny USB portu . Rezistor R1 je zodpovědný za identifikaci zařízení v PC.

Pin vstupu vnějšího přerušení PIC (RB0) je připojen na pin D+ USB portu. S jeho pomocí máme okamžitě k dispozici informaci o obdržené instrukci Sync (která zahajuje rutinní přerušení), stejně jako o všech ostatních částech. Pin D- je připojen k pinu RB1 mikrokontroléru a používá se téměř výhradně pro odesílání bitů (spolu s RB0), což je rozdíl od RB0, který datové bity přijímá a odesílá. Vzhledem k tomu, že USB port pracuje téměř celou dobu svého provozu s diferenciálním párem, budou linky D+ a D- prakticky stále v opačných logických úrovních. Jedinou výjimkou je instrukce EOP (konec paketu), při kterém jsou oba piny ve stav logické nuly. Tohoto stavu je s výhodou použito v případě pinu RB2, který je k datové lince připojen přes dvojici křemíkových diod D3 a D4. Tento pin je tedy vždy ve stavu logické jedničky, pouze s výjimkou okamžiku, kdy hostitel informuje o konci přenosu. Díky tomuto triku je možné kontrolovat EOP pouze jednoduchým čtením bitu RB2, tedy instrukcí „BTFSS PORTB, 2“. Pamatujte, že právě čas je to, co zde nemáme.

Při pohledu na schéma je jasné, že kromě pinů RB0, RB1, RB2 a hodinového vstupu jsou všechny ostatní I/O piny PIC dostupné k volnému použití v zákaznické aplikaci. Referenční implementace funkce Direct I/O je tedy velice jednoduchá.


Obr. 4: Schéma zapojení 16FUSB

Pokud by jste se v případě vlastní implementace 16FUSB setkali s problémem komunikace a to i v případě použití obou Zenerových diod na datových pinech, je pravděpodobné, že problém bude v přerušení, které nelze správně spustit. Všimněte si, že vstup vnějšího přerušení PIC je připojen přes vyrovnávací bufer - Trigger Schmitt. Z toho vyplývá, že vstupní úroveň napětí na tomto pinu musí být alespoň 0,8 x VDD. Některé USB porty však nemusí být tuto hodnotu schopny dodat. V tomto případě je nutné připojit napětí VDD PIC přes 1N4148 a stejně tak tuto úroveň napětí použít v pro pin D- (viz následující obrázek). Snížení napájecího napětí o 0,6V bude již pro správné použití 3,3V z USB portu stačit.


Obr. 5: V případě problémů je vhodné zařadit do obvodu diodu 1N4148

Závěr:
Uvedená softwarová implementace USB portu nemůže z důvodu náročných časovacích podmínek nikdy zcela nahradit vhodnou hardwarovou implementaci. Z toho důvodu se také nedoporučuje její použití v produktech, ale pouze jako studijní materiál nebo pro výrobu vlastních aplikací.


Obr. 6: Prototyp 16FUSB sestavený na vývojové desce

Projekt 16FUSB je dostupný jako open-source, takže na webové stránce autora jsou volně ke stažení kompletní zdrojové kódy i zkompilovaný hex ukázkové implementace I/O portů. Více informací o projektu je k dispozici na stránce 16FUSB - A USB 1.1 implementation for PIC16F628/628A.

Odkazy & Download:
Domovská stránka autora
16FUSB - A USB 1.1 implementation for PIC16F628/628A
USB in a NutShell
USB 1.1 Specification







GooglePlus1 FaceBook Twitter del.icio.us DiGG Google StumbleUpon Google Buzz Email RSS PDF Tisk

Komentáře (2):

Zobrazit starší 30 dnů (2)...



Název příspěvku: Vaše jméno: host
                 
  Zakázat formátování [Zakáže kódování a nahrazování smajlíky.]
Připojit soubory
reklama:
PU232C - převodník USB-UART, modul
Modul s obvodem CP2102 od Silicon Labs - převodník USB-UART pro vývoj a malosériovou výrobu.
od 190 Kč

Informace uvedené v článcích jsou platné v době jejich vydání a samotné články jsou určeny pouze jako zdroj informací. Autor článku ani správce webu nenesou žádnou zodpovědnost za případné újmy na majetku a zdraví. Názvy společností a výrobků, loga a další multimediální materiál mohou být ochrannými známkami příslušných společností.
RSS kanály: | |
+420 723 846 377
info@pandatron.cz
Všechna práva vyhrazena | mobilní verze | © Copyright 2000 - 2016 ISSN 1803-6007