VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY
FAKULTA ELEKTROTECHNIKY A KOMUNIKAČNÍCH TECHNOLOGIÍ ÚSTAV AUTOMATIZACE A MĚŘICÍ TECHNIKY FACULTY OF ELECTRICAL ENGINEERING AND COMMUNICATION DEPARTMENT OF CONTROL AND INSTRUMENTATION
DIGITÁLNÍ VSTUPNĚ/VÝSTUPNÍ KARTA S USB KONEKTIVITOU DIGITAL I/O CARD WITH USB COMMUNICATION
DIPLOMOVÁ PRÁCE MASTER'S THESIS
AUTOR PRÁCE
Bc. MILAN KOŘÍNEK
AUTHOR
VEDOUCÍ PRÁCE SUPERVISOR
BRNO 2014
Ing. TOMÁŠ MACHO, Ph.D.
ABSTRAKT Diplomová práce se zabývá návrhem digitální vstupně/výstupní karty komunikující přes rozhraní USB pro společnost Honeywell spol. s r.o. – HTS CZ o.z. Hlavním cílem je eliminace zpoždění mezi přečtením aktuálního stavu vstupů a nastavením výstupů, které vzniká při používání současné komerční USB karty. Na začátku práce je provedena vstupní analýza s nástinem možných řešení. Dále je zaměřeno na USB specifikaci a možnosti implementace USB ovladačů na operačním systému Microsoft Windows. Hlavní část práce je věnována návrhu hardwaru karty. Karta má čtyři vstupně/výstupní porty po osmi linkách. Všechny porty mají zabudované ochrany proti nadměrnému proudu a ESD ochranu. Je použito optické oddělení pro USB. Napájení je řešeno přes USB a zároveň je umožněno připojení externího zdroje. Finální část se zabývá implementací firmwaru pro mikrokontrolér a naprogramováním ovladače karty.
KLÍČOVÁ SLOVA Digitální I/O karta, ARM, Cortex-M3, ASF, USB 2.0, SRAM, ESD, Digitální izolátor, libusbK, FreeRTOS, DLL
ABSTRACT The thesis deals with the design of digital I/O card with USB connectivity for Honeywell spol. s r.o. – HTS CZ o.z. company. The main objective is the delay elimination between reading the current state of the inputs and outputs setting which occurs on the actual used commercial card. Further initial analysis outlines possible solutions at the beginning of the work. One of chapters describes USB communication interface, including its communications protocol and USB driver implementation on the operating system Microsoft Windows. The digital card has four I/O ports consisting of eight lines. All ports have built-in protection against overcurrent and ESD protection. Digital isolator is used for USB. Power is supplied via USB, but it is optionally possible to connect an external power source. The last part of the thesis is focused on the card driver design.
KEYWORDS Digital I/O card, ARM, Cortex-M3, ASF, USB 2.0, SRAM, ESD, Digital isolator, libusbK, FreeRTOS, DLL
KOŘÍNEK, Milan Digitální vstupně/výstupní karta s USB konektivitou: diplomová práce. Brno: Vysoké učení technické v Brně, Fakulta elektrotechniky a komunikačních technologií, Ústav automatizace a měřicí techniky, 2014. 84 s. Vedoucí práce byl Ing. Tomáš Macho, CSc.
PROHLÁŠENÍ Prohlašuji, že svou diplomovou práci na téma „Digitální vstupně/výstupní karta s USB konektivitou“ jsem vypracoval samostatně pod vedením vedoucího diplomové práce a s použitím odborné literatury a dalších informačních zdrojů, které jsou všechny citovány v práci a uvedeny v seznamu literatury na konci práce. Jako autor uvedené diplomové práce dále prohlašuji, že v souvislosti s vytvořením této diplomové práce jsem neporušil autorská práva třetích osob, zejména jsem nezasáhl nedovoleným způsobem do cizích autorských práv osobnostních a/nebo majetkových a jsem si plně vědom následků porušení ustanovení S 11 a následujících autorského zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon), ve znění pozdějších předpisů, včetně možných trestněprávních důsledků vyplývajících z ustanovení části druhé, hlavy VI. díl 4 Trestního zákoníku č. 40/2009 Sb.
Brno
...............
.................................. (podpis autora)
PODĚKOVÁNÍ Rád bych poděkoval vedoucímu diplomové práce panu Ing. Tomáši Machovi, Ph.D. a panu Ing. Martinu Kravkovi ze společnosti Honeywell spol. s r.o. – HTS CZ o.z. za odborné vedení, konzultace, trpělivost a podnětné návrhy k práci.
Brno
...............
.................................. (podpis autora)
OBSAH Úvod
12
1 Vstupní analýza 1.1 Specifikace . . . . . . . . . . . . . . . . . . 1.2 Praktické zkušenosti . . . . . . . . . . . . 1.3 Komerční výrobky . . . . . . . . . . . . . 1.4 Mikrokontrolér . . . . . . . . . . . . . . . 1.4.1 USB . . . . . . . . . . . . . . . . . 1.4.2 Paměť dat . . . . . . . . . . . . . . 1.4.3 Digitální Vstupy/Výstupy . . . . . 1.4.4 Shrnutí . . . . . . . . . . . . . . . 1.4.5 Vývojové prostředí Atmel Studio 6
. . . . . . . . .
13 13 13 14 15 16 16 16 17 18
. . . . .
20 20 20 21 21 22
. . . . . . . . .
23 23 23 24 26 29 29 30 30 32
. . . . . .
34 34 34 35 36 36 39
2 Logický analyzátor 2.1 Režimy časové analýzy . . . . . 2.1.1 Sample mód . . . . . . . 2.1.2 Glitch mód . . . . . . . 2.1.3 Transitional timing mód 2.2 Formát ukládaných dat . . . . .
. . . . .
. . . . .
. . . . .
3 USB 3.1 Specifikace . . . . . . . . . . . . . . . 3.1.1 Topologie . . . . . . . . . . . 3.1.2 Elektrické parametry . . . . . 3.1.3 Komunikační protokol . . . . 3.2 Přístup k USB z Microsoft Windows 3.2.1 USB CDC . . . . . . . . . . . 3.2.2 USB HID . . . . . . . . . . . 3.2.3 USB Vendor Specific Class . . 3.2.4 Knihovna usblibK . . . . . . . 4 Návrh hardwaru 4.1 Mikrokontrolér . . . . . . . . . . 4.1.1 Hodinový generátor . . . . 4.1.2 SRAM . . . . . . . . . . . 4.1.3 Rozšíření vstupů/výstupů 4.1.4 Ostatní . . . . . . . . . . 4.2 USB . . . . . . . . . . . . . . . .
. . . . . .
. . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . .
. . . . . . . . .
. . . . . .
4.3
4.4
4.5
4.2.1 Galvanické oddělení USB sběrnice 4.2.2 Napájení přes USB sběrnici . . . Vstupně/výstupní porty . . . . . . . . . 4.3.1 ESD ochrana . . . . . . . . . . . 4.3.2 Nadproudová ochrana . . . . . . 4.3.3 Popis signálů . . . . . . . . . . . Napájení . . . . . . . . . . . . . . . . . . 4.4.1 Externí napájecí zdroj . . . . . . 4.4.2 Napájení mikrokontroléru . . . . Návrh DPS . . . . . . . . . . . . . . . . 4.5.1 Digitální vstupy/výstupy . . . . . 4.5.2 Mikrokontrolér a paměť SRAM . 4.5.3 USB . . . . . . . . . . . . . . . . 4.5.4 Napájecí zdroje . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
5 Firmware pro USB kartu 5.1 FreeRTOS . . . . . . . . . . . . . . . . . . . . . 5.1.1 Hlavní řídící úloha . . . . . . . . . . . . 5.1.2 Úloha pro ovládání I/O expandéru . . . 5.1.3 Úloha pro signalizaci stavu pomocí LED
. . . . . . . . . . . . . .
. . . .
6 Knihovna DigitalIOUSBCard 6.1 Vývojové prostředky . . . . . . . . . . . . . . . . 6.2 API rozhraní . . . . . . . . . . . . . . . . . . . . 6.2.1 Exportování funkcí z DLL knihovny . . . . 6.2.2 Obecná pravidla při návrhu API rozhraní . 6.2.3 Obecné funkce pro práci s knihovnou . . . 6.2.4 Konfigurační funkce . . . . . . . . . . . . . 6.2.5 Funkce pro přímý zápis/čtení . . . . . . . 6.3 Autonomní režim . . . . . . . . . . . . . . . . . . 6.3.1 Popis autonomního režimu . . . . . . . . . 6.3.2 API funkce pro zápis testovacího skriptu . 6.3.3 API funkce pro čtení výsledků skriptu . .
. . . . . . . . . . . . . .
. . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
. . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
. . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
. . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
. . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
. . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
. . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
. . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
. . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
. . . .
. . . . . . . . . . .
. . . . . . . . . . . . . .
39 40 41 42 43 44 45 45 48 48 49 51 51 52
. . . .
54 55 55 55 56
. . . . . . . . . . .
57 57 58 58 58 59 59 61 62 62 63 65
7 Závěr
66
Literatura
68
Seznam symbolů, veličin a zkratek
73
Seznam příloh
75
A Schéma Digitální I/O USB karty
76
B DPS Digitální I/O USB karty
81
C Obsah CD
84
SEZNAM OBRÁZKŮ 1.1 1.2 2.1 2.2 2.3 2.4 3.1 3.2 3.3 3.4 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 4.15 B.1 B.2 B.3 B.4 B.5 B.6
USB-DIO-32 od společnosti ACCES [2]. . . . . . . . . . . . . . . . Komunikace mezi uživatelskou aplikací a USB kartou. . . . . . . . . Blokové schéma logického analyzátoru [33]. . . . . . . . . . . . . . . Sample mód [33]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Glitch mód [33]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Transitional timing mód [33]. . . . . . . . . . . . . . . . . . . . . . Topologie sběrnice USB [25]. . . . . . . . . . . . . . . . . . . . . . . Zapojení USB konektoru [25]. . . . . . . . . . . . . . . . . . . . . . USB komunikace [16]. . . . . . . . . . . . . . . . . . . . . . . . . . Privilegovaný a uživatelský režim [31]. . . . . . . . . . . . . . . . . Krystalové rezonátory. . . . . . . . . . . . . . . . . . . . . . . . . . I/O expandér TCA6416A. . . . . . . . . . . . . . . . . . . . . . . . Zapojení konektoru pro JTAG. . . . . . . . . . . . . . . . . . . . . Zapojení ladicího portu, LED, jumperu pro vymazání Flash paměti a resetovacího tlačítka. . . . . . . . . . . . . . . . . . . . . . . . . . Zapojení USB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schéma zapojení portu PA pro dvě datové linky. . . . . . . . . . . . Výběr indukčnosti pro LM2575-5.0 [39]. . . . . . . . . . . . . . . . . Externí napájecí zdroj. . . . . . . . . . . . . . . . . . . . . . . . . . Napájecí napětí 3,3 V. . . . . . . . . . . . . . . . . . . . . . . . . . Napájecí napětí 1,8 V. . . . . . . . . . . . . . . . . . . . . . . . . . Digitální I/O USB karta - horní pohled. . . . . . . . . . . . . . . . Digitální I/O USB karta - dolní pohled. . . . . . . . . . . . . . . . . Rozlití zemnící plochy. . . . . . . . . . . . . . . . . . . . . . . . . . Doporučení pro návrh DPS s ADuM3160 [5]. . . . . . . . . . . . . . Doporučení pro návrh DPS s LM2575 [39]. . . . . . . . . . . . . . . Horní pohled Digitální I/O USB kartu. . . . . . . . . . . . . . . . . Dolní pohled na Digitální I/O USB kartu. . . . . . . . . . . . . . . Vnější horní vrstva. . . . . . . . . . . . . . . . . . . . . . . . . . . . Vnitřní vrstva určená pro rozvod signálů. . . . . . . . . . . . . . . . Vnitřní vrstva určená pro rozlití zemnící plochy. . . . . . . . . . . . Vnější spodní vrstva. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . .
14 15 21 21 22 22 24 24 27 31 35 37 38
. . . . . . . . . . . . . . . . . .
39 40 42 47 47 48 49 50 51 52 53 53 81 81 82 82 83 83
SEZNAM TABULEK 3.1 4.1 4.2
Popis signálů USB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Společné řídicí signály portů. . . . . . . . . . . . . . . . . . . . . . . . 44 Řídicích a datových signálů portu A. . . . . . . . . . . . . . . . . . . 44
SEZNAM KÓDŮ 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8
Makro pro export funkcí z DLL knihovny. . . . . . . . . . . . . Obecné funkce pro práci s knihovnou. . . . . . . . . . . . . . . . Funkce pro otevření a zavření zvolené Digitální I/O USB karty. Konfigurační funkce. . . . . . . . . . . . . . . . . . . . . . . . . Funkce pro přímé nastavení výstupů. . . . . . . . . . . . . . . . Funkce pro přímé čtení vstupů. . . . . . . . . . . . . . . . . . . Funkce pro zápis skriptu. . . . . . . . . . . . . . . . . . . . . . . Funkce pro čtení výsledků skriptu. . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
59 60 60 61 61 61 63 65
11
ÚVOD Tato práce se věnuje vývoji digitální vstupně/výstupní karty připojitelné přes sériovou sběrnici USB (Universal Serial Bus) vyvíjená pro společnost Honeywell spol. s r.o. – HTS CZ o.z., dále jen „Honeywell“. Společnost Honeywell se mimo jiných činností zabývá vývojem elektroniky a testováním. Pro zaručení spolehlivosti jsou vyvinuté různorodé testovací přípravky. V mnoha případech nemají žádnou vlastní inteligenci. Pro ovládání přípravku slouží digitální vstupy/výstupy. Pro automatizaci testování je přípravek připojen přes komerčně prodávanou 32kanálovou digitální USB kartu. Na počítači jsou poté spuštěny testovací skripty, které nejdříve musí vyčíst stav vstupů USB karty, vyhodnotit přečtená data a následně kartě poslat požadovaný stav výstupů. Toto způsobí nenulové zpoždění mezi fyzickou změnou na vstupech a nastavením výstupů karty, které je hlavně závislé na vytížení operačního systému. Většina běžně používaných operačních systémů Windows od společnosti Microsoft není určená pro aplikace vyžadující běh v reálném čase. Potom aplikace, běžící pod tímto operačním systémem, nemá zaručeno, že bude obsloužena v definovaném časovém intervalu. Výše popsaný problém lze vyřešit minimálně dvěma způsoby. V prvním případě použití operačního systému reálného času, např. RTOS od IntervalZero, který dokáže běžet pod systémem Windows. Druhou možností je přesunutí vlastní logiky do Digitální I/O USB karty. Testovací skript bude tedy nahrán a vykonáván přímo na kartě. Karta tak bude schopná nastavit výstupy karty požadovaným způsobem s minimálním definovaným zpožděním. Aplikace běžící na počítači bude použita pouze pro konfiguraci karty a čtení výsledků po vykonání skriptu. Následující kapitoly se budou zabývat návrhem právě výše popsané Digitální I/O USB karty. Karta bude mít 32 binárních vstupů/výstupů. Komunikace s aplikací běžící na počítači bude probíhat po sběrnici USB.
12
1 1.1
VSTUPNÍ ANALÝZA Specifikace
Před přistoupením k samotnému řešení problému, je třeba provést rozbor zadání a zjištění kladených požadavků na Digitální I/O USB kartu. Nejdříve byly po konzultaci s panem Ing. Martinem Kravkou vyspecifikovány základní vlastnosti Digitální I/O USB karty, které jsou shrnuty v následujících bodech: • Počet vstupů/výstupů: 32 TTL. • Vzorkovací frekvence: 1 kHz. • Komunikační rozhraní: USB. • Napájení: Přes USB. • Operační systém: Microsoft Windows XP/7. • Přibližná cena za hardware: cca 1000 Kč. • Počet vyráběných kusů: cca 10. • Další vlastnosti: Reakce v reálném čase (v řádu milisekund) na specifickou sekvenci na vstupech nastavením výstupů s definovaným zpožděním.
1.2
Praktické zkušenosti
Jak již bylo naznačeno v úvodu, tato Digitální I/O USB karta má být náhradou za používanou komerční kartu s označením USB-DIO-32-E od společnosti ACCES viz obrázek 1.1. Její základní vlastnosti jsou: • Vstupy/výstupy: Čtyři porty po osmi datových linkách. • Konfigurovatelnost portů: Porty jsou programově konfigurovatelné buď jako vstupní nebo jako výstupní. Pomocí jumperu si lze zvolit pull-up nebo pull-down rezistor. • Ochrana portů: Pouze použití budiče 74ABT245 pro každý port. • Konektor: Konektor na plochý kabel typu Header, 50 pinů, rozteč 2,54 mm, úhlový. • Komunikační rozhraní: High-Speed USB 2.0. • Napájení: Přes USB. Napájení z externího zdroje je umožněno až u vyšších modelů. • Cena: cca 2800 Kč. Od testovacích inženýrů, kteří pravidelně přichází do styku s touto komerční USB kartou, bylo zjištěno, že v závislosti na právě připojeném testovacím přípravku, je nutné individuálně nakonfigurovat porty buď jako vstupní nebo jako výstupní. Použití budičů 74ABT245 bez jakýkoliv ochran pro rozhraní, se ukázalo jako nevhodné.
13
Zejména při přepojování testovacích přípravků, se občas stávalo, že z nepozornosti byla karta chybně připojena. To mělo za následek poškození budiče a nutnou jeho výměnu. Samotné budiče jsou v SMD (Surface Mount Device) provedení, které stěžovali jejich výměnu. Posledním problémovým bodem je samotné napájení přes USB, které činilo u některých starších počítačů problémy. Tyto poznatky je tedy nutné zahrnout při návrhu Digitální I/O USB karty.
Obr. 1.1: USB-DIO-32 od společnosti ACCES [2].
1.3
Komerční výrobky
Digitální I/O USB karta bude používaná, jak na několika stolních počítačích, tak na noteboocích. Z tohoto důvodu nelze použít hotové řešení v podobě PCI (Peripheral Component Interconnect) karty namísto USB rozhraní. Například lze uvést kartu PCI-IDI-32AC od firmy ACCESS s optickým oddělením a cenou cca 4900 Kč [1]. Pro rozhraní USB vyrábí mnoho různých výrobců digitální I/O karty různých konfigurací. Většina z nich nesplňuje výše popsané požadavky (počet I/O, ochrany portů, cenu, . . . ) – i některé dražší karty mají datové linky vyvedené napřímo z mikrokontroléru bez jakýkoliv ochran, např. DLN-2 od firmy Diolan s cenou cca 1600 Kč bez ochranného krytu [13]. Společnou nectností většiny karet je způsob komunikace se samotnou kartu viz obrázek 1.2. Pokud uživatelská aplikace potřebuje reagovat na určitou sekvenci na vstupech nastavením výstupů, pak se musí cyklicky dotazovat přes API rozhraní na stav vstupů. Jakmile uživatelská aplikace rozpozná vstupní sekvenci, může nechat
14
nastavit výstupy karty do požadovaného stavu. Hlavním problémem je tedy vzorkování vstupních pinů karty, což způsobí zpoždění pro nastavení výstupních pinů karty. Zpoždění může být v řádu ms, ale v extrémních situacích i jednotek sekund.
Obr. 1.2: Komunikace mezi uživatelskou aplikací a USB kartou. Zdroje zpoždění jsou dva. První je způsoben samotným principem sériového rozhraní USB. Hostitel, většinou počítač, se v pravidelných intervalech postupně dotazuje všech připojených zařízení, jestli chtějí komunikovat – došlo ke změně na vstupech karty). Tento interval má velikost 1 ms pro Low-Speed USB (1,5 Mbit/s) a Full-Speed USB (12 Mbit/s) [12]. V případě použití High-Speed USB (480 Mbit/s) je interval zkrácen na 125 𝜇s viz obrázek 3.3. Druhým, mnohem závažnějším, zdrojem zpoždění je operační systém Microsoft Windows XP/7/8, respektive přepínání kontextu mezi aplikacemi. Tento operační systém není koncipován jako operační systém reálného času, tedy přepínání kontextu mezi aplikacemi je nedeterministické a není zaručena maximální doba pro přepnutí kontextu. Výsledkem je nemožnost jednoduše zaručit nastavení výstupů karty v řádu milisekund v závislosti na přijaté vstupní sekvenci.
1.4
Mikrokontrolér
Při výběru mikrokontroléru bylo zaměřeno na architekturu ARM (Advanced RISC Machines). Jedná se 32bitovou architekturu založenou na použití redukované instrukční sady RISC (Reduced Instruction Set Computer). Předností je velký výběr mikrokontrolérů s jádrem ARM od různých výrobců v široké škále výkonů a různých periférií. Před samotným výběrem vhodné ARM rodiny je třeba předem specifikovat základní požadované vlastnosti.
15
1.4.1
USB
Mezi nejdůležitější patří přítomnost sériového rozhraní USB, které by sice mohlo být řešeno pomocí externího obvodu (např. čipy od firmy FTDI), ale zbytečně by se zvyšovala cena a složitost návrhu DPS (Deska Plošných Spojů). Mikrokontrolér by měl mít zabudované USB rozhraní s alespoň Full-Speed přenosovou rychlostí.
1.4.2
Paměť dat
Důraz je taktéž kladen na velikost paměti dat, která bude využívána pro ukládání naměřených vzorků, zejména pro případ výpadku komunikace mezi počítačem a Digitální I/O USB kartou. Paměť by měla být schopna pojmout data, alespoň po dobu 𝑇 jedna minuta. Předpokládejme, že velikost jednoho vzorku 𝑆 bude 4 B (pro případ konfigurace všech čtyř portů jako vstupních) a vzorkovací frekvenci 𝑓vz 1 kHz, pak lze podle vzorce 1.1 spočítat minimální velikost paměti 𝑀 . Velikost paměti dat u samotných mikrokontrolérů se pohybuje okolo 30 kB až 100 kB v závislosti na zvolené rodině a výrobci. Z tohoto důvodu bude lepší zvolit externí paměť dat typu SRAM. 𝑀 = 𝑆 · 𝑓vz · 𝑇 = (4 · 1000 · 60) 𝐵 = 240 000 𝐵
1.4.3
(1.1)
Digitální Vstupy/Výstupy
Posledním důležitým požadavkem je počet I/O (digitální vstupy/výstupy). Digitální I/O USB karta bude mít čtyři porty, tedy celkem 32 I/O. Jednou z možností, jak připojit větší počet I/O, je použití adresového dekodéru a zamapování jednotlivých portů karty do adresového prostoru mikrokontroléru. Jistou komplikací v tomto případě je požadavek konfigurace jednotlivých portů buď jako vstupní nebo jako výstupní. Ve výsledku je na budiče portů kladeno příliš mnoho požadavků, které nelze splnit pomocí jediného obvodu: • Budiče musí být obousměrné – Možnost konfigurace portu jako výstupní nebo vstupní. • Budiče musí být třístavové se záchytnými registry (Latch) – V případě, že port je používán jako výstupní, tak budič si musí zapamatovat nastavení I/O, i když není právě adresován. • Budiče musí být typu level-shifter – Je nutné zajistit napěťové přizpůsobení mezi MCU (Micro Controller Unit), které má I/O typu LVCMOS (Low Voltage CMOS) a uživatelsky připojovanými periferiemi, které jsou typu TTL. • Budiče musí mít zatížitelnost, alespoň 10 mA.
16
• Dostupnost – Budiče tvoří rozhraní, ke kterému uživatel připojuje svoje periferie. I když budou mít jednotlivé I/O ochrany, může dojít k poškození samotného budiče. V tomto případě je vhodné používat běžně dostupné součástky. Většinu výše popsaných bodů splňuje například obvod 74LCX543 nebo 74LCX652 od firmy Fairchild až na malou dostupnost. Druhou možností je použití I/O expanderů s paralelním rozhraním jako je I82C55A. Jeho nevýhodou je vysoká cena (170 Kč v eshopu Farnell) a pouze 24 I/O, tedy by byly zapotřebí dva. Levnějším řešením je použití I/O expanderů se sériovým rozhraním, typicky I2 C (Inter-Integrated Circuit), SPI (Serial Peripheral Interface). Jejich nevýhodou je omezení maximální vzorkovací frekvence. Například pro I2 C je většinou používaná maximální přenosová frekvence 400 kHz. Použijeme-li 8bitový expandér, pak se bude muset přenést alespoň 20 bitů (1 B adresa, 1 B data, start a stop bit, 2xACK). Maximální frekvence, se kterou budeme schopni vyčítat jeden expandér je potom 20 kHz. Pro čtyři porty budou zapotřebí čtyři expandéry, které musíme adresovat po jednom. Ve výsledku bude vzorkovací frekvence pouhých 5 kHz, která vyhovuje sice zadání, ale mohla by být omezující pro některé v budoucnu zamýšlené aplikace. Poslední možností je připojení portů napřímo k mikrokontroléru. V tomto případě je maximální vzorkovací frekvence omezena pouze samotným mikrokontrolérem a použitými budiči. Budiče nemusí mít záchytné registry, což byl velmi omezující faktor při jejich výběru. Nevýhodou je nutný vyšší počet I/O mikrokontroléru a složitější návrh DPS. Byla zvolena tato varianta pro připojení portů. Minimální počet I/O musí být 70: • USB – 3 x I/O: Datové budiče a signalizace připojení k počítači na základě detekce napájecího napětí VBUS 5 V. • SRAM – 30 x I/O: Adresové, datové a řídicí vodiče 4 MBit paměti AS6C4008W. • Čtyři porty – 36 x I/O: 32 datových vodičů a 4 vodiče pro konfiguraci portu jako vstupního/výstupního. • LED – 1 x I/O: Signalizace připojení USB hosta.
1.4.4
Shrnutí
V mikrokontroléru se neočekává žádné výpočetně náročné zpracování dat. Obdobně není zapotřebí hardwarové FPU (Floating-Point Unit), jelikož se nepředpokládá významná práce s čísly v desetinné čárce. Vhodné je také vybírat mikrokontrolér z rodin již používaných ve společnosti Honeywell. V následujících bodech jsou shrnuty hlavní požadavky na mikrokontrolér: • USB rozhraní. • Alespoň 70 I/O.
17
• Zdarma vývojové prostředí. • Atmel ARM. Na základě těchto požadavků byl zvolen mikrokontrolér ATSAM3S2C, jehož základní vlastnosti jsou: • ARM rodina: Cortex-M3. • Architektura: Harvardská, 32bitová. • Maximální frekvence jádra: 64 MHz. • USB: USB 2.0, Full-Speed. • Počet I/O: 79. • Flash: 128 kB. • SRAM: 32 kB. • Programovací prostředky: JTAG Atmel SAM-ICE – Již zakoupený a používaný ve společnosti Honeywell. • Vývojové prostředí: Atmel Studio 6 – poskytované zdarma, bez omezení.
1.4.5
Vývojové prostředí Atmel Studio 6
Společnost Atmel nabízí zdarma komplexní vývojové prostředí Atmel Studio 6 založené na populárním vývojovém prostředí Microsoft Visual Studio. Atmel Studio je určeno pouze pro mikrokontroléry Atmel architektury AVR a ARM. Programovací jazyk lze zvolit buď C nebo C++ a jako překladač se používá GCC (GNU Compiler Collection). Nejvýznamnější součástí vývojového prostředí je softwarová knihovna označována jako ASF (Atmel Software Framework) [6]. V knihovně jsou implementovány ovladače jednotlivých periférií, komponenty a služby zjednodušující vývoj samotné aplikace. Programátor se tak může soustředit na vývoj samotné aplikace namísto studování několikasetstránkového manuálu k samotnému mikrokontroléru. Knihovna ASF je optimalizovaná tak, aby bylo možné snadno přecházet od jedné architektury k druhé. To má zejména význam, když je například z důvodu nedostatečnému výkonu nutné přejít na novější architekturu, což by jinak znamenalo, že by se musela významná část aplikace přepsat. ASF knihovna je rozdělena do čtyř částí: • Ovladače (drivers): Jedná se o nejnižší vrstvu ASF tvořící rozhraní mezi registry jednotlivých periferií a dalšími vrstvami ASF. • Komponenty (components): Poskytuje ovladače pro přístup k externím zařízením připojených k mikrokontroléru, např. displeje, senzory, paměti, · · · • Služby (services): Služby jsou již více aplikačně zaměřené. Jsou zde služby pro USB třídy, souborový sytém FAT, grafické knihovny apod.
18
• Desky (boards): Tato vrstva je určená pro vývojové kity poskytující mapování digitálních a analogových periférií na piny mikrokontroléru. Kromě on-line dokumentace je také k dispozici několik stovek ukázkových projektů znázorňující použití knihovny ASF.
19
2
LOGICKÝ ANALYZÁTOR
Digitální I/O USB karta se v základních rysech velmi podobá logickému analyzátoru, a proto byla zařazena tato kapitola pojednávající o jejich základních parametrech a principech. Kapitola je s drobnými úpravami převzata z mé bakalářské práce [19], která se zabývala implementací logického analyzátoru do FPGA. Logický analyzátor je měřicí přístroj určený pro zaznamenávání časového vývoje číslicových signálů. Slouží pro verifikaci a ladění hardwaru, embedded systémy reálného času, ale i interakce mezi softwarem a hardwarem. Na rozdíl od osciloskopu může mít až stovky měřících kanálů. Mezi základní parametry logického analyzátoru patří: • Počet vstupních kanálů • Hloubka paměti na kanál • Maximální vzorkovací frekvence • Možnosti nastavení triggeru Logické analyzátory většinou umožňují dva typy analýz: • Časová analýza: Hodinový signál je generovaný interně – asynchronní režim. • Stavová analýza: Hodinový signál je generován externě – synchronní režim. Na obrázku 2.1 je blokové schéma logického analyzátoru. Buď přímo v logickém analyzátoru, nebo v sondách bývá umístěn jednobitový A/D převodník – komparátor. Komparátor porovnává vstupní napětí s prahovým napětím. Pokud je toto napětí překročeno, pak se komparátor překlopí. Velikost prahového napětí bývá možné měnit a tím zajistit kompatibilitu s mnoha používanými standardy, např. TTL, CMOS 3,3 V. Vzorkovací obvod obsahuje komparátor a registr. Blok „logika spouštění“ vyhodnocuje spouštěcí podmínku z hodnot externích vstupů a z interních časových údajů.
2.1 2.1.1
Režimy časové analýzy Sample mód
Vzorkovací frekvence je odvozena od interního hodinového zdroje, na obrázku 2.2 se jedná o signál C. Nejvýše je vstupní vzorkovaný signál D. Při signálu W dochází k uložení daného vzorku do paměti. Spodní signál D vznikl zpětnou rekonstrukcí uložených vzorků. Krátký puls uprostřed nebyl zachycen, protože nesplňuje Nyquistovo kritérium: Vzorkovací frekvence musí být alespoň dvojnásobná nebo větší než největší frekvence obsaženého v signálu. Dále se projeví asynchronnost, tedy hrana
20
Obr. 2.1: Blokové schéma logického analyzátoru [33].
navzorkovaného signálu může být zpožděna až o jednu periodu vzorkování za hranou skutečného signálu.
Obr. 2.2: Sample mód [33].
2.1.2
Glitch mód
Logický analyzátor je schopný v tomto módu zachytit puls, který nesplňuje Nyquistův vzorkovací teorém. Pro detekci glitchů1 se musí použít další obvody (Obrázek 2.3).
2.1.3
Transitional timing mód
V tomto módu (Obrázek 2.4) se používá maximální vzorkovací frekvence, ale vzorek se uloží do pamětí pouze při změně vstupu viz signál W. 1
Glitch je krátký rušivý puls.
21
Obr. 2.3: Glitch mód [33].
Obr. 2.4: Transitional timing mód [33].
2.2
Formát ukládaných dat
Na vhodném formátu ukládaných dat závisí efektivnost využití paměti, a tedy maximální počet vzorků, které je možné uložit. Vhodným formátem dat lze ovlivnit i maximální vzorkovací frekvenci logického analyzátoru. Aby bylo možné zpětně rekonstruovat zaznamenaný průběh signálů, musí se spolu se změnou signálu uložit i časová informace. Pro signály s frekvencí řádově odpovídající vzorkovací frekvenci je nejvýhodnější vzorkovat stav vstupů vzorkovací frekvencí. Při signálech s alespoň řádově nižší frekvencí, než je vzorkovací frekvence, je výhodnější měřit čas mezi dvěma vzorky a ten ukládat spolu se navzorkovanými vstupy do paměti.
22
3
USB
3.1
Specifikace
USB (Universal Serial Bus) je univerzální sériová sběrnice, která patří v dnešní době k jedné z nejrozšířenějších pro připojování externích zařízení k počítači. Oproti dříve používaným komunikačním rozhraním jako sériový nebo paralelní port, spočívá hlavní výhoda USB v mnohem vyšší komunikační rychlosti a přítomnosti napájecího napětí pro připojovaná zařízení se zaručenou proudovou zátěží. V současnosti existují čtyři verze, které jsou zpětně kompatibilní až na drobné výjimky [12]: • USB 1.x: Maximální komunikační rychlost je 12 Mbit/s (Full-Speed). Pro pomalá zařízení lze rychlost snížit na 1,5 Mbit/s (Low-Speed). • USB 2.0: Maximální komunikační rychlost je 480 Mbit/s (High-Speed). • USB 3.0: Maximální komunikační rychlost je 5 Gbit/s (SuperSpeed). • USB 3.1: Maximální komunikační rychlost je 10 Gbit/s (SuperSpeed+). V následující kapitoly se budou zejména zabývat verzemi USB 1.x a USB 2.0. Kompletní specifikaci sběrnice USB lze nalézt v [44].
3.1.1
Topologie
Na obrázku 3.1 je znázorněna topologie USB, která bývá znázorňována jako pyramida. Toto stromové uspořádání komunikujících zařízení se vyznačuje tím, že je nelze zapojit do kruhu. Ve vrcholu pyramidy se nachází tzv. USB host, kterým typicky může být počítač. USB host pracuje v režimu master a všechny ostatní zařízení musí být v režimu slave. Pouze USB host může zahájit komunikaci s ostatními koncovými zařízeními (v USB specifikaci označované jako Functions) na sběrnici. Z tohoto důvodu USB sběrnice nemá implementované mechanizmy arbitráže, což vedlo ke zjednodušení komunikačního protokolu. Negativním důsledkem je nevhodnost použití v situacích, ve kterých se vyžadují rychlé reakce v určitém časovém intervalu. Na fyzické vrstvě spolu mohou být propojeny pouze dvě zařízení (point to point). Aby bylo možné připojit ke sběrnici více zařízení, musí se použít USB rozbočovač (USB hub). Rozbočovač je složité zařízení, které zajišťuje zesílení signálu, úpravu hran a směrování paketů do příslušných zařízení. Podle normy může být za sebou (v sérii) připojeno maximálně pět rozbočovačů, a proto má pyramida sedm vrstev. Každé koncové zařízení má svoji adresu. Adresa má délku osm bitů. Poslední bit je rezervován. Zbývá tedy 128 adres, kde adresa (0x00) je vyhrazena pro speciální účely. Z toho vyplývá, že je možné připojit maximálně 127 koncových zařízení.
23
Obr. 3.1: Topologie sběrnice USB [25].
3.1.2
Elektrické parametry
Pro vzájemné propojení dvou zařízení se používají kabely zakončené na jednom konci konektorem typu A a na druhém konektorem typu B. Oba konektory jsou ukázány na obrázku 3.2 a popis jednotlivých signálů je v tabulce 3.1. Kromě těchto dvou základních typů existují zmenšené verze (Mini a Micro) využívaných zejména v mobilních zařízeních, do kterých bych se konektory typu A a B nevešly.
Obr. 3.2: Zapojení USB konektoru [25]. Samotný kabel je tvořen čtyřmi vodiči. Dva VBUS a GND jsou určené pro napájení připojeného koncového zařízení. Zbylé dva D+ a D- jsou určeny pro sériový
24
Tab. 3.1: Popis signálů USB. Číslo pinu Barva vodiče 1 2 3 4
Červená Bílá Zelená Černá
Popis VBUS - napájecí napětí 5 V DD+ GND
poloduplexní (half-duplex)1 přenos dat. Datové vodiče tvoří diferenciální vedení o impedanci 90 ohm. Komunikace je asynchronní. Koncové zařízení se může synchronizovat s USB hostem při každém přijetí bajtu. Aby to bylo možné tak se používá kódování bitů metodou NRZI (Non-Return to Zero, Inverted)2 a pro případ šesti po sobě jdoucích ’1’ je nutné uměle vložit další bit ’0’ (označované jako Bit stuffing), aby se vynutila změna stavu linky. Na straně konektoru typu A (USB host nebo výstupní konektory rozbočovačů) jsou mezi datové linky D+ a D- a zem připojeny pull-down rezistory o hodnotě 15 𝑘Ω. Oba datové vodiče jsou tedy v nízké logické úrovni L. Tento stav se označuje jako SE0 (Single Ended Zero) a je použit například pro ukončení paketu, zaslání příkazu reset apod. Na straně koncového zařízení se připojuje pouze mezi jednu z datových linek a napětí 3,3 V pull-up rezistor o hodnotě 1, 5 𝑘Ω. Tímto bude jeden z datových vodičů ve vysoké logické úrovni H. Pokud zařízení chce komunikovat pouze LowSpeed rychlostí, pak rezistor připojí na datový vodič D-. Pro rychlost Full-Speed a High-Speed musí být rezistor připojen na D+. V případě High-Speed rychlosti si musí hned na začátku koncové zařízení s USB hostem ustanovit, že mohou komunikovat na této rychlosti. Po zahájení komunikace koncové zařízení odpojí rezistor od D+ a připojí rezistor o hodnotě 90 Ω mezi D+ a D- . Podrobnější informace lze nalézt zde [42]. Jak již bylo řečeno, výhodou USB je možnost přímého napájení koncového zařízení na sběrnici. V terminologii USB se rozlišují tři typy koncových zařízení podle způsobu napájení [12]: • Nízkopříkonové koncové zařízení napájené po sběrnici (Low-power Bus-powered Function): – Koncové zařízení musí být schopné pracovat od napětí VBUS 4,40 V do 5,25 V. 1
V poloduplexním režimu může komunikace v jednom okamžiku probíhat pouze v jednom směru. 2 NRZI kódování spočívá v tom, že ’0’ znamená změnu stavu sběrnice (přechod ’0’ -> ’1’ a naopak) a při ’1’ je se stav sběrnice nemění viz [12].
25
– Může odebírat maximálně 100 mA. – V úsporném módu (Suspend mode) může odebírat maximálně 0,5 mA. • Vysokopříkonové koncové zařízení napájené po sběrnici (High-power Bus-powered Function): – Koncové zařízení musí být schopné pracovat od napětí VBUS 4,75 V do 5,25 V. – Může odebírat maximálně 100 mA po připojení ke sběrnici, ale od USB hosta si může vyžádat možnost odebírat až 500 mA. – V úsporném módu (Suspend mode) může odebírat maximálně 2,5 mA. • Koncové zařízení s externím napájením (Self-powered Functions): – Může odebírat maximálně 100 mA.
3.1.3
Komunikační protokol
Komunikace je řízena USB hostem. USB host komunikuje s koncovými zařízeními přes logické zařízení označované jako koncové body (endpoints). Koncové zařízení mohou mít implementováno až 16 koncových bodů. Povinná je implementace pouze koncového bodu 0, který je použit pro inicializaci, konfiguraci, . . . Koncové body mají pevně daný směr komunikace, tedy jestli slouží pro příjem nebo vysílání dat. Dva koncové body mohou mít stejné číslo bodu, pokud každý slouží pro opačný směr přenosu dat. Samotné spojení mezi USB hostem a koncovým bodem je označováno jako roura (USB pipe). Komunikace v jednotlivých rourách je na sobě vzájemně nezávislá. Existují dva komunikační módy: • Tok dat (Stream): Přenášená data skrz roury nemají definovanou datovou strukturu USB specifikací. Datová struktura je závislá na návrhu samotného koncového zařízení. • Zpráva (Message): Přenášená data skrz roury mají definovanou datovou strukturu USB specifikací. USB specifikace zavádí časový úsek nazývaný rámec (frame) pro Low-Speed/FullSpeed koncové zařízení a mikrorámec (microframe) pro High-Speed koncové zařízení 3.3. Rámec má délku 1 ms a mikrorámec 125 𝜇s. Veškeré transakce (přesuny dat) jsou prováděny právě během těchto (mikro)rámců. Pro jednotlivé typy datových přenosů je potom definováno, jakým způsobem mohou využívat (mikro)rámce, např. počet příslušných transakcí během (mikro)rámce, velikost přenosového pásma, které mohou použít atd. Specifikace USB definuje čtyři základní typy datových přenosů ([26] a [12]): • Řídící přenosy (Control Transaction) • Přerušovací přenosy (Interrupt Transaction)
26
• Hromadné přenosy (Bulk Transaction) • Izochronní přenosy (Isochronous Transaction)
Obr. 3.3: USB komunikace [16].
Řídicí přenosy Řídicí přenosy jsou využívány pro přenos konfiguračních, řídicích a stavových informací mezí USB hostem a koncovým zařízením. Při připojení koncového zařízení slouží k jejich konfiguraci (Setup Stage). V druhém případě je využíván pro oznámení stavu zařízení USB hostu (Status Stage). Stavy mohou být: operace byla úspěšně dokončena, při vykonávání operace nastala chyba, zařízení je stále zaneprázdněno vykonáváním požadované operace. V tomto režimu je podporován obousměrný přenos, což vyžaduje rouru zpráv pro vstup a výstup používající dva koncové body se stejným číslem. Maximální velikost dat v paketu je omezena podle použité komunikační rychlost: • Low-Speed: 8 B. • Full-Speed: 64 B. • High-Speed: 64 B. Data mohou mít menší velikost, než je maximum (není nutné doplňovat paket na jeho maximální velikost). Frekvence přístupu (šířka přenosového pásma) ke sběrnici není v tomto režimu zaručena, pouze se zajišťuje spravedlivé rozdělení přístupu ke sběrnici pro různé koncové body. V případě poškození paketu je vyslán znovu.
27
Přerušovací přenosy Přerušovací přenosy jsou určeny pro spolehlivý nepravidelný jednosměrný přenos malého množství dat v co nejkratším čase. Typicky se využívá pro asynchronní události (stisk klávesy na klávesnici, pohyb myši, . . . ). Na rozdíl od ostatních typů přenosů je garantována maximální doba pro obsloužení požadavku. V případě chyby je požadavek znovu vyslán. Pro obousměrný přenos musí být vytvořeny dvě roury zpráv využívající dva koncové body. Maximální velikost dat v paketu je omezena podle používané rychlosti: • Low-Speed: 8 B. • Full-Speed: 64 B. • High-Speed: 1024 B, koncový bod má možnost si zvolit dvě nebo tři transakce během jednoho mikrorámce – maximálně lze tedy přenést až 3072 B. I v tomto případě může být velikost dat menší, než je jejich maximum. Low-Speed a Full-Speed koncové body si mohou alokovat maximálně 90 % rámce. Dále mohou specifikovat požadovanou periodu přístupu ke sběrnici, která je pro Low-Speed 10255 ms a pro Full-Speed 1-255 ms. Hromadné přenosy Hromadné přenosy se s výhodou používají pro jednosměrné přenosy velkých bloků dat v situacích, ve kterých se nevyžaduje garantování pevné velikosti šířky přenosového pásma. Tento typ přenosu muže být využíván pro tiskárny, skenery, flash disky, apod. Hromadné přenosy využívají veškeré zbývající dostupné přenosové pásmo. V případě chyby dochází k opakování přenosu. Pro obousměrný přenos je nutné vytvořit dvě roury zpráv pro dva různé koncové body. Pro Low-Speed koncové zařízení nelze použít hromadné přenosy. Maximální velikost dat v paketu je závislá na použité rychlosti: • Full-Speed: 64 B. • High-Speed: 512 B. Velikost dat může být opět menší. Hromadné přenosy mají nižší prioritu než řídící přenosy. V případě více koncových bodů s hromadným přenosem, je přenosové pásmo rozděleno, tak aby byly obslouženy všechny koncové body. Izochronní přenosy Izochronní přenosy jsou vhodné pro koncové zařízení, které vyžadují garantovanou šířku přenosového pásma s definovaným zpožděním, ale již bez zajištění spolehlivosti přenosu. Typické použití je pro přenos v reálném čase například hlasu a videa pro videokonference. V těchto aplikacích je nejdůležitější zajištění stejnoměrného toku
28
dat, jehož nedodržení by vedlo ke zkreslení nebo výpadkům přenosu. V případě chybného přijetí, není přenos opakován. Izochronní přenosy jsou pouze jednosměrné. Tento typ přenosu nelze použít pro Low-Speed zařízení. Maximální velikost dat v paketu je omezena následovně: • Full-Speed: 1023 B. • High-Speed: 1024 B, koncový bod má možnost si zvolit dvě nebo tři transakce během jednoho mikrorámce – maximálně lze tedy přenést až 3072 B. Maximální velikost dat lze měnit dynamicky transakce od transakce. Izochronní přenosy mohou alokovat maximálně 90 % rámce pro Full-Speed koncový bod a 80 % pro High-Speed koncový bod.
3.2
Přístup k USB z Microsoft Windows
V dřívějších dobách, před rozšířením rozhraní USB, se nejčastěji používalo sériové rozhraní RS-232 a paralelní rozhraní počítače. Pokud aplikace běžící na počítači chtěla komunikovat se zařízením připojeným ke sériovému rozhraní, postačilo vybrat port, ke kterému je zařízení připojeno, nastavit správně komunikační rychlost a několik málo dalších parametrů. Následně již mohla bez omezení probíhat komunikace mezi zařízením a aplikací. Díky této jednoduchosti zůstává rozhraní RS-232 oblíbené i v dnešní době. Při požití USB je situace mnohem komplexnější. Nejdříve je nutné se zmínit, že USB zařízení se dělí do různých tříd, jenž výrazně ovlivňují, jakým způsobem se ním dále pracuje. Na použité USB třídě zařízení závisí také to, jestli operační systém dokáže automaticky nainstalovat ovladače nebo musí být dodávány spolu se zařízením. Například lze uvést následující USB třídy3 : • USB CDC (USB Communications Device Class) • USB HID (USB Human Interface Device Class) • USB Vendor Specific Class • USB MSC (USB Mass Storage Device Class)
3.2.1
USB CDC
Tato třída se používá pro nejrůznější druhy telekomunikačních a síťových zařízeních jakou jsou digitální telefony, faxy, modemy, USB–RS-232 převodníky atd. Zařízení typu USB CDC mohou být v operačním sytému zpřístupněna přes tzv. virtuální COM porty, které emulují sériové rozhraní RS-232. Aplikace se zařízením tak může komunikovat, aniž by tušily, že ve skutečnosti komunikují přes USB. Tohoto přístupu 3
Podrobný popis lze nalézt v [44].
29
se využívá zejména pro zachování kompatibility se starším softwarem či hardwarem nepodporujícím USB. Přenos dat může být realizován buď pomocí hromadného nebo izochronního přenosu. Nevýhodou USB CDC používaného pro virtuální COM porty je použití hromadného přenosu, který ale nemá garantovanou šířku přenosového pásma a ani definované zpoždění.
3.2.2
USB HID
Typickými představiteli této USB třídy jsou počítačové periferie jako je například počítačová myš, klávesnice, joystick atd. Do této třídy spadají i zařízení, které nemusí přímo interagovat s člověkem, např. čtečky čárových kódů, teploměry, voltmetry, atd. Ve většině případů dokáže operační systém automaticky nainstalovat ovladače pro tato zařízení. USB HID zařízení využívají pro přenos dat pouze přerušovací přenosy. Programově jsou HID zařízení zpřístupněna pomocí knihovny HID.dll [29] integrovanou v operačním systému Microsoft Windows od verze Windows 2000. Pro jednotlivé podtřídy třídy USB HID jsou definovány komunikační protokoly, které USB zařízení musí dodržovat. Data jsou posílána mezi aplikací a USB zařízením pomocí tzv. reportů. Jsou definované tři typy reportů [30]: • Input Report: Reporty pro přenos dat od USB zařízení do aplikace. • Output Report: Reporty pro přes dat od aplikace do USB zařízení. • Feature Report: Obousměrný přenos dat typicky používaným pro konfigurační nastavení. Knihovna poskytovaná Microsoftem má komplexní API rozhraní, jehož studium a implementace v aplikaci zabere nějaký čas. Pro usnadnění práce s mikrokontrolérem Atmel nakonfigurovaným jako USB HID zařízení, poskytuje společnost Atmel knihovnu AtAsbHid.dll [10].
3.2.3
USB Vendor Specific Class
Třída USB Vendor Specific Class má nejobecnější charakter. Nejsou definované žádné podtřídy nebo omezení. Pro komunikaci s USB zařízením lze použít libovolné typy koncových bodů. Definice komunikačních protokolů je v režii výrobce, jenž si taktéž musí vytvořit odpovídající ovladače. Ovladače mohou běžet na operačních systémech Windows ve dvou režimech [31], kde na obrázku 3.4 je znázorněna vazba mezi nimi: • Privilegovaný režim (kernel mode) • Uživatelský režim (user mode)
30
V privilegovaném režimu mají programy vyšší výkon a lze přistupovat napřímo k hardwaru počítače. Nevýhodou je, že všechny programy běžící v tomto režimu sdílejí stejný virtuální adresový prostor. Potom špatně napsaný ovladač může poškodit data jiných programů, což může způsobit pád operačního systému. Naopak v uživatelském režimu má každý program vymezený adresový virtuální prostor a nemůže přistupovat do adresového prostoru jiného programu.
Obr. 3.4: Privilegovaný a uživatelský režim [31]. Pro přístup k USB zařízením lze použít již existující knihovny, aniž by bylo nutné psát vlastní ovladače na nejnižší úrovni obsluhující sběrnici USB. Například lze uvést knihovnu WinUSB poskytovanou společností Microsoft, která je podporována od operačního systému Windows XP [32]. WinUSB knihovna je složena z generického (kernelového) ovladače Winusb.sys zavedeného v privilegovaném režimu a komponentou reprezentovanou dynamickou knihovnou Winusb.dll pracující v uživatelském režimu. Přes tuto dynamickou knihovnu může aplikace přistupovat k jednotlivým koncovým bodům připojeného USB zařízení. Jinou možností je použití multiplatformní knihovny libusb [22]. Tato knihovna patří do kategorie tzv. svobodného softwaru a tedy jsou k ní dispozici zdrojové kódy. V současné době existuje několik rozdílných verzí knihovny zaštiťovaných různými lidmi, což může pro nové uživatele působit trochu nepřehledně. Také ne u všech probíhá aktivní vývoj. Níže je stručný přehled některých z nich: • libusb-0.1: Původní originální verze knihovny libusb. Vývoj byl ukončen. • libusb-1.0: Aktuální multiplatformní verze pod stálým vývojem.
31
• libusb-win32: Implementace API rozhraní knihovny libusb-0.1 pro operační systém Microsoft Windows. Vývoj byl ukončen. • libusbx: Tato verze byla sloučena s libusb-1.0 na začátku roku 2014 [23]. • libusbK: Aktuální vyvíjená verze. Knihovna představuje novou generaci knihovny libusb-win32. Je určena pro operační systémy Microsoft Windows [36].
3.2.4
Knihovna usblibK
Jako USB ovladač Digitální I/O USB karty byla zvolena knihovna libusbK [36], která má jednodušší API rozhraní oproti WinUSB a také podporuje izochronní přenosy. LibusbK knihovna má k dispozici vrstvu kompatibilní s winusb.dll, která umožňuje snadný přechod od WinUSB pro již hotové aplikace. Obdobně jako knihovna WinUSB, tak i libusbK je složena ze dvou částí, z kernelového ovladače libusbK.sys běžícího v privilegovaném režimu a dynamické knihovny tvořící rozhraní mezi tímto ovladačem a uživatelskou aplikací. Použitím dynamického API rozhraní poskytovaného knihovnou libusbK lze docílit nezávislosti na použitém kernelovém ovladači, pokud je použit jeden z následujících: • libusbK.sys • libusb0.sys • WinUSB.sys Podporovány jsou všechny operační systémy od verze Microsoft Windows XP. Pro Windows 2000 je nutné knihovnu ručně zkompilovat. Na webových stránkách projektu [36] jsou taktéž k dispozici ke stažení příklady, ze kterých se lze snadno a rychle naučit, jak knihovnu používat. Knihovna je rozdělena do sedmi logických celků, modulů, z nichž nejvíce významné jsou první tři: • USB General (LibK): Obsahuje obecné funkce, struktury a konstanty knihovny libsubK. • USB Core (UsbK): Tento modul představuje soubor funkcí pro práci se samotným USB zařízením jako jsou funkce pro získání USB deskriptorů, konfigurace a práce s jednotlivými koncovými body. • Device List (LstK): Pomocí tohoto modulu lze procházet a vyhledat všechny připojené USB zařízení podporované knihovnou libusbK. • Overlapped I/O (OvlK): Soubor funkcí určený pro asynchronní (neblokující) přístup k USB zařízením. • Hotplug Event Notifier (HotK): Modul slouží pro monitorování USB zařízení a notifikaci aplikace, pokud dojde u sledovaného USB zařízení k odpojení nebo připojení k USB sběrnici.
32
• Pipe Stream (StmK): Podpůrné funkce pro kontinuální přenos dat (streaming). • Advanced ISO (IsoK): Modul pro izochronní přenosy.
33
4
NÁVRH HARDWARU
Na základě požadavků specifikovaných v předešlých kapitolách bylo navrženo schéma. Schéma je nakreslené v programu Eagle 5.11.0 a lze je nalézt v příloze A. Při návrhu byl brán zřetel na minimalizaci použití součástek o různých hodnotách, zejména rezistorů a kondenzátorů.
4.1
Mikrokontrolér
Digitální I/O USB karta je postavena na mikrokontroléru ATSAM3S2C. Katalog k obvodu lze nalézt v [7] a ukázkové zapojení v dokumentu [8] od vývojového kitu SAM3S-EK.
4.1.1
Hodinový generátor
Mikrokontrolér má v sobě zabudováno mnoho různých periférií a vnitřních obvodů, které potřebují ke své správné činnosti hodinový takt o různé frekvenci. Z tohoto důvodu má zabudovaný hodinový generátor, který umožňuje generování hodinového taktu o čtyřech různých frekvencích: • SLCK (Slow Clock): Tento výstup hodinového generátoru je zejména určen pro hodiny reálného času RTC. Frekvence hodin je 32 768 Hz. Uživatel může použít buď zabudovaný méně přesný RC oscilátor, nebo může připojit externí krystalový rezonátor. • MAINCK (Main Clock oscillaotr): MAINCLK je použit pro většinu periférií a také jako zdroj přesného kmitočtu pro PLL (Phase Locked Loop). Frekvence může být v rozsahu 3 až 20 MHz. Opět lze použít interní RC oscilátor nebo si připojit externí. • PLL: Mikrokontrolér také obsahuje dvě smyčky fázového závěsu PLL použité například pro generovaní hodinové taktu pro samotné ARM jádro nebo USB. Pro SLCK a MAINCK byly připojené externí krystalové rezonátory (obrázek 4.1) ze dvou důvodů. Hlavním důvodem byla poznámka v Errata [7], ve které se doporučuje použít externí krystalový rezonátor pro MAINCK u některých revizích. Druhým důvodem je vyšší stabilita a přesnost oscilátorů s krystalovými rezonátory oproti interním RC oscilátorům. Pro správnou funkci USB periferie je vyžadovaný hodinový takt MAINCK 12 MHz a tedy je nutné připojit externí krystalový rezonátor o stejné frekvenci. Při výběru krystalových rezonátorů, je nutné brát zřetel na několik parametrů: 𝑅𝑆 (ESR), 𝑃𝑂𝑁 (Drive level), 𝐶𝑆𝐻𝑈 𝑁 𝑇 (Shunt capacitance), . . . V opačném případě se nemusí oscilátor rozeběhnout nebo může být nestabilní.
34
Ke každému krystalovému rezonátoru je nutné připojit keramické kondenzátory 𝐶𝐿𝐸𝑋𝑇 , které lze vypočítat podle rovnice 4.1 (viz [7]), kde 𝐶𝐶𝑅𝑌 𝑆𝑇 𝐴𝐿 je kapacita vybraného krystalového rezonátoru, 𝐶𝑃 𝐴𝑅𝐴 je interní parazitní kapacita mikrokontroléru a 𝐶𝑃 𝐶𝐵 je kapacita cest na DPS mezi krystalovým rezonátorem a mcu. Pro použitý krystalový rezonátor TXC-7A-12.000MAAJ-T [43] s kapacitou 18 pF a zvolenou parazitní kapacitu DPS 2 pF vychází velikost kondenzátorů na 13 pF. Maximální přípustná velikost je 10 pF podle [7], a proto byly zvoleny kondenzátory s touto hodnotou. Vhodnější by sice byl krystalový oscilátor s kapacitou 16 pF, ale jejich nabídka je velmi omezená zejména pro SMD provedení.
𝐶𝐿𝐸𝑋𝑇 = 2 · (𝐶𝐶𝑅𝑌 𝑆𝑇 𝐴𝐿 − 𝐶𝑃 𝐴𝑅𝐴 − 𝐶𝑃 𝐶𝐵 ) = 2 · (18 − 9.5 − 2) 𝑝𝐹 = 13 𝑝𝐹 (4.1)
Obr. 4.1: Krystalové rezonátory.
4.1.2
SRAM
Mikrokontrolér ATSAM3S2C disponuje interní pamětí SRAM pouze o velikosti 32 kB, ale má zabudovaný paměťový kontrolér umožňující připojení externí paměti. Datová sběrnice je široká 8 bitů a velikost paměti je omezena na 16 MB na jeden CS (Chip Select) – k dispozici jsou čtyři CS. Z těchto důvodů byla připojená externí paměť SRAM AS6C4008 [4] o velikosti 512 kB. Jedná se o 8bitovou paměť pracující ve velkém rozsahu napájecího napětí 2,7 až 5,5 V. Paměť lze tedy napřímo připojit k mikrokontroléru bez dalších pomocných obvodů. Doba čtecího/zapisovacího cyklu je 55 ns.
35
4.1.3
Rozšíření vstupů/výstupů
Digitální I/O USB karta má čtyři porty. U každého portu je umožněno si programově zvolit buď pull-up nebo pull-down rezistory. Každý port má taktéž nadproudovou ochranu. Toto vše vyžaduje další řídící signály (podrobněji v kapitole 4.3), pro které již nejsou volné I/O na mikrokontroléru. Nejedná se o časově kritické signály, jako jsou datové linky od portů, potom není nezbytně nutné použít mikrokontrolér s více I/O. Navíc by se i v tomto případě musel použít nějaký typ obvodu levelshifter pro ovládání některých řídicích signálů vyžadujících 5 V ovládací napětí, např. Px_PULL_UP. Byl vybrán 16bitový I/O expandér TCA6416A od firmy Texas Instrument. Tento obvod má zabudované rozhraní I2 C pro komunikaci s nadřazeným systémem. Výhodou je dvojité napájení, jedno určené pro I2 C a druhé pro samotné dva 8bitové porty – jedná se o obvod typu level-shifter. Porty nemají zabudované žádné pull-up nebo pull-down rezistory, a proto se musí připojit externí. Po připojení napájení jsou oba porty nakonfigurovány jako vstupní, což je nutné zohlednit při návrhu. Na obrázku 4.2 je zapojení I/O expandéru. Pin 𝑉𝐶𝐶1 je určený pro napájení rozhraní I2 C a je připojen na stejné napájecí napětí jaké má mikrokontrolér, tedy 3,3 V. V případě sběrnice I2 C je nutné zapojit pull-up rezistory na oba signály SCL (Synchronous Clock) a SDA (Synchronous Data). Pin 𝑉𝐶𝐶𝑃 určený pro napájení portů a je připojen na 5 V. Vstup ~Reset je spojen s globálním signálem ~Reset pro mikrokontrolér. Výstup ~Int (signál 𝐼𝑂𝐸𝑋𝑃 𝐼𝑁 𝑇 ) slouží pro signalizaci změny na vstupech I/O expandéru. Jako vstupní piny jsou nakonfigurovány pouze signály z nadproudové ochrany portů signalizující jejich přetížení. Z tohoto pohledu má signál 𝐼𝑂𝐸𝑋𝑃 _𝐼𝑁 𝑇 jednoznačný význam – proudové přetížení jednoho z portů, přičemž by se na tuto událost mělo reagovat v co nejkratším čase.
4.1.4
Ostatní
JTAG Mikrokontrolér umožňuje nahrání programu přes různá rozhraní: • JTAG • UART • USB Pro účely ladění je použit JTAG, jehož zapojení je na obrázku 4.3 [8]. Resetovací obvod Kompletní resetovací obvod je implementován přímo v mikrokontroléru [7] a není zapotřebí zapojovat žádné externí součástky pro ošetření zákmitů resetovacího tlačítka
36
Obr. 4.2: I/O expandér TCA6416A.
(obrázek 4.4). LED LED označená jako Run LED bude uživateli sloužit pro signalizaci několika základních stavů běhu programu: • Zhasnutá LED: USB kabel není připojen nebo nelze navázat komunikaci s aplikací na počítači. • Trvalý svit: Mikrokontrolér řádně komunikuje s aplikací na počítači. • Pomalé blikání (500 ms svítí, 500 ms nesvítí): Hlavní běh programu – probíhá čtení vstupních portů a nastavování výstupních portů. • Záblesky (100 ms svítí, 900 ms nesvítí): Chyba nezávažného charakteru, přičemž běh programu není přerušen, např. odpojení USB kabelu v autonomním módu. • Rychlé blikání (100 ms svítí, 100 ms nesvítí): Nastala závažná chyba, kdy je nutný zásah uživatele, např. proudové přetížení portů. Podrobnější stavové informace půjde vyčíst přímo přes USB nebo UART.
37
Obr. 4.3: Zapojení konektoru pro JTAG.
Ladící port - Debug UART Slouží zejména pro výpis ladicích informací. Uživatel jej za normálních okolností nebude zapojovat. Signály UTXD a URXD jsou vyvedeny přímo z mikrokontroléru, a proto je nezbytné použít externí převodník pro propojení s počítačem. Navíc signál URXD je sdílen s datovou linkou portu D – byl použit pouze v době ladění programu. Komunikační rozhraní je nakonfigurováno následovně: • Přenosová rychlost [Bd]: 115200 • Datových bitů: 8 • Parita: žádná • Stop bity: 1 Flash paměť Signál ERASE slouží pro vymazání paměti Flash včetně konfiguračních bitů. Aby došlo ke smazání, musí být pin ve stavu vysoké úrovně po dobu alespoň 220 ms během jeho startovací sekvence. Pin je multiplexován se standardními I/O. Po resetu mikrokontroléru je právě nakonfigurován pro tuto funkci a zároveň je zapojen interní pull-down rezistor držící stav pinu v nízké úrovni. Použití tohoto pinu je tedy možné, ale musí být zaručeno, že po celou startovní sekvenci mikrokontroléru zůstane v nízké úrovni.
38
Obr. 4.4: Zapojení ladicího portu, LED, jumperu pro vymazání Flash paměti a resetovacího tlačítka.
Nezapojené piny JTAGSEL a TST Oba vstupní piny JTAGSEL a TST slouží pro JTAG boundary scan1 , jehož funkce není využívaná. Piny je možné ponechat nezapojené, jelikož jsou použity interní pull-down rezistory. Podle výrobce je vhodnější je zapojit přímo na GND zejména v zarušených prostorech.
4.2 4.2.1
USB Galvanické oddělení USB sběrnice
USB sběrnice lze napřímo připojit (přes sériové rezistory) k mikrokontroléru, ale z důvodu zamezení zemních smyček, popřípadě poškození samotného USB portu na straně počítače, bylo použito galvanické oddělení USB. Pro galvanické oddělení byl zvolen USB izolátor Adum3160 od firmy Analog Devices. Obvod je určen pouze pro Low-Speed a Full-Speed USB. Tato vlastnost není omezující, protože i samotný mikrokontrolér podporuje nejvyšší komunikační rychlost Full-Speed. Zapojení USB rozhraní je na obrázku 4.5 vychází z doporučeného zapojení v katalogu obvodu [5]. Kromě sériových rezistorů 27 Ω zapojených u datových linek USB D+ a D- nejsou zapotřebí žádné další externí součástky. Pro zlepšení ESD ochrany jsou k datovým linkám připojeny TVS (Transient Voltage Suppressors) diody integrované v obvodu NUP2202W1. Součástí Adum3136 jsou i pull-up a pulldown rezistory definující stav sběrnice 3.1.2. Chování obvodu lze ovlivnit pomocí několika řídicích vstupů: • SPU a SPD: Těmito vstupy se vybírá přenosová rychlost. Oba vstupy musí byt nastaveny totožně. Pokud jsou připojeny k 𝑉𝐷𝐷1 a 𝑉𝐷𝐷2 pak je zvolena 1
JTAG boundary scan slouží pro automatizované otestování navržené DPS, pro mikrokontrolér a k němu připojených obvodů bez nutnosti zásahů do DPS.
39
rychlost Full-Speed. V opačném případě, jsou-li zapojeny na zem, je zvolena rychlost Low-Speed. • PIN: Pro normální funkci musí být připojen k 𝑉𝐷𝐷2 . Pokud je zapojen na zem, pak jsou odpojeny pull-up rezistory (definování přenosové rychlosti viz 3.1.2) na upstream straně, což se pro počítač jeví, jako kdyby tu nebylo připojeno žádné koncové zařízení. Tato vlastnost je využita pro pozdržení zahájení komunikace, než se Digitální I/O USB karta inicializuje. • PDEN: Tento řídicí vstup má podobné chování jako PIN s tím rozdílem, že se odpojují Pull-Down rezistory na downstream straně (koncové zařízení).
Obr. 4.5: Zapojení USB.
4.2.2
Napájení přes USB sběrnici
Napájení obvodu lze řešit dvěma způsoby. První je připojit 5 V na 𝑉𝐵𝑈 𝑆1 a 𝑉𝐵𝑈 𝑆2 , přičemž Adum3136 má interní stabilizátor pro vytvoření napájecího napětí 3,3 V. Tato možnost je využita na upstream straně pro napájení USB izolátoru po sběrnici USB z počítače. V napájení je zařazená vratná pojistka (PolySwitch) 500 mA, která spolu se zenerovou diodou (integrovaná v NUP2202W1) mezi napájecími svorkami VBUS a zemí tvoří ochranu proti přepólování, přepětí a proudovému přetížení USB sběrnice.
40
Pro snížení rušivého vyzařování (EMI) USB kabelu je doporučeno [9] připojit stínění USB kabelu přes RC článek na zem. Adum3136 lze také napájet přímo z 3,3 V, ale musí se propojit napájecí vstupy 𝑉𝐵𝑈 𝑆2 a 𝑉𝑉 𝐷𝐷2 (popřípadě 𝑉𝐵𝑈 𝑆1 a 𝑉𝑉 𝐷𝐷1 ) dohromady. Aby bylo možné napájení samotné Digitální I/O USB karty z USB sběrnice, musí se použít izolující DC/DC měnič. Byl zvolen RKZ-0505S s výkonem 2 W, maximální výstupní proud je tedy 400 mA. Měnič musí mít minimální zatížení 40 mA, aby výstupní napětí bylo v mezích definované v katalogu [35]. Z tohoto důvodu je zde LED zároveň signalizující připojení USB kabelu a rezistor R18, který bude zvolen podle změřeného skutečného odběru nenakonfigurované desky. Měnič dosahuje účinnosti 82 % při maximálním zatížení. Příkon lze spočítat podle 4.2. I při maximálním dovoleném zatížení měniče není překročen maximální dovolený proud odebíraný z USB sběrnice viz rovnice 4.3. 𝑃0 =
2 𝑃 = 𝑊 = 2, 44 𝑊 𝜂 0, 82
(4.2)
𝑃0 2, 44 = 𝐴 = 0, 49 𝐴 (4.3) 𝑈 5 Signál USB_HOST slouží pro signalizaci připojení USB kabelu a tedy i USB hosta k Digitální I/O USB kartě. Při odpojeném USB kabelu je signál ve stavu nízké úrovně definovaný rezistorem R17. Po připojení USB kabelu je signál ve stavu vysoké úrovně. Signál USB_HOST je připojen k mikrokontroléru 2 , a proto je zapotřebí použít napěťový dělič tvořený rezistory R15 a R17, který sníží napětí z 5 V na 3 V 3 viz rovnice 4.4. 𝐼𝑖𝑛 =
𝑈𝑈 𝑆𝐵 _𝐻𝑂𝑆𝑇 = 𝑈𝑈 𝑆𝐵 _+5𝑉 ·
4.3
𝑅17 15000 =5· 𝑉 = 3𝑉 𝑅15 + 𝑅17 10000 + 15000
(4.4)
Vstupně/výstupní porty
Na obrázku 4.6 je schéma zapojení jednoho portu PA, kde PAx jsou datové linky připojeny k mikrokontroléru a PAx_I jsou připojené ke konektoru. Pro lepší přehlednost jsou zapojeny pouze dvě datové linky. V kapitole 1.4.3 byly zmíněny požadavky na budiče. Byl zvolen obousměrný budič sběrnice typu level-shifter 74LVC4245. Port B je napájen z 3,3 V, čímž jsou napěťové úrovně na tomto portu kompatibilní s napěťovými úrovněmi mikrokontroléru. 2
USB_HOST signál není připojen k I/O expandéru, aby význam signálu IOEXP_INT zůstal jednoznačný. Druhým důvodem je jednodušší návrh DPS. 3 Platný rozsah pro vysokou napěťovou úroveň 𝑉𝐼𝐻 je 0, 7 · 𝑉𝑉 𝐷𝐷𝐼𝑂 𝑉 až (𝑉𝑉 𝐷𝐷𝐼𝑂 + 0, 3) 𝑉 , kde 𝑉𝑉 𝐷𝐷𝐼𝑂 je napájecí napětí I/O portů (3,3 V) [7].
41
74LVC4245 má dva řídicí signály OE a ~DIR, které jsou přes clamping diody připojené na napájení portu A, 5 V. V případě odpojení napájení portu A by byl port napájen přes řídicí vstupy, a proto jsou použity sériové rezistory R4, R5 pro omezení případného procházejícího proudu.
Obr. 4.6: Schéma zapojení portu PA pro dvě datové linky.
4.3.1
ESD ochrana
Na všech linkách portu A jsou zapojeny tzv. clamping diody (D1 a D2), jenž jsou primárně určeny na ochranu proti přepětí a podpětí na linkách. Jejich sekundární vlastnost je ochrana proti ESD (Electrostatic Discharge). Použitý obvod 74LVC4245 je má sice integrované, ale je vhodnější použití externích diod, jenž mají větší zatížitelnost a v případě poškození je lze snadno vyměnit. Externí clamping diody se musí zvolit s menším prahovým napětím, než mají interní diody, aby poruchový proud neprocházel interními. Prahové napětí clamping diod se v katalozích běžně neuvádí. Například v aplikačních poznámkách od ON Semiconductor se uvádí, že integrované obvody vyráběné technologií CMOS mívají diody s prahovým napětím > 0,7 V. Doporučuje se použít použit diody s prahovým napětím 300 mV [20]. Byla vybrána clamping dioda BAT54S, která má prahové napětí 320 mV (pro proud 1 mA) [14]. Maximální proud je 200 mA oproti 50 mA u integrovaných v 74LVC4245 [38]. Primární ochrana proti ESD je tvořena TVS (Transient Voltage Suppressors) diodami PESD5V0L2BT. Jejich hlavní předností je skoková změna impedance při překročení definovaného napětí, přičemž jsou schopné pohltit napěťové špičky o
42
velkém výkonu, aniž by se dioda přerušila a přestala tak chránit připojený obvod [34]. Někdy se místo TVS diod používá obyčejná zenenerova dioda, jenž ale nemá tak vysoké reakční časy a ani uzpůsobena pro pohlcení výkonových napěťových špiček.
4.3.2
Nadproudová ochrana
Při konfiguraci portu A obvodu 74LVC4245 jako výstupního, je v katalogu definován maximální proud výstupů ±50 mA, po jehož překročení dojde nevratnému poškození výstupu. Nadproudovou ochranu lze realizovat pomocí sériového rezistoru, který bude omezovat procházející proud. Pro napájecí napětí 5 V, výstup ve stavu vysoké úrovně, druhého konce sériového rezistoru připojeného na zem a považování výstupního tranzistoru za ideální spínač, lze spočítat podle rovnice 4.5 minimální velikost tohoto rezistoru. 5 𝑈 = Ω = 100 Ω (4.5) 𝐼 0, 05 Aby byla zachována rezerva, musel by se použít rezistor s vyšší hodnotou. Nejbližší hodnota v řadě E12 je 120 Ω, čímž by se omezil proud na 40 mA. Ve skutečnosti je hodnota rezistoru 100 Ω postačující. Ve výpočtu byl spínací tranzistor považován za ideální. Pokud se podíváme na charakteristiku LVC technologie, respektive na zapojení výstupů [40], pak lze zjistit, že spínací tranzistory mají použité předřadné rezistory o hodnotě 15 Ω. Celkový odpor poruchové cesty je tedy 115 Ω a proud je omezen na 0,44 mA. Sériový odpor taktéž omezuje procházející poruchový proud tekoucí přes clamping diody. Pro definování stavu jednotlivých linek portu jsou použity programově ovladatelné pull-up/pull-down rezistory. Tedy není nutný manuální zásah do zařízení pro nastavení pomocí jumperů (používané u karty USB-DIO-32-E), pokud uživatel požaduje změnit pull-up rezistory na pull-down a naopak. Maximální povolený proud procházejí napájecími piny obvodu 74LVC4245 je 100 mA. Cílem je zabránit poškození samotného budiče, nebo alespoň minimalizovat poškození dalších obvodů. V každém případě by Digitální I/O USB karta měla být schopna rozeznat tuto událost, odpojit porty a informovat uživatele. Nejjednodušším řešením je zařazení tavné pojistky do napájení budiče, např. série HF251 od Littelfuse[24], jenž patří mezi tavné pojistky s velmi rychlou reakční dobou. Reakční doba je závislá na procházejícím proudu. U této pojistky musí být jmenovitý proud překročen alespoň dvakrát, aby bylo zaručeno přepálení pojistky do 1 s. Při desetinásobném překročení se dosáhne reakční doby 4 ms. Takto vysoké reakční doby a proudy jsou neakceptovatelné pro ochranu polovodičových součástek. Druhou možností je použití, již prodávaných obvodů pro tento účel. Bohužel většina z nich je určena pro proudy větší jak 200 mA. Jedním z nich jsou obvody 𝑅=
43
MIC2090, MIC2091[27] a jejich ekvivalenty. Jedná se nadproudovou ochranu zapojenou mezi chráněné zařízení (typicky USB) a napájecí napětí. Dojde-li ke zkratu na chráněném zařízení, pak jej tento obvod odpojí od napájení do 20 ns. Pokud je překročen limitní proud, je proud omezen limitní hodnotu. Napájení je odpojeno až po ~10 ms, jestliže mezitím proud neklesne pod limitní hodnotu. Výhodou je, že obvod také dokáže signalizovat toto proudové přetížení pomocí binárního výstupu. Obvod MIC2090 vypíná typicky kolem proudu ~75 mA, ale takto malá hodnota by mohla způsobit nežádané odpojení budičů 74LVC4245. Z tohoto důvody byl zvolen MIC2091, jehož typický vypínací proud je ~150 mA. Tedy obvod pravděpodobně nedokáže zabránit poškození budiče 74LVC4245, ale může předejít poškození připojeného přípravku a vážnějšímu poškození dalších částí Digitální I/O USB karty. Výhodou je indikace proudového přetížení, čehož je na kartě využito.
4.3.3
Popis signálů
V tabulce 4.1 je popis společných signálů pro všechny porty a v tabulce 4.2 je popis řídicích a datových signálů pro práci s portem A (obdobně pro porty B, C, D). Tab. 4.1: Společné řídicí signály portů. Signál
Typ
PX_PWR PX_OE
Vstup Vstup
Aktivní Popis H L
Zapnutí napájení pro všechny porty Uvedení portů obvodu 74LVC4245 do stavu vysoké impendance
Tab. 4.2: Řídicích a datových signálů portu A. Port
Port A
Signál
Typ
Aktivní Popis
PA0 - PA7
V/V
-
PA0_I - PA7_I
V/V
-
PA_DIR
Vstup
L/H
PA_PULL_RES
Vstup
L/H
PA_FAULT
Výstup
L
Datová sběrnice připojená k mcu Datová sběrnice připojená ke konektoru Nastavení směru přenosu PAx=>PAx_I/PAx<=PAx_I Konfigurace rezistorové sítě jako pull-down/pull-up Proudové přetížení portu A
44
4.4
Napájení
Před návrhem napájecích zdrojů je nejdříve potřeba odhadnout vlastní spotřebu Digitální I/O USB karty. V následujícím výčtu jsou uvedeny obvody s největší spotřebou: • Porty: 320 mA – Pro konfiguraci všech čtyř portů jako výstupních a maximální zatížení jedné linky 10 mA. • ATSAM3S2C: 40 mA [7] – Pro aktivní mód a frekvenci jádra 64 MHz. • AS6C4008W: maximálně 60 mA (typicky 30 mA) [4] – Hodnoty platné, pokud je vstup 𝐶𝐸 ve stavu nízké úrovně (probíhá čtení nebo zápis). • 2 x LED: 30 mA – Jedna LED pro signalizaci napájení a druhá signalizace běhu programu. • Adum3160: 8 mA [5] – Platí při konfiguraci pro Full-Speed. • Celkově: 458 mA. Při navrhování zdroje je nutné připočíst rezervu alespoň 20 %, která pokryje nezapočítanou spotřebu ostatních obvodů na desce. S rezervou se tedy požaduje napájecí zdroj s výstupním proudem minimálně 550 mA. Minimální požadovaný výstupní proud napájecího zdroje přesahuje maximální povolený proud odebíraný z USB sběrnice. Z tohoto důvodu je nutné použití externího napájecího zdroje. V případě napájení z USB sběrnice přes již zmíněný DC/DC měnič RKZ-0505S jsme omezení maximálním proudem 400 mA. Tuto podmínku lze splnit za předpokladu omezené konfigurovatelnosti portů, tj. pouze dva porty je možné nastavit jako výstupní. Maximální odebíraný proud všech portů klesne na 160 mA, celé karty na 298 mA a nakonec se započítáním rezervy 20 % dostáváme 360 mA, čímž se dostáváme pod proudový limit DC/DC měniče.
4.4.1
Externí napájecí zdroj
Externí napájecí zdroj lze řešit několika způsoby. Nejjednodušším řešením je použití adaptéru s výstupním napětím 5 V, který by se připojoval ke kartě. Potom by stačila pouze jedna dioda zapojená mezi vstupní svorky a pojistka jako ochrana proti přepólování. Nevýhodou tohoto řešení je nutnost použití pouze jednoho typu adaptéru. Aby bylo možné použít téměř libovolný adaptér, byl realizován napájecí zdroj se step-down měničem LM2575-5.0 (obrázek 4.8). Na vstupu je běžně používaný napájecí konektor 2,1 mm. Za konektorem je umístěn Graetzův můstek umožňující použití i adaptérů se střídavým napětím. Následuje filtrační kondenzátor C3 o hodnotě 220 𝜇F na 50 V (maximální doporučené vstupní napětí LM2575 je 40 V). Za ním je typické zapojení LM2575-5.0 jako step-down měniče uváděné v katalogu
45
[39]. Indukčnost cívky je zvolena 560 𝜇H na základě grafu 4.7 pro pravděpodobně nejčastěji používané vstupní napětí v rozsahu 9 až 12 V a průměrnou spotřebu karty 300 mA (dva porty nakonfigurované jako výstupní). Výrobce doporučuje zvolit výstupní filtrační kondenzátor v rozmezí 100 𝜇F až 470 𝜇F. Digitální I/O USB karta může být napájena ze dvou různých zdrojů. Z důvodu zachování konstantní výstupní kapacity, bez ohledu na zvolený napájecí zdroj, je výstupní kondenzátor rozdělen na dva. Těsně u LM2575-5.0 je připojen kondenzátor C4 o hodnotě 100 𝜇F. Za jumperem je připojen kondenzátor C5 o hodnotě 220 𝜇F. Všechny elektrolytické kondenzátory jsou nízkoimpedanční4 a jsou vybrány z řady FM od firmy Panasonic na 105 𝑜 C. Obvod nevyžaduje žádný externí chladič, což lze doložit níže provedenými výpočty viz [39]. Nejhorší případ nastane pro nejnižší dovolené vstupní napětí 7 V a maximální výstupní proud, jenž je 600 mA: Nejdříve je nutné vypočítat ztrátový výkon 𝑃𝐷 : 𝑃𝐷 = 𝑉𝐼𝑁 ·𝐼𝑄 +
5 𝑉𝑂 ·𝐼𝐿𝑂𝐴𝐷 ·𝑉𝑆𝐴𝑇 = 7 · 0, 02 + · 0, 6 · 0, 85 𝑊 = 0, 51 𝑊, (4.6) 𝑉𝐼𝑁 7 (︂
)︂
kde 𝑉𝐼𝑁 je vstupní napětí, 𝑉𝑂 je výstupní napětí, 𝐼𝐿𝑂𝐴𝐷 je výstupní proud, 𝐼𝑄 je klidový proud obvodu LM2575-5.0, jenž pro vstupní napětí 7 V má velikost přibližně 20 mA a 𝑉𝑆𝐴𝑇 je saturační napětí a pro proud 600 mA lze odečíst 0,85 V z grafu „Switch Saturation Voltage“ uvedeného v [39]. Nyní vypočítáme změnu teploty přechodu Δ𝑇𝐽 : Δ𝑇𝐽 = 𝑃𝐷 · 𝜃𝐽𝐴 = (0, 51 · 65) 𝑜 𝐶 = 33, 15 𝑜 𝐶,
(4.7)
kde 𝜃𝐽𝐴 je tepelný odpor pouzdra TO220 o velikosti 65 𝑜 C/W. Posledním krokem je výpočet maximální teploty okolí 𝑇𝐴 : 𝑇𝐴 = 𝑇𝐽 _𝑚𝑎𝑥 − Δ𝑇𝐽 = (100 − 33, 15) 𝑜 𝐶 = 66, 85 𝑜 𝐶 ∼ = 70 𝑜 𝐶,
(4.8)
kde 𝑇𝐽 _𝑚𝑎𝑥 je maximální povolenou teplotu přechodu 100 𝑜 C5 . Z posledního výpočtu uvedeného v 4.8 odpovídá, že Digitální I/O USB karta může být bezpečně provozována až do teploty okolí 70 𝑜 C. Pro signalizaci připojení adaptéru ke zdroji a jeho správnou funkci slouží LED D4, jejíž druhý účel je vytvoření minimální zátěže pro zdroj. Pomocí jumperu JP1 4
Při výběru kondenzátorů je taktéž nutné brát zřetel na to, že jejich impedance nesmí být menší jak 0,05 Ω [39], což by až mohlo vést k oscilacím výstupního napětí se všemi důsledky. 5 Tato hodnota vychází z maximální teploty přechodu 125 𝑜 C uváděné v katalogovém listu [39] se zvolenou rezervou 20 %.
46
si uživatel může vybrat mezi externím napájecím zdrojem a napájením z USB sběrnice. Jumper byl zvolen místo přepínače z důvodu, aby si uživatel nemohl nechtěně přepnout mezi zdroji. Nakonec je použita rychlá pojistka F1 600 mA, jejíž jmenovitý proud by neměl být za normálních okolností fungování Digitální I/O USB karty překročen. Doporučené parametry externího adaptéru pro napájení Digitální I/O USB karty: • Vstupní napětí DC: 9 až 35 V • Vstupní napětí AC: 7 až 26 V • Výkon: 5 W
Obr. 4.7: Výběr indukčnosti pro LM2575-5.0 [39].
Obr. 4.8: Externí napájecí zdroj.
47
4.4.2
Napájení mikrokontroléru
Mikrokontrolér umožňuje použít rozdílné napájecí napětí pro periferie a jádro ARM. Jádro ARM vyžaduje napájecí napětí v rozsahu 1,62 až 1,95 V. Rozsah napájecí napětí pro periferie je 1,62 až 3,6 V. Mikrokontrolér a připojené obvody musí pracovat na stejných napěťových úrovních, v opačném případě není zaručena správná funkčnost a mohlo by dojít k samotnému poškození obvodů [37]. Napájecí napětí periferií mikrokontroléru bylo tedy zvoleno 3,3 V. Pro vytvoření napájecího napětí 3,3 V byl vybrán lineární stabilizátor LM1117DT-3.3 viz obrázek 4.9. Je použito jeho katalogové zapojení.
Obr. 4.9: Napájecí napětí 3,3 V. Mikrokontrolér má integrovaný lineární stabilizátor s výstupním napájecím napětím 1,8 V. Stabilizátor je napájen přes pin VDDIN, který musí být připojen na 3,3 V. Výstup je vyveden na pinu VDDOUT. Kromě ARM jádra je napájen 1,8 V i fázový závěs PLL. Pro spolehlivou funkci PLL je vhodné napájecí napětí vyfiltrovat pomocí LC článku. Zapojení bylo převzato z [8]. Schéma zapojení je na obrázku 4.10. Pro správnou funkci mikrokontroléru je taktéž nutné použití blokovacích kondenzátorů na napájecích pinech. Byla zvolena kombinace kondenzátorů 100 nF a 1 nF v SMD pouzdře 0603, tak aby je bylo možné umístit, co nejblíže vývodům mikrokontroléru.
4.5
Návrh DPS
V této kapitole bude popsána navržená DPS pro Digitální I/O USB kartu. Všechny fotografie a pohledy na jednotlivé vrstvy lze nalézt v příloze B. Data vhodná pro výrobu jsou umístěny na CD ve složce /Hardware/Výroba. Byly z Eaglu vyexportovány do formátu Gerber RS-274x pro jednotlivé vrstvy a do formátu Excellon pro vrtací data.
48
Obr. 4.10: Napájecí napětí 1,8 V.
Na obrázku 4.11 je pohled na vyrobenou a osazenou DPS. DPS je navržená jako čtyřvrstvá s rozměry 118,5 mm x 85,5 mm. Z počátku byla DPS navrhovaná jako dvouvrstvá, přičemž bylo možné ji i jako dvouvrstvou dokončit a vyrobit. Po diskusi s vývojovými inženýry v Honeywellu byla zvolena čtyřvrstvá DPS, která přinesla řadu výhod: • Lepší rozvod napájení +5 V, +3,3 V, +1,8 V po DPS. • Lepší rozvod GND – jedna vrstva je dedikována jako zemnící plocha. – Omezení rušení mezi obvody (mikrokontrolér a paměť SRAM). – Možnost lépe zapojit ochranné prvky (TVS a clamping diody) a jejich přímé připojení na zemnící plochu. • Zjednodušení návrhu části digitálních vstupů/výstupů.
4.5.1
Digitální vstupy/výstupy
Jednou z klíčových částí karty jsou digitální vstupy/výstupy. Jak již bylo zmíněno v teoretické části práce, byla zachována kompatibilita zapojení konektoru J5 se zapojením u již používané karty USB-DIO-32-E od společnosti ACCESS. Důsledkem tohoto rozhodnutí byl komplikovanější návrh DPS, protože port D je vyveden v přední řadě konektoru, přičemž porty A až C jsou vyvedeny v jeho zadní části.
49
Obr. 4.11: Digitální I/O USB karta - horní pohled.
Zapojení ochranných prvků následují rady a doporučení uvedené v dokumentu [21] pro zajištění jejich maximální efektivity. Jedním z nich je, že signál z konektoru by měl být přiveden na ochranný prvek a teprve z něho by měl být dál veden k chráněnému obvodu, např. TVS diody na obrázku 4.12 vpravo. U TVS diod D51 až D54 byly proto použity prokovy pro připojení k dalším obvodům, i když by bylo možné vše připojit napřímo ke konektoru J5. Dále u každé TVS diody je prokov vedoucí do vnitřní zemnící plochy. Za sériovým rezistorem jsou umístěny clamping diody. Tam kde to dovolovalo místo na DPS, byly umístěny prokovy vedoucí do zemnící plochy. Clamping diody vyžadují také připojení na napájecí napětí +5 V. Toho je dosaženo připojením všech clamping diod k cestě, jenž je vedená s co nejmenším počtem ohybů. Tato cesta je připojena do společného bodu na pojistce F1, kde se rozvětvuje napájecí napětí +5 V. Na obrázku 4.13 vlevo lze vidět rozlití zemnicí plochy. Zemnící plocha je oddělena izolační mezerou od hlavní zemnící plochy (uprostřed) určenou pro připojení všech ostatních obvodů. Obě zemnící plochy jsou spojené v jednom bodě a to na kondenzátoru C5. Pokud by došlo k přepětí na vstupech, pak poruchový proud nemůže zvýšit napětí v ostatních částech karty a tím ji poškodit.
50
Obr. 4.12: Digitální I/O USB karta - dolní pohled.
4.5.2
Mikrokontrolér a paměť SRAM
Oblast kolem mikrokontroléru a SRAM paměti patřila k jedné z komplikovanějších částí při návrhu DPS. Nejdříve muselo být zvoleno vhodné pouzdro pro SRAM paměť tak, aby se signály připojované k mikrokontroléru co nejméně křížily. Jako nejvhodnější se ukázalo použití pouzdra 32-pin 450 mil SOP. Mikrokontrolér pracuje na frekvenci 64 MHz, čímž by mohlo docházet k rušení paměti SRAM, která je umístěna nad ním. Na řešení tohoto problému byly použity dva přístupy. Paměť SRAM je posunutá vůči mikrokontroléru a tedy se překrývají jen částečně. Díky použití čtyřvrstvé DPS bylo umožněno mezi ně rozlít zemnící plochu. Většina pinů mikrokontroléru je obsazená a zároveň bylo nutné, co nejblíže k jeho pouzdru umístit blokovací kondenzátory (1 nF a 100 nF pro jeden napájecí pin). Kondenzátory byly zvoleny v SMD pouzdře 0603, čímž bylo snadnější vyvést ostatní signály dál od pouzdra mikrokontroléru a připojit je k ostatním obvodům.
4.5.3
USB
Návrhu USB bylo taktéž věnovat zvýšenou pozornost viz obrázek 4.12 vlevo. Datové vodiče D+ a D- tvoří diferenciální vedení pracující na frekvenci 6 MHz (Full-Speed).
51
Obr. 4.13: Rozlití zemnící plochy.
Pro zajištění spolehlivosti je nutné dodržet několik zásad. Datové vodiče by měly vést těsně vedle sebe. Jejich délka by měla být totožná a co nejkratší. Taktéž by se měly vést co nejpříměji bez zbytečných lomů [9]. Pro dodržení těchto zásad byly USB konektor, USB izolátor ADuM3160 a mikrokontrolér umístěny do jedné linie co nejblíže k sobě. Dále si lze povšimnout umístění ochranné TVS diody D5, ke které jsou připojeny datové vodiče. Na obrázku 4.14 jsou znázorněny doporučení výrobce pro návrh DPS. Kolem celé vstupní části USB rozhraní je vytvořena izolační mezera, jejíchž hranice je znázorněna čárou na potisku DPS. Tato izolační mezera je dodržena na všech vrstvách, kde si ji lze zejména povšimnout na obrázku 4.13 vpravo.
4.5.4
Napájecí zdroje
V dolním pravém rohu se nachází obvod externího, USB a 3,3 V napájecího zdroje. Při návrhu DPS bylo třeba věnovat pozornost zejména externímu napájecímu zdroji, kde je využit step-down měnič LM2575. Výrobce doporučuje některé spoje vést co nejkratší viz obrázek 4.15, což bylo při návrhu zohledněno. Také se zde nachází jumper pro přepínání mezí externím napájecím zdrojem a napájením přes USB sběrnici.
52
Obr. 4.14: Doporučení pro návrh DPS s ADuM3160 [5].
Obr. 4.15: Doporučení pro návrh DPS s LM2575 [39].
53
5
FIRMWARE PRO USB KARTU
V následujících podkapitolách bude popsán firmware pro Digitální I/O USB kartu. Firmware je napsaný v jazyce C. Vývojové prostředí bylo zvoleno Atmel Studio 6. Použité verze vývojových nástrojů jsou následující: • Atmel Studio 6.1.2730 • Atmel ASF 3.11.0 • FreeRTOS 7.3.0 Vstupním bodem programu je funkce main nacházející se v souboru main.c. Funkce main slouží pouze pro inicializaci hardwarových prostředků jako je paměť SRAM, přerušení, USB atd. a softwarových prostředků karty, např. alokace paměti, inicializace FreeRTOS úloh, front, ... Posledním úkolem funkce je spustit FreeRTOS plánovač. Projektové soubory jsou rozděleny do čtyř skupin/adresářů: Základní konfigurace Digitální I/O USB karty Jelikož byla navrhnuta a vyrobena vlastní Digitální I/O USB karta, tak je nutné nejdříve nadefinovat, jak je karta zapojená a jaké periferie se používají. Základní konfigurace se nachází v adresáři src/ASF/common/boards/user_board/. V hlavičkovém souboru user_board.h jsou makra definující, jak jsou jednotlivé periferie (I/O expandér, SRAM, porty, · · ·) namapované na fyzické zapojení jednotlivých pinů mikrokontroléru. Pokud by v nové verzi karty došlo ke změně zapojení, pak postačí změnit pouze definici maker v tomto hlavičkovém souboru. V souboru init.c se nachází funkce board_init, v níž je provedena základní konfigurace mikrokontroléru. Konfigurační soubory Konfigurační soubory se nachází v adresáři src/config/. Lze zde nalézt konfigurační soubory pro hodinový generátor, USB, FreeRTOS, jednotlivé úlohy atd. Podpůrné funkce Adresář src/support/ obsahuje již vlastní zdrojové kódy například pro USB, I/O expandér TCA6416A, funkce pro zápis/čtení z portů karty PA – PD apod. FreeRTOS úlohy Pro každou úlohu byl vytvořen jeden hlavičkový a zdrojový soubor v adresáři src/tasks/.
54
5.1
FreeRTOS
Na kartě je implementován operační systém reálného času FreeRTOS [15], který je poskytován zdarma a to i pro komerční projekty. Složitost současné implementace Digitální I/O USB karty není natolik vysoká, aby bylo nezbytně nutné použít operační systém reálného času. Jeho přednosti teprve vyniknou pro autonomní režim (v současné době není implementován). V autonomním režimu bude FreeRTOS využit pro časování, předzpracování dat (např. filtrace) a odesílání naměřených dat aplikaci. Pro zajištění modularity a přehlednosti programu byla vytvořena jednoduchá šablona (src/tasks/template.h), ze které vychází všechny úlohy. Pro každou úlohu je vytvořena jedna fronta1 určená pro zasílání zpráv dané úloze. Zpráva je tvořenou strukturu, která musí obsahovat, alespoň jednu položku – výčtový typ definující typ zprávy. Další položky struktury zprávy již závisí na konkrétní úloze. Tyto řídicí fronty jsou pak předávány jako vstupní parametr pouze úlohám, které s danou úlohou potřebují komunikovat.
5.1.1
Hlavní řídící úloha
Komunikace s kartou probíhá přes sériové rozhraní USB, pro kterou bylo v mikrokontroléru nakonfigurováno šest koncových bodů, vždy dva pro jeden typ přenosu. Celkově se tedy využívají tři typy přenosů: • Řídicí přenosy slouží pro přenos konfigurace do nebo z karty. • Přerušovací přenosy jsou určeny pro rychlý přenos dat do nebo z karty. Například pro nastavení výstupů nebo pro přečtení vstupů. • Hromadné přenosy budou použity pro přenos testovacích skriptů do karty. Úloha controller_task na základě požadavku poslaného z aplikace provede konfiguraci karty. Po úspěšném nakonfigurování karty je povolený datový přenos přes přerušovací koncový bod.
5.1.2
Úloha pro ovládání I/O expandéru
I/O expandér je jeden ze sdílených prostředků, ke kterému může požadovat přístup více úloh. Pro jeho zapouzdření byla vytvořena úloha ports_controller_task. Tedy pouze tato úloha má přímý přístup k I/O expandéru. Všechny ostatní musí zaslat zprávu s požadavkem přes řídicí frontu. Je definováno pět zpráv: • PORTS_CNTR_MSG_LED_SET: Rozsvícení/zhasnutí LED. • PORTS_CNTR_MSG_PWR_SET: Připojení/Odpojení napájení portů. 1
Synchronizační prostředek FreeRTOS sloužící pro komunikaci mezi úlohami.
55
• PORTS_CNTR_MSG_DIR_SET: Konfigurace portu jako vstupního/výstupního. • PORTS_CNTR_MSG_PULL_RES_SET: Nastavení pull-up/pull-down rezistorové sítě. • PORTS_CNTR_MSG_FAULT_GET: Získá stav nadproudových ochran od jednotlivých portů.
5.1.3
Úloha pro signalizaci stavu pomocí LED
Pro signalizaci aktuálního stavu Digitální I/O USB karty je použita LED dioda připojená k I/O expandéru. LED může svítit nebo blikat s různou periodou a střídou. Pro zajištění časování byla vytvořena úloha run_led_task. Úloha má nastavenou nejnižší prioritu, jelikož nedodržení časování nemá žádný vliv na vnitřní stav karty. Pro úlohu je definováno pět zpráv, např. RUN_LED_RUN_ON, RUN_LED_MSG_ERROR, · · · Tyto zprávy korespondují se stavy definovanými v kapitole 4.1.4. Zasláním zprávy přes řídicí frontu úlohy dojde k nastavení LED do požadovaného stavu. Úloha nepřistupuje k I/O expandéru přímo, ale musí poslat zprávu úloze ports_controller_task, která teprve LED rozsvítí nebo zhasne.
56
6
KNIHOVNA DIGITALIOUSBCARD
V následujících kapitolách bude popsán Windows ovladač a knihovna pro Digitální I/O USB kartu DigitalIOUSBCard.dll, dále označovanou pouze jako DigitalIOUSBCard. Zdrojové kódy lze nalézt na CD ve složce /Software/Knihovna/.
6.1
Vývojové prostředky
V prvním kroku bylo nutné zvolit zda aplikace bude napsána v řízeném kódu (managed code) nebo v neřízeném/nativním kódu (unmanaged code) [17]. Řízený kód běží pod správou běhového prostředí odpovídající za správný běh aplikace. Aplikace tedy není přeložena do strojového kódu, ale platformě nezávislého mezijazyka označovaného jako CIL (Common Intermediate Language, který je až za běhu aplikace přeložen pomocí JIT (Just In Time) do strojového jazyka aktuální platformy. Hlavními přednostmi řízeného kódu jsou kontrola datových typů běhovým prostředí, správa paměti, automatické uvolňovaní paměti pomocí GC (Garbage collector), platformní nezávislost, vyšší bezpečnost. Představitelem řízeného kódu je dnes populární programovací jazyk C# nebo VB.NET. Naproti tomu neřízený kód je spjat s konkrétní platformou. Pro použití na jiné platformě je nutné zdrojový kód přeložit. Neexistuje zde žádný správce paměti což znamená, že programátor se musí sám postarat o uvolnění alokované paměti. Výhodou neřízeného kódu jsou nižší paměťové nároky a vyšší výkon 1 . Typickými představiteli neřízeného jazyka jsou programovací jazyky C, C++, VB6. Knihovna DigitalIOUSBCard bude využívána ve dvou nástrojích vyvinutých ve společnosti Honeywell. Starší z nich je napsán v programovacím jazyku VB6, pro který je knihovna DigitalIOUSBCard primárně vyvíjena, a druhý v jazyce C#. Samotná USB knihovna libusbK je napsána v jazyce C. Ať už bude knihovna DigitalIOUSBCard napsána v řízeném nebo neřízeném kódu, tak pokaždé bude nutné provést tzv. marshalování (marshalling). Marshalování je proces sloužící zajištění kompatibility přenášených dat mezi oddělenými částmi programu, tedy v tomto případě mezi řízeným a neřízeným kódem [17]. Marshalování tak má nenulový vliv na výkon. Pro knihovnu DigitalIOUSBCard byl tak zvolen programovací jazyk C. Pro programování knihovny bylo použito vývojové prostředí Microsoft Visual Studio Ultimate 2012 a knihovna libusbK verze 3.0.7.0. 1
Toto tvrzení nemusí platit za všech okolností. U řízeného kódu dochází k překladu do strojového jazyka za běhu aplikace a tedy překladač může lépe provést optimalizaci výsledného strojového kódu pro aktuální platformu [45].
57
6.2
API rozhraní
V následujících kapitolách bude popsáno API rozhraní navržené knihovny DigitalIOUSBCard.
6.2.1
Exportování funkcí z DLL knihovny
Aby bylo možné použít knihovnu v jiných aplikacích, se musí dodržet některé zásady popsané například v [11]. Pro zpřístupnění funkcí v API rozhraní je nutné, je exportovat. To lze provést dvěma způsoby. První možnost je použití definičního souboru .def, ve kterém musí být uvedeny všechny exportované funkce. Druhou jednodušší možností je mechanizmus přímého linkování, kdy musí být exportované funkce v hlavičkovém souboru deklarovány pomocí __declspec(dllexport) při překladu DLL (Dynamic-Link Library) knihovny. Naopak při statickém linkování knihovny do aplikace je vhodné v hlavičkovém souboru uvést __declspec(dllimport), což umožní překladači provést optimalizaci kódu [28]. V případě použití C++ překladače je zapotřebí před deklaraci funkce uvést extern "C", aby překladač nedoplňoval dekoraci ke jménu funkce (name mangling)2 . Ve výpisu 6.1 je definováno makro EXPORT sloužící pro označení exportovaných funkcí z DLL knihovny za předpokladu, že je definováno makro COMPILING_DLL. Použití makra je uvedeno na řádku 17. Pro lepší přehlednost nebude již toto makro nadále uváděno u ostatních funkcí API rozhraní.
6.2.2
Obecná pravidla při návrhu API rozhraní
Návrh API rozhraní knihovny DigitalIOUSBCard byl částečně inspirován podle knihovny pro USB-DIO-32-E [3], tak aby Digitální I/O USB karta mohla být používána v režimu kompatibilním s USB-DIO-32-E. Pro přehlednější práci s knihovnou bylo dodržováno několik zásad: • Název každé funkce, struktury, výčtového typu enum nebo konstanty z API rozhraní knihovny začíná předponou DIO_, (Digitální I/O USB karta). • Všechny funkce3 vrací výčtový typ enum DIO_Errors_t, ve kterém jsou definovány chybové stavy, které mohou nastat při volání funkcí z API rozhraní4 . 2
Dekorace jmen je technika sloužící pro rozlišení datových struktur nebo funkcí, které by jinak linker nedokázal jednoznačně identifikovat. Typickým příkladem je přetěžování funkcí v jazyce C++ [17]. 3 S výjimkou funkce DIO_GetDevices. 4 Je-li operace vykonána úspěšně, pak se vrátí DIO_ERROR_SUCCESS odpovídající hodnotě 0. Dále jsou definovány dvě hlavní skupiny. První začíná s DIO_ERROR_ALREADY_. Tato skupina znamená, že operace již byla provedena (např. karta je již použita) a nemohla být provedena znovu.
58
Kód 6.1: Makro pro export funkcí z DLL knihovny. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#i f d e f __cplusplus # define NOMANGLE extern "C" #e l s e # define NOMANGLE #endif #i f d e f WIN32 # i f d e f COMPILING_DLL # define EXPORT NOMANGLE __declspec ( d l l e x p o r t ) # else # define EXPORT NOMANGLE __declspec ( d l l i m p o r t ) # endif #e l s e # define EXPORT NOMANGLE #endif EXPORT DIO_Errors_t D I O _ I n i t i a l i z e ( void ) ;
• Pro anotaci parametrů funkcí je použit jazyk SAL (zejména pro definování, které parametry jsou vstupní nebo výstupní). • Volající funkce (tedy funkce v aplikaci používající knihovnu DigitalIOUSBCard) je zodpovědná za alokování a uvolňování paměti spojené s předávanými parametry do volané knihovní funkce.
6.2.3
Obecné funkce pro práci s knihovnou
Ve výpisu 6.2 jsou uvedené prototypy obecných funkcí pro práci s knihovnou. Aplikace využívající knihovnu musí jako první funkci zavolat DIO_Initialize. Funkce provede základní inicializaci knihovny jako je inicializace knihovny libusbK, vytvoření seznamu připojených Digitálních I/O USB karet, vytvoření sdílené paměti apod. Po ukončení práce s knihovnou musí aplikace zavolat funkci DIO_Clear, která naopak uvolní všechny prostředky alokované knihovnou. Další funkcí je DIO_GetDevices, která vrátí celkový počet připojených Digitálních I/O USB karet. Poslední funkcí v této sekci je DIO_GetDeviceInfo. Tato funkce pro zadaný index karty vrátí strukturu obsahující základní informace o kartě, např. sériové číslo karty, verze firmwaru, počet portů, počet kanálů apod.
6.2.4
Konfigurační funkce
Než je možné jakkoliv manipulovat se zvolenou kartou, musí být nejdříve zavolaná funkce IO_OpenDevice, která má jako vstupní parametr index karty. Funkce jednak Druhá skupina začínající s DIO_ERROR_FAIL_ má závažnější charakter, např. karta je odpojena. Podrobnější popis lze nalézt přímo ve zdrojovém kódu knihovny.
59
Kód 6.2: Obecné funkce pro práci s knihovnou. 1 2 3 4 5 6 7 8 9 10 11
/∗ I n i c i a l i z a c e k n i h o v n y ∗/ DIO_Errors_t D I O _ I n i t i a l i z e ( void ) ; /∗ U v o l n ě n í p r o s t ř e d k ů a l o k o v a n é knih ovno u ∗/ DIO_Errors_t DIO_Clear ( void ) ; /∗ V r á t í p o č e t p ř i p o j e n ý c h D i g i t á l n í c h I /O USB k a r e t ∗/ UINT32 DIO_GetDevices ( void ) ; /∗ V r á t í z á k l a d n í i n f o r m a c e o D i g i t á l n í I /O USB k a r t ě ∗/ DIO_Errors_t DIO_GetDeviceInfo (_In_ UINT32 Module , _Out_ DIO_DeviceInfo_t ∗ DeviceInfo ) ;
nastaví ve sdílené paměti zámek pro kartu, aby se zamezilo manipulací s kartou jinou instancí knihovny DigitalIOUSBCard. V druhém kroku je provedena konfigurace USB rozhraní karty, čímž se povolí přerušovací a hromadné přenosy. Tento stav je signalizován rozsvícením LED na Digitální I/O USB kartě. Pro zavření karty slouží dvě funkce IO_CloseDevice a IO_CloseDevices. První funkce zavře pouze jednu zvolenou kartu a druhá funkce zavře všechny otevřené karty. Po zavření taktéž zhasne LED na kartě. Prototypy funkcí pro otevření a zavření karet jsou uvedené ve výpisu 6.3. Kód 6.3: Funkce pro otevření a zavření zvolené Digitální I/O USB karty. 1 2 3 4 5 6 7 8
/∗ O t e v ř e s e komunikační s p o j e n í s e z v o l e n o u k a r t o u ∗/ DIO_Errors_t DIO_OpenDevice (_In_ UINT32 Module ) ; /∗ Zavře s e komunikační s p o j e n í s k a r t o u ∗/ DIO_Errors_t DIO_CloseDevice (_In_ UINT32 Module ) ; /∗ Zavře s e komunikační s p o j e n í s e všemi o t e v ř e n ý m i k a r t a m i ∗/ DIO_Errors_t DIO_CloseDevices ( void ) ;
Ve výpisu 6.4 jsou uvedené funkce sloužící pro konfiguraci karty. První funkce DIO_SetDeviceConfiguration je určená pro nastavení karty. Mód karty je nastaven pomocí parametru DeviceBehavior. Druhým předávaným parametrem je pole struktur PortsConfiguration definujících konfiguraci jednotlivých portů karty 5 . Pokud byla karta nakonfigurována v módu DIO_E_MODE_ACCES_DIO, pak LED na kartě začne blikat 4.1.4. Funkce DIO_GetDeviceConfiguration vrátí aktuální konfiguraci karty. Parametry mají totožný význam jako u předešlé funkce. 5
Konfigurace portu jako vstupního nebo výstupního, výběr mezi pull-up/pull-down rezistorovou sítí a výchozí nastavení výstupů.
60
Kód 6.4: Konfigurační funkce. 1 2 3 4 5
/∗ Funkce p r o v e d e k o n f i g u r a c i p o r t ů k a r t y a n a s t a v í j e j í mód ∗/ DIO_Errors_t D I O _ S e t D e v i c e C o n f i g u r a t i o n (_In_ UINT32 Module , _In_ DIO_Behavior_t D e v i c e B e h a v i o r , _In_ DIO_PortConfig_t P o r t s C o n f i g u r a t i o n [DIO_MAX_PORTS] ) ; /∗ Funkce v r á t í a k t u á l n í k o n f i g u r a c i k a r t y ∗/ DIO_Errors_t DIO_GetDeviceConfiguration (_In_ UINT32 Module , _Out_ DIO_Behavior_t ∗ D e v i c e B e h a v i o r , _Out_ DIO_PortConfig_t P o r t s C o n f i g u r a t i o n [DIO_MAX_PORTS] ) ;
6.2.5
Funkce pro přímý zápis/čtení
Pokud je knihovna inicializovaná, Digitální I/O USB karta je řádně otevřená a nakonfigurovaná v módu DIO_E_MODE_ACCES_DIO, pak je povoleno použít následující funkce pro zápis (výpis 6.5) a čtení (výpis 6.6). Funkci DIO_WriteAll je předáno bajtové pole dat, kde každý bajt odpovídá jednomu z portů karty. Pokud je některý z portů nakonfigurovaný jako vstupní, pak se příslušný bajt ignoruje. Pro zápis na konkrétní port je určena funkce DIO_Write8. Poslední funkce DIO_Write1 umožňuje nastavení konkrétního kanálu karty 6 . Kód 6.5: Funkce pro přímé nastavení výstupů. 1 2 3 4 5 6 7 8
/∗ Funkce n a s t a v í v ý s t u p y u v š e c h p o r t ů n a k o n f i g u r o v a n ý c h j a k o v ý s t u p n í ∗/ DIO_Errors_t DIO_WriteAll (_In_ UINT32 Module , _In_ UINT8 Data [DIO_MAX_PORTS] ) ; /∗ Funkce pro n a s t a v e n í v ý s t u p ů j e d n o h o p o r t u ∗/ DIO_Errors_t DIO_Write8 (_In_ UINT32 Module , _In_ UINT32 PortIndex , _In_ UINT8 Data ) ; /∗ Funkce n a s t a v í j e d e n k a n á l ∗/ DIO_Errors_t DIO_Write1 (_In_ UINT32 Module , _In_ UINT32 Channel , _In_ BOOL Data ) ;
Kód 6.6: Funkce pro přímé čtení vstupů. 1 2 3 4 5 6 7 8
/∗ Funkce p ř e č t e s t a v y v s t u p ů na v š e c h p o r t e c h ∗/ DIO_Errors_t DIO_ReadAll (_In_ UINT32 Module , _Out_ UINT8 Data [DIO_MAX_PORTS] ) ; /∗ Funkce p ř e č t e s t a v v s t u p ů na zvoleném p o r t u ∗/ DIO_Errors_t DIO_Read8 (_In_ UINT32 Module , _In_ UINT32 PortIndex , _Out_ UINT8 ∗ Data ) ; /∗ Funkce p ř e č t e s t a v j e d n o h o k a n á l u ∗/ DIO_Errors_t DIO_Read1 (_In_ UINT32 Module , _In_ UINT32 Channel , _Out_ BOOL ∗ Data ) ;
6
Kanál 0 odpovídá portu PA.0, · · ·, kanál 7 portu PA.7, kanál 8 portu PB.0, · · ·
61
6.3
Autonomní režim
V této kapitole budou popsány funkce určené pro autonomní režim Digitální I/O USB karty, které ale z časových důvodů nejsou v současné chvíli implementovány.
6.3.1
Popis autonomního režimu
Účelem vývoje Digitální I/O USB karty byla potřeba zajistit odezvu výstupů na vstupy v reálném čase (v řádu desetin až jednotek milisekund). V současném řešení je testovací skript vykonáván řádek po řádku testerem běžícím na počítači. Testovací skript je ve formě obyčejného textového souboru, u kterého je definována jednoduchá syntaxe. Tester nejdříve textový soubor načte, zpracuje a poté jej může začít vykonávat. Každý řádek skriptu definuje následující: • Nastavení výstupů • Vstupy, na kterých nezáleží • Vstupy, které nesmí změnit svůj stav • Vstupy, které musí změnit stav • Časový interval během pouze kterého může dojít ke změně stavu vstupů Nesplnění libovolné výše popsané podmínky znamená ukončení celého testovacího skriptu. Pokud jsou podmínky splněny během celého časového intervalu, pak tester může přejít k dalšímu řádku skriptu. Zajistit odezvu v reálném čase lze přesunutím logiky testeru vykonávající řádky testovacího skriptu přímo do mikrokontroléru. Tímto krokem je pak eliminováno zpoždění způsobené jak sběrnicí USB tak operačním systémem. Z tohoto pohledu lze zvolit dva přístupy: 1. Skript bude testerem běžícím na počítači posílán do Digitální I/O USB karty po částech. 2. Celý skript bude nejdříve nahrán do karty, která jej pak bude postupně vykonávat. První způsob má výhodu v menších nárocích na paměť zabudovanou na kartě a jednodušší implementaci firmwaru. Skript by byl uložen v kruhové vyrovnávací paměti, kde by se z plné části vyčítaly a vykonávaly jednotlivé řádky skriptu. Nové části skriptu by se ukládaly do volné oblasti vyrovnávací paměti. Tester běžící na počítači by pouze musel zabezpečit, že vyrovnávací paměť nebude nikdy prázdná před dokončením celého skriptu. Ve firmwaru karty by taktéž nemusely být řešeny smyčky a nepodmíněné skoky, jelikož toto je již řešeno v samotném testeru. Tedy tester by do karty posílal, již zpracovaný skript a v kartě by byl pouze vykonáván. Nahrání celého skriptu do paměti karty je druhou možností. Paměť musí mít dostatečnou kapacitu pro celý skript. Pro představu mívají skripty typicky několik
62
desítek až maximálně několik stovek řádků. Jak bude ukázáno dále, jeden řádek skriptu má velikost 𝑅 = 32 B. K dispozici je SRAM paměť o velikosti 𝑀 = 512 kB. Pokud bychom chtěli použít celou paměť pouze pro skript, pak lze podle 6.1 spočítat maximální počet řádků 𝑆 ve skriptu. Skript tedy může mít maximálně 16384 řádků, což řádově převyšuje maximální očekávanou délku skriptu. Na rozdíl od předešlého případu se bude muset vypořádat i se smyčkami a nepodmíněnými skoky. 𝑆=
524288 𝑀 = = 16384 𝑅 40
(6.1)
Ať už by se zvolil jakýkoliv výše navrhovaný přístup, tak pokaždé by to znamenalo zásah do zdrojového kódu testeru, který není přizpůsoben pro popsané režimy. První přístup (nahrávání po částech) vyžaduje interpretaci skriptu na straně testeru, kdežto u druhého přístupu je veškerá logika implementovaná v kartě. Samotný tester by sloužil pouze pro načtení textového souboru testovacího skriptu, uložení skriptu do Digitální I/O USB karty a vypisování výsledků uživateli. Byl zvolen tento druhý přístup.
6.3.2
API funkce pro zápis testovacího skriptu
Ve výpisu 6.7 jsou funkce určené pro zápis testovacího skriptu do Digitální I/O USB karty. První musí být zavolána funkce DIO_BeginSendScript, které připraví knihovnu a kartu pro zpracování nového skriptu. Operace zapisování lze zastavit zavoláním funkce DIO_StopSendScript. Jakmile aplikace odešle celý skript do knihovny, pak pro dokončení se musí zavolat funkce DIO_EndSendScript, jež spustí nahraný skript na kartě. Kód 6.7: Funkce pro zápis skriptu. 1 2 3 4 5 6 7 8 9 10 11 12 13 14
/∗ Funkce určená pro z a h á j e n í o d e s í l á n í s k r i p t u ∗/ DIO_Errors_t DIO_BeginSendScript (_In_ UINT32 Module ) ; /∗ Po z a v o l á n í f u n k c e bude s k r i p t s p u š t ě n ∗/ DIO_Errors_t DIO_EndSendScript (_In_ UINT32 Module ) ; /∗ P ř e r u š í o p e r a c i o d e s í l á n í s k r i p t u ∗/ DIO_Errors_t DIO_StopSendScript (_In_ UINT32 Module ) ; /∗ Z a p í š e s e p ř í k a z s k r i p t u ∗/ DIO_Errors_t DIO_WriteScriptCommand (_In_ UINT32 Module , _In_ DIO_ScriptCommand_t ScriptCommnad ) ; /∗ Z a p í š e s e j e d e n ř á d e k s k r i p t u ∗/ DIO_Errors_t DIO_WriteScriptLine (_In_ UINT32 Module , _In_ DIO_ScriptLine_t CommandLine ) ;
63
Struktura jednoho řádku testovacího skriptu V dalším kroku může již aplikace posílat jeden řádek skriptu za druhým funkcí DIO_WriteScriptLine, které jsou průběžně zapisovány do karty. Vstupním parametrem funkce je struktura DIO_ScriptLine_t, jenž má následující strukturu7 : • UINT8 Outputs[DIO_MAX_PORTS]: Bajtové pole definující stav výstupů pro jednotlivé porty karty. Pokud je daný port nakonfigurován jako vstupní, pak je hodnota ignorována. • UINT8 Mask_Zero[DIO_MAX_PORTS]: Bajtové pole definující masku vstupů, které musí zůstat po dobu vykonávání řádku skriptu v logické nule. Pro porty konfigurované jako výstupní, je maska ignorována. • UINT8 Mask_Ones[DIO_MAX_PORTS]: Bajtové pole definující masku vstupů, které musí zůstat po dobu vykonávání řádku skriptu v logické jedničce. • UINT8 Mask_Rise[DIO_MAX_PORTS]: Bajtové pole definující masku vstupů, které musí změnit svůj stav z logické nuly do logické jedničky v časovém intervalu < 𝑊 𝑎𝑖𝑡𝑇 𝑖𝑚𝑒, 𝑊 𝑎𝑖𝑡𝑇 𝑖𝑚𝑒 + 𝑇 𝑖𝑚𝑒𝑜𝑢𝑡 >. • UINT8 Mask_Fall[DIO_MAX_PORTS]: Bajtové pole definující masku vstupů, které musí změnit svůj stav z logické jedničky do logické nuly v časovém intervalu < 𝑊 𝑎𝑖𝑡𝑇 𝑖𝑚𝑒, 𝑊 𝑎𝑖𝑡𝑇 𝑖𝑚𝑒 + 𝑇 𝑖𝑚𝑒𝑜𝑢𝑡 >. • UINT32 WaitTime: Definuje časový interval8 během kterého nesmí dojít k žádné změně u libovolného vstupu. • UINT32 Timeout: Definuje časový interval během kterého naopak musí dojít ke změně všech vstupů definovaných maskami Mask_Rise a Mask_Fall. Z výše uvedeného vyplývá, má-li se řádek skriptu vyhodnotit úspěšně, že minimální doba vykonávaní je 𝑊 𝑎𝑖𝑡𝑇 𝑖𝑚𝑒 a maximální doba vykonávání řádku skriptu může být 𝑊 𝑎𝑖𝑡𝑇 𝑖𝑚𝑒 + 𝑇 𝑖𝑚𝑒𝑜𝑢𝑡. Pro kartu se čtyřmi porty má struktura velikost 28 B. Aby karta při vyhodnocování skriptu dokázala rozlišit řádek skriptu od příkazu, tak je třeba ještě vyhradit 4 B pro tento účel. Tedy celková velikost bude 32 B. Tato velikost bude totožná i pro příkaz, i když se větší část nevyužije. Výhodou bude jednodušší implementace firmwaru karty. Struktura příkazu Testovací skript není jen posloupnost řádků skriptu popsaných výše, ale i příkazů umožňující opakování určité sekvence. Každý příkaz může mít až tři argumenty. Digitální I/O USB karta bude podporovat všechny příkazy definované pro testovací skripty: 7 8
Struktura je založena na syntaxi používané pro testovací skripty. Začátek intervalu je daný okamžikem, kdy se začne vykonávat aktuální řádek skriptu.
64
• DIO_E_COMMAND_LABEL: Příkaz pro definování nového návěstí. Textový řetězec bude knihovnou DigitalIOUSBCard přeložen na adresu, kde první řádek skriptu bude mít adresu 0. • DIO_E_COMMAND_CYCLE: Příkaz pro smyčku typu for. Příkaz definuje konec bloku smyčky. Prvním argumentem je návěstí definující začátek bloku smyčky. Druhým argumentem je celé kladné číslo určující počet opakování bloku smyčky. • DIO_E_COMMAND_GOTO: Nepodmíněný skok. Jediným argumentem je návěstí, na které se má skočit. Pro odeslání příkazu je určena funkce DIO_WriteScriptCommand, jejíchž argumentem je struktura definující příkaz.
6.3.3
API funkce pro čtení výsledků skriptu
Funkce pro čtení výsledků testů jsou ve výpisu 6.8. Obecný stav právě vykonávaného skriptu lze získat funkcí DIO_GetScriptStatus, tedy jestli je skript stále vykonáván, byl úspěšně ukončen nebo skončil chybou. Jak bylo řečeno, po každém provedení jednoho řádku skriptu se uloží jeho doba vykonání a stav vstupů. Aktuální počet výsledků lze získat funkcí DIO_GetScriptLineResultCount a vyčíst je lze funkcí funkcí DIO_ReadScriptLineResult. Kód 6.8: Funkce pro čtení výsledků skriptu. 1 2 3 4 5 6 7 8
/∗ Z í s k á n í g l o b á l n í h o s t a v u a k t u á l n ě vykonávaného s k r i p t u ∗/ DIO_Errors_t DIO_GetScriptStatus (_In_ UINT32 Module , _Out_ DIO_E_ScriptResult_t ∗ ScriptStatus ) ; /∗ V r á t í p o č e t v ý s l e d k ů u l o ž e n ý c h ve v y r o v n á v a c í paměti k a r t y ∗/ DIO_Errors_t DIO_GetScriptLineResultCount (_In_ UINT32 Module , _Out_ UINT32 ∗ ResultsCount ) ; /∗ V r á t í n e j s t a r š í u l o ž e n ý v ý s l e d e k pro vykonaný ř á d e k s k r i p t u ∗/ DIO_Errors_t DIO_ReadScriptLineResult (_In_ UINT32 Module , _Out_ DIO_ScriptLineResult_t ∗ CommandLineResult ) ;
65
7
ZÁVĚR
Diplomová práce se zabývala návrhem Digitální I/O USB karty. V první části byl proveden rozbor zadání a zjištění nedostatků aktuálního řešení. Druhá část byla zaměřena na teoretický rozbor práce ze zaměřením na specifikaci sběrnice USB 2.0 a možností implementace ovladačů USB zařízení v operačních systémech Microsoft Windows. V další části byly analyzovány požadavky na mikrokontrolér a jeho periferie. Významná část práce se věnovala samotnému návrhu hardwaru karty. Byl zvolen mikrokontrolér ATSAM3S2C, který má interní paměť SRAM o velikosti 32 kB. V autonomním režimu se budou testovací skripty ukládat do karty, která je poté bude vykonávat. Aby bylo možné celý testovací skript uložit na kartu, byla připojena k mikrokontroléru externí paměť SRAM o velikosti 512 kB. Pro přenos dat z mikrokontroléru do počítače je určena USB sběrnice. USB sběrnice je galvanicky oddělená obvodem ADUM3160 pro zamezení zemních smyček, rušení a ochranu USB portu počítače. Maximální podporovaná rychlost sběrnice je Full-Speed. Digitální I/O USB karta byla navržena se čtyřmi porty, každý po osmi datových linkách. Porty jsou obousměrné a lze je programově konfigurovat, jestli se mají chovat jako výstupní nebo vstupní. Porty mají na jednotlivých datových linkách zabudovanou nadproudovou a ESD ochranu. U všech portů lze programově volit mezi pull-up a pull-down rezistory. Napájení desky je zajištěno dvěma způsoby. Prvním je možnost napájení přímo z USB sběrnice přes DC/DC izolující měnič. Tento způsob napájení s sebou přináší omezení v podobě omezené konfigurovatelnosti portů, kdy lze nastavit pouze dva jako výstupní. To je způsobeno maximálním povoleným odebíraným proudem ze sběrnice USB na 500 mA. Druhou možností je připojení externího adaptéru, s nímž již může deska pracovat bez jakéhokoliv omezení. Adaptér pak může být jak DC tak AC. Předposlední část práce byla zaměřena na vývoj firmwaru pro Digitální I/O USB kartu. Pro kartu byla zvolena USB třída „Vendor Specific Class“, jenž nabízí největší volnost při implementaci komunikačních protokolů mezi hostem (počítačem) a USB zařízením. Na kartě byly úspěšně zprovozněny a ověřeny všechny její periferie. V poslední části byla řešena problematika ovladačů karty na operačním systému Microsoft Windows. Pro přístup k samotné USB sběrnici byl zvolen ovladač a knihovna libusbK. Poté byla naprogramována knihovna DigitalIOUSBCard v jazyce C pro správu a komunikaci se všemi připojenými Digitálními I/O USB kartami. V knihovně jsou implementovány funkce pro konfiguraci a pro přímý zápis/čtení z jednotlivých portů karty.
66
Výsledek diplomové práce lze shrnout následovně. V rámci práce byla navrhnuta, vyrobena a ověřena funkčnost Digitální I/O USB karty. Pomocí naprogramované knihovny lze kartu nakonfigurovat, nastavit požadovaným způsobem výstupy a přečíst stav vstupů. Také měl být realizován autonomní režim, pro který je sice navrženo API rozhraní v DigitalIOUSBCard knihovně, ale už není nikde implementován. Nakonec pro reálné použití Digitální I/O USB karty v Honeywellu bude nutné upravit program testeru, což už ale není součástí zadaní diplomové práce.
67
LITERATURA [1] ACCES I/O Products, Inc. PCI-IDI Series [online]. San Diego, 2013[cit. 28. 12. 2013]. Dostupné z URL:
. [2] ACCES I/O Products, Inc. USB-DIO-32 [online]. San Diego, 2013[cit. 28. 12. 2013]. Dostupné z URL: . [3] ACCES I/O Products, Inc. USB Software Reference Manual [online]. San Diego, 2013- [cit. 10. 5. 2014]. Dostupné z URL: . [4] ALLIANCE MEMORY INC. 512K X 8 BIT LOW POWER CMOS SRAM [online]. Last modif. 8/2013 [cit. 3. 1. 2014]. Dostupné z URL: . [5] ANALOG DEVICES, INC. Full/Low Speed 2.5 kV USB Digital Isolator, Datasheet [online]. Rev.: B, 2013- [cit. 3. 1. 2014]. Dostupné z URL: . [6] ATMEL CORPORATION. Atmel Software Framework: ASF Architecture. asf.atmel.com [online]. © 2012 [cit. 15. 5. 2014]. Dostupné z URL: . [7] ATMEL CORPORATION. AT91SAM ARM-based Flash MCU, SAM3S Series, Datasheet [online]. Rev.: 6500E-ATARM-11-Feb-13, Last modif. 11. 2. 2013 [cit. 3. 1. 2014]. Dostupné z URL: . [8] ATMEL CORPORATION. SAM3S-EK Development Board, User Guide [online]. Rev.: 11031C-ATARM-30-Mar-11, Last modif. 30. 3. 2011 [cit. 3. 1. 2014]. Dostupné z URL: . [9] ATMEL CORPORATION. Atmel AVR1017: XMEGA - USB Hardware, Design Recommendations [online]. Rev.: 8388A-AVR-07/11, 2011- [cit. 3. 1. 2014]. Dostupné z URL: . [10] ATMEL CORPORATION. ASF USB Device HID Generic. asf.atmel.com [online]. © 2014 [cit. 10. 5. 2014]. Dostupné z URL: .
68
[11] CHALUPA, Radek. 1001 tipů a triků pro Visual C++ Brno: Computer Press, 2003. ISBN 80-7226-842-2. [12] COMPAQ COMPUTER CORPORATION, HEWLETT-PACKARD COMPANY, INTEL CORPORATION, et al. Universal Serial Bus Specification Revision 2.0 [online]. Last modif. 27. 4. 2000 [cit. 15. 5. 2014]. Dostupné z URL: . [13] DIOLAN. USB-GPIO Interface Adapters Comparison [online]. Israel, 2013[cit. 28. 12. 2013]. Dostupné z URL: . [14] FARCHILD SEMICONDUCTOR. BAT54/A/C/S Schottky Diodes [online]. Rev.: E2, 2012- [cit. 4. 1. 2014]. Dostupné z URL: . [15] FREERTOS𝑇 𝑀 . FreeRTOS𝑇 𝑀 .FreeRTOS.org [online]. © 2010 [cit. 10. 5. 2014]. Dostupné z URL: .
-
2013
[16] FROELICH Dan. Data Transfer & Framework [online]. Last modif. 11. 6. 2002 [cit. 28. 12. 2013]. Dostupné z URL: . [17] GRÁCÍK, Martin. Automatizace napojení C++ kódu do .Net rozhraní : Diplomová práce. Brno: Masarykova univerzita, Fakulta Informatiky, 2010. 53s. Vedoucí práce byl RNDr. Vojtěch Řehák, Ph.D.. [18] JŮN, Lukáš. Vývojový modul s 32-bitovým procesorem typu ARM : Diplomová práce. Brno: Vysoké učení technické v Brně, Fakulta elektrotechniky a komunikačních technologií, 2009. 39s. Vedoucí práce byl Ing. Tomáš Frýza, Ph.D. [19] KOŘÍNEK, Milan. Implementace logického analyzátoru do FPGA: Bakalářská práce. Brno: Vysoké učení technické v Brně, Fakulta elektrotechniky a komunikačních technologií, Ústav automatizace a měřicí techniky, 2012. 55s. Vedoucí práce byl Ing. František Gogol. [20] LEPKOWSKI, Jim. Application Hints for Transient Voltage Suppression Diode Circuits [online]. ON Semiconductor, Rev.: 1, Last modif. 10/2009 [cit. 3. 1. 2014]. Dostupné z URL: .
69
[21] LEPKOWSKI, Jim. PCB Design Guidelines that Maximize the Performance of TVS Diodes [online]. ON Semiconductor, Rev.: 0, Last modif. 8/2005 [cit. 1. 5. 2014]. Dostupné z URL: . [22] LIBUSB. libusb. libusb.org [online]. © 2014 [cit. 10. 5. 2014]. Dostupné z URL: . [23] LIBUSBX. libusbx. libusbx.org [online]. © 2012 - 2014 [cit. 10. 5. 2014]. Dostupné z URL: . [24] LITTLELFUSE. Axial Lead & Cartridge Fuses PICO ll > Very Fast-Acting > 251/253 Series [online]. Last modif. 03/10/2014 [cit. 4. 1. 2014]. Dostupné z URL: . [25] MALÝ, Martin. USB 2.0 - díl 1 [online]. Last modif. 22. 2. 2005 [cit. 28. 12. 2013]. Dostupné z URL: . [26] MALÝ, Martin. USB 2.0 - Typy a formáty přenosů [online]. Last modif. 19. 4. 2005 [cit. 28. 12. 2013]. Dostupné z URL: . [27] MICREL INC. MIC2090/MIC2091, Current Limiting Power Distribution Switches [online]. Last modif. 7/2011 [cit. 4. 1. 2014]. Dostupné z URL: . [28] MICROSOFT. Importing and Exporting. msdn.microsoft.cz [online]. © 2014 [cit. 10. 5. 2014]. Dostupné z URL: . [29] MICROSOFT. HID over USB. msdn.microsoft.cz [online]. © 2014 [cit. 10. 5. 2014]. Dostupné z URL: . [30] MICROSOFT. Introduction to HID Concepts. msdn.microsoft.cz [online]. © 2014 [cit. 10. 5. 2014]. Dostupné z URL: . [31] MICROSOFT. User mode and kernel mode. msdn.microsoft.cz [online]. © 2014 [cit. 10. 5. 2014]. Dostupné z URL: .
70
[32] MICROSOFT. WinUSB (Winusb.sys). msdn.microsoft.cz [online]. © 2014 [cit. 10. 5. 2014]. Dostupné z URL: . [33] NOVÁK, Jiří. 11. Logické analyzátory; 12. Metodika měření s logickým analyzátorem [online]. CVUT FEL [cit. 17. 2. 2012]. Dostupné z URL: . [34] PERRIN, Bob. I/O For Embedded Controllers, Part 1: Digital I/O. Circuit Cellar: The maganize for computer applications [online]. 9/1999 [cit. 3. 1. 2014]. Dostupné z URL: <www.circuitcellar.com/online>. [35] RECOM Electronic GmbH. ECONOLINE DC/DC-Converter [online]. Rev.: 0/2013, 2013- [cit. 3. 1. 2014]. Dostupné z URL: . [36] ROBINSON, Travis Lee. libusbK 3.0 Libraly Documentation. libusbk.sourceforge.net [online]. © 2011 [cit. 10. 5. 2014]. Dostupné z URL: . [37] TEXAS INSTRUMENTS. Selecting the Right Level-Translation Solution [online]. Rev.: SCEA035A, Last modif. 6/2009 [cit. 3. 1. 2014]. Dostupné z URL: . [38] TEXAS INSTRUMENTS. SN74LVC4245A OCTAL BUS TRANSCEIVER AND 3.3-V TO 5-V SHIFTER WITH 3-STATE OUTPUTS [online]. Last modif. 3/2005 [cit. 3. 1. 2014]. Dostupné z URL: . [39] TEXAS INSTRUMENTS. LM1575/LM2575/LM2575HV SIMPLE SWITCHER 1A Step-Down Voltage Regulator [online]. Last modif. 4/2013 [cit. 5. 5. 2014]. Dostupné z URL: . [40] TEXAS INSTRUMENTS. LVC Designer’s Guide [online]. Rev.: SCBA010, Last modif. 9/1996 [cit. 3. 1. 2014]. Dostupné z URL: . [41] TIŠNOVSKÝ, Pavel. Mikroprocesory s architekturou ARM [online]. Last modif. 6. 3. 2012 [cit. 27. 12. 2013]. Dostupné z URL: .
71
[42] TIŠNOVSKÝ, Pavel. Komunikační protokol universální sériové sběrnice [online]. Last modif. 22. 1. 2009 [cit. 28. 12. 2013]. Dostupné z URL: . [43] TXC CORPORATION. SMD Glass Sealing Crystals 5.0 x 3.2 x 1.2 mm 7A Series [online]. [cit. 1. 5. 2014]. Dostupné z URL: . [44] USB IMPLEMENTERS FORUM, INC. Universal Serial Bus. usb.org [online]. © 2014 [cit. 15. 5. 2014]. Dostupné z URL: . [45] Citace. In: Wikipedia: the free encyclopedia [online]. Just-in-time compilation: Wikipedia Foundation, 3.5. 2003, last modified on 15.5. 2014 [cit. 16. 5. 2014]. Dostupné z URL: .
72
SEZNAM SYMBOLŮ, VELIČIN A ZKRATEK ALU
Arithmetic Logic Unit
ARM
Advanced RISC Machines
ASF
Atmel Software Framework pokus
CISC
Complex Instruction Set Computer
CIL
Common Intermediate Language
CS
Chip Select
DLL
Dynamic-Link Library
DPS
Deska Plošných Spojů
ESD
Electrostatic Discharge
FPU
Floating-Point Unit
GC
Garbage collector
GCC
GNU Compiler Collection
GPIO
General-Purpose Input/Output
I2 C
Inter-Integrated Circuit
IDE
Integrated Development Environment
JIT
Just In Time
JTAG
Joint Test Action Group
LVCMOS Low Voltage CMOS MCU
Micro Controller Unit
MIPS
Million Instruction Per Second
MOSFET Metal Oxide Semiconductor Field Effect Transistor NRZI
Non-Return to Zero, Inverted
PCI
Peripheral Component Interconnect
PLL
Phase Locked Loop
73
RISC
Reduced Instruction Set Computer
RTOS
Real-Time Operating System
SCL
Synchronous Clock
SDA
Synchronous Data
SE0
Single Ended Zero
SMD
Surface Mount Device
SPI
Serial Peripheral Interface
TVS
Transient Voltage Suppressors
USB
Universal Serial Bus
USB HID USB Human Interface Device Class USB CDC USB Communications Device Class USB MSC USB Mass Storage Device Class
74
SEZNAM PŘÍLOH A Schéma Digitální I/O USB karty
76
B DPS Digitální I/O USB karty
81
C Obsah CD
84
75
A
SCHÉMA DIGITÁLNÍ I/O USB KARTY
76
E
D
C
B
A
100n
C6
+5V
3
VI
ADJ
GND
VO
Q1
12MHz
Q2
32.768kHz
C21 18pF
C16 18pF
C14 10pF
GND
GND
GND
100u/10V
C8
+3V3
IN
PA0_I PA1_I PA2_I PA3_I PA4_I PA5_I PA6_I PA7_I PB0_I PB1_I PB2_I PB3_I PB4_I PB5_I PB6_I PB7_I PC0_I PC1_I PC2_I PC3_I PC4_I PC5_I PC6_I PC7_I
1
C7
B7 C0
A7 B0
A0
+5V
49 47 45 43 41 39 37 35 33 31 29 27 25 23 21 19 17 15 13 11 9 7 5 3 1
50 48 46 44 42 40 38 36 34 32 30 28 26 24 22 20 18 16 14 12 10 8 6 4 2
D7 NC NC NC NC NC NC NC NC NC
D0
J5 GND
4 2
2
1n 100n
C36
FB OUT
C35
GND
100n
C34
+3V3
PD6_I PD7_I
PD5_I
PD4_I
PD3_I
PD2_I
PD1_I
PD0_I
Digital I/O Interface
XOUT32
XIN32
Slow Clock
XOUT
XIN
C13 10pF
100n
C7
IC2 LM1117DT-3.3/NP
2
C3
1
+
D4 Green
R7 220R
100n
10u
C38
1n 100n
C37
C40
1n 100n
C41
C42
C29
100n 1n
C28
1n 100n
C39
GND
10u
C30
R21 1R
L2 10uH/100mA
GND
C27
C26
Power 1.8V
+1.8V
100n
+1.8VGND
10u
C25
+3V3
3
1n
C43
+1.8V
61
77
60
GND
100n
C44
C46 1n 100n
C45
GND GND GND GND GND
VDDPLL1V8
VDDCORE1V8
VDDCORE1V8
VDDCORE1V8
VDDCORE1V8
VDDOUT
VDDIN3V3
VDDIO3V3
VDDIO3V3
VDDIO3V3
VDDIO3V3
VDDIO3V3
ADVREF
TST
JTAGSEL
NRST
GND +1.8V
2 26 45 70 95
100
85
56
36
16
11
10
98
91
69
50
27
1
GND
+3V3
RESET
UTXD0 PD2
GND
1 2 3
J1
C48 1n 100n
C47
C50
4
1n 100n
C49
1n
C51
PWML0/D0/PC0 PWML1/D1/PC1 PWML2/D2/PC2 PWML3/D3/PC3 NPCS1/D4/PC4 D5/PC5 D6/PC6 D7/PC7 NWE/PC8 NANDOE/PC9 NANDWE/PC10 NRD/PC11 PC12/NCS3 PWML0/NWAIT/PC13 NCS0/PC14 PWML1/NCS1/PC15 A21_NANDALE/PC16 A22_NANDCLE/PC17 PWMH0/A0/PC18 PWMH1/A1/PC19 PWMH2/A2/PC20 PWMH3/A3/PC21 PWML3/A4/PC22 TIOA3/A5/PC23 TIOB3/A6/PC24 TCLK3/A7/PC25 TIOA4/A8/PC26 TIOB4/A9/PC27 TCLK4/A10/PC28 TIOA5/A11/PC29 TIOB5/A12/PC30 TCLK5/A13/PC31
PWMH0/PB0 PWMH1/PB1 NPCS2/URDXD1/PB2 PCK2/UTXD1/PB3 TDI/PWMH2/TWD1/PB4 TDO/PWML0/TWCK1/PB5 TMS/PB6 TCK/PB7 XOUT/PB8 XIN/PB9 DDM/PB10 DDP/PB11 ERASE/PWML1/PB12 PCK0/PWML2/PB13 PWMH3/NPCS1/PB14 25 47 43 40 37 35 32 29 58 62 65 68 23 21 71 19 73 75 78 80 82 84 86 90 92 94 13 17 54 4 6 8
3 5 7 9 51 76 79 83 96 97 88 89 87 93 99
74 72 67 66 55 53 52 49 48 46 44 42 41 33 31 30 28 12 14 18 24 15 20 22 34 38 39 57 59 63 64 81
UTXD URXD GND
Debug UART
4
A17/TOA0/PA0 A18/TIOB0/PWMH1/PA1 DATRG/SCK0/PWMH2/PA2 NPCS3/TWD0/PA3 TLCK0/TWCK0/PA4 NPCS3/RXD0/PA5 PCK0/TXD0/PA6 XIN32/PWMH3/RTS0/PA7 XOUT32/ADTRG/CTS0/PA8 PWMFI0/NPCS1/URXD0/PA9 NPCS2/UTXD0/PA10 PWMH0/NPCS0/PA11 PWMH1/MISO/PA12 PWMH2/MOSI/PA13 PWMH3/SPCK/PA14 PWML3/TIOA1/TF/PA15 PWML2/TIOB1/TK/PA16 PWMH3/PCK1/TD/PA17 A14/PCK2/RD/PA18 A15/PWML0/RK/PA19 A16/PWML1/RF/PA20 PCK1/RXD1/PA21 NCS2/NPCS3/TXD1/PA22 A19/PWMH0/SCK1/PA23 A20/PWMH1/RTS1/PA24 A23/PWMH2/PA25 MCDA2/TIOA2/DCD1/PA26 MCDA3/TIOB2/DTR1/PA27 MCCDA/TCLK1/DSR1/PA28 MCCK/TCLK2/RI1/PA29 MCDA0/NPCS2/PWML2/PA30 MCDA1/PCK2/NPCS1/PA31
IC4 ATSAM3S2CA-AU
C5 220u/10V/Low ERS
600mA/Fast
F1
JP1 USB_+5V +5V
C24
100u/16V/Low ERS
C4 D2 1N5819
L1 560uH/1A
3 2 1 +
IC1 LM2575
220u/50V/Low ERS
Power 3.3V
GND
100n
C2
Main Clock
2 3
1
ON/OFF GND
5 3
3
PC0 PA1 PA0 A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13
PB4 PB6
PA6 PA3
D0 D1 D2 D3 D4 D5 D6 D7
PC6 PC5 PC4 PC3 JTAG_TDI JTAG_TDO JTAG_TMS JTAG JTAG_TCK XOUT Main Clock XIN USB_DUSB_D+ USB ERASE USB_HOST PC7
5
GND A17 A18 PA2 SDA I2C SCL IOEXP_INT PD0 XIN32 Slow Clock XOUT32 PD2 UART UTXD0 PD3 PD4 PB0 PB1 PB2 PB3 PC2 A14 A15 A16 PC1 PB7 PB5 PD7 PD6 PD5 PD1 PA7 PA5 PA4 USB_PIN
D3 Yellow
R1 220R
RUN_LED
Run LED
5
22 24 29
12 11 10 9 8 7 6 5 27 26 23 25 4 28 3 31 2 30 1
CE OE WE
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18
D0 D1 D2 D3 D4 D5 D6 D7
13 14 15 17 18 19 20 21
6
C10
GND
D6 Green
R16 220R
R15 10k
+3V3
IC7P
GND
6
1n
C31
100n
C32
USB
GND2 GND2
VBUS2 VDD2
DDDD+
PIN SPD
IC3 ADUM3160
R2 10k
JTAG_TDO RESET
JTAG_TDI JTAG_TMS JTAG_TCK
10u
C33
100n
C20
GND1 GND1
VBUS1 VDD1
UDUD+
PDEN SPU
21
GND
12
3 RESET
22 23
GND
1
R20 10k
IOEXP_INT
SCL SDA
R19 10k
+3V3 +3V3
2
C22 +3V3 100n GND
2 8
1 3
6 7
4 5
5
7
100n
C12
27R 27R
R5 10k
GNDA
100n
C11
R11 R13
R4 10k
-VIN
+VIN
Minimal load: 40mA
DC/DC CONVERTER
-VOUT
+VOUT
2
1
7
GND
~RESET
~INT
SCL SDA
ADDR
VCC1
P10 P11 P12 P13 P14 P15 P16 P17
P00 P01 P02 P03 P04 P05 P06 P07
VCCP
IC6 TCA6416APWR
VP
VN
C17
100n
RUN_LED PC_FAULT PB_FAULT PD_FAULT PA_FAULT PX_PWR PX_OE PB_PULL_RES PC_PULL_RES PD_PULL_RES PA_PULL_RES PC_DIR PB_DIR PD_DIR PA_DIR
13 14 15 16 17 18 19 20
GND
8
R14 1M
J4
GNDA
C15 1n
100n
C1
GND
GND
2 4 6 8 10 12 14 16 18 20
D+ DVBUS GND
IO2 6
NC
+5V
100n GNDA
C23
JTAG
F2 0,5A
C18
GNDA
10u
GND
GND
GND
GND
GND
GND
OBGACK GND
OBGRQ
RST
TDO
RTCK
TCK
TMS
GND
GND
NTRST TDI
VTAR
VREF
+3V3
D5 NUP2202W1
1 3 5 7 9 11 13 15 17 19
8
J3
4 5 6 7 8 9 10 11
24
+5V
1 IO1
R6 10k
+5V
IC5 RKZ-0505S (2W, 3kV)
+3.3V
R3 10k
JTAG
I/O expander
100u/16V/Low ERS
R18 C19 Load
USB_+5V
GND
15 9
16 14
SRAM 4Mbit
R17 15k
12 13
11 27R 10 27R +3V3
100n 100n
C9
GND
2
7
SPU & SPD = +3.3V: USB Full speed SPU & SPD = GND: USB Low speed
S1
+3V3
1
Reset RESET
GND R10 R12
R9 10k
USB_HOST
USB_DUSB_D+
USB_PIN
JP2 +3V3
IC7 AS6C4008-55SIN
GND
R8 10k
ERASE
Flash erase 1 2
External/USB power
GND
D1 RECTIFIER-RB1A J2 1
R
L
+
+
GNDGNDGNDGNDGNDGND
5 2
External power
2
VCC GND
4 3
1
32 16
+
USB SHLD1 SHLD2
E
D
C
B
A
E
D
C
B
A
1
DIR == L: Bn => An DIR == H: Bn <= An
GND
R24 10k
PX_OE PX_PWR
R22 10k
+5V
PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7
PX_OE PB_DIR
R39 10k
R40 R41
GND
100n
2
+5V
R37 10k
R27 R28
GND
100n
GND C59
PB_FAULT
PX_PWR
PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7
PX_OE PA_DIR
R26 10k
GND C55
PA_FAULT
PX_PWR
R23 10k
+5V
C52 10u
21 20 19 18 17 16 15 14
10k 22 10k 2
24 23 13
+3V3
3
2
4
3
1
+5V
GND
FAULT/
EN
VIN
3.3 V
5V
2
4
3
1
+5V
GND
GND
GND
FAULT/
EN
VIN
~OE DIR
3.3 V
5V
3
A0 A1 A2 A3 A4 A5 A6 A7
(5_V)_VCCA GND GND
VOUT
IC10 MIC2091-2YM5
VCCB_(3.3_V) VCCB_(3.3_V) GND
B0 B1 B2 B3 B4 B5 B6 B7
A0 A1 A2 A3 A4 A5 A6 A7
(5_V)_VCCA GND GND
I/O PORT B
C57 1u
B0 B1 B2 B3 B4 B5 B6 B7
~OE DIR
VCCB_(3.3_V) VCCB_(3.3_V) GND
VOUT
IC8 MIC2091-2YM5
IC9 SN74LVC4245ADW
GND
GND
C53 1u
I/O PORT A
IC11 SN74LVC4245ADW
C56 10u
21 20 19 18 17 16 15 14
10k 22 10k 2
24 23 13
+3V3
GND
GND
3 4 5 6 7 8 9 10
3 4 5 6 7 8 9 10
+5V
GND
GND
+5V
C58 1u
Current limiting
GND
1 11 12
5
GND
C54 1u
Current limiting
GND
1 11 12
5
D7 GND
D19
+5V
+5V
GND
D8 GND
D20
BAT54S BAT54S
+5V
4
+5V
GND
D9
4
GND
D21
BAT54S BAT54S
+5V
+5V
GND
D10 GND
D22
BAT54S BAT54S
+5V
+5V
GND
D11 GND
D23
BAT54S BAT54S
+5V
+5V
GND
D12 GND
D24
BAT54S BAT54S
+5V
+5V
GND
D13 GND
D25
BAT54S BAT54S
5
+5V
+5V
GND
D14
5
GND
D26
BAT54S BAT54S
R29 R30 R31 R32 R33 R34 R35 R36
BAT54S R42 R43 R44 R45 R46 R47 R48 R49
BAT54S
2
100R 100R 100R 100R 100R 100R 100R 100R
100R 100R 100R 100R 100R 100R 100R 100R
GND
GND
D15 PESD5V0L2BT
D27 PESD5V0L2BT
1
GND
1
RN1
10k
GND
6
GND
GND
R38 10k
GND
GND
R25 10k
6
D17 PESD5V0L2BT
D29 PESD5V0L2BT
D16 PESD5V0L2BT
D28 PESD5V0L2BT
10k
RN2
GND
2 3 4 5 6 7 8 9
D18 PESD5V0L2BT 1
GND
9 8 7 6 5 4 3 2
D30 PESD5V0L2BT
7
7
PB0_I PB1_I PB2_I PB3_I PB4_I PB5_I PB6_I PB7_I
PA0_I PA1_I PA2_I PA3_I PA4_I PA5_I PA6_I PA7_I
8
8
E
D
C
B
A
E
D
C
B
1
DIR == L: Bn => An DIR == H: Bn <= An
PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7
PX_OE PD_DIR
R65 10k
R66 R67
GND
100n
2
+5V
R63 10k
R53 R54
GND
100n
GND C67
PD_FAULT
PX_PWR
PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7
PX_OE PC_DIR
R52 10k
GND C63
PC_FAULT
PX_PWR
R50 10k
+5V
21 20 19 18 17 16 15 14
10k 22 10k 2
24 23 13
+3V3
2
4
3
1
+5V
GND
GND
C61 1u
GND
FAULT/
EN
VIN
3.3 V
5V
2
4
3
1
+5V
GND
GND
GND
FAULT/
EN
VIN
~OE DIR
3.3 V
5V
3
A0 A1 A2 A3 A4 A5 A6 A7
(5_V)_VCCA GND GND
VOUT
IC14 MIC2091-2YM5
VCCB_(3.3_V) VCCB_(3.3_V) GND
B0 B1 B2 B3 B4 B5 B6 B7
A0 A1 A2 A3 A4 A5 A6 A7
(5_V)_VCCA GND GND
I/O PORT D
C65 1u
B0 B1 B2 B3 B4 B5 B6 B7
~OE DIR
VCCB_(3.3_V) VCCB_(3.3_V) GND
VOUT
IC12 MIC2091-2YM5
IC15 SN74LVC4245ADW
C64 10u
21 20 19 18 17 16 15 14
10k 22 10k 2
24 23 13
3
I/O PORT C
IC13 SN74LVC4245ADW
C60 10u
+3V3
GND
GND
3 4 5 6 7 8 9 10
3 4 5 6 7 8 9 10
+5V
GND
GND
+5V
C66 1u
Current limiting
GND
1 11 12
5
GND
C62 1u
Current limiting
GND
1 11 12
5
D31 GND
D43
+5V
+5V
GND
D32 GND
D44
BAT54S BAT54S
+5V
4
+5V
GND
D33
4
GND
D45
BAT54S BAT54S
+5V
+5V
GND
D34 GND
D46
BAT54S BAT54S
+5V
+5V
GND
D35 GND
D47
BAT54S BAT54S
+5V
+5V
GND
D36 GND
D48
BAT54S BAT54S
+5V
+5V
GND
D37 GND
D49
BAT54S BAT54S
5
+5V
+5V
GND
D38
5
GND
D50
BAT54S BAT54S
R55 R56 R57 R58 R59 R60 R61 R62
BAT54S R68 R69 R70 R71 R72 R73 R74 R75
BAT54S
2
100R 100R 100R 100R 100R 100R 100R 100R
100R 100R 100R 100R 100R 100R 100R 100R
GND
GND
D39 PESD5V0L2BT
D51 PESD5V0L2BT
GND
GND
R64 10k
GND
GND
R51 10k
1
RN3
6
10k
10k
GND
RN4
GND
1
A
1
D41 PESD5V0L2BT
6
GND
D53 PESD5V0L2BT
D40 PESD5V0L2BT
D52 PESD5V0L2BT
2 3 4 5 6 7 8 9
D42 PESD5V0L2BT GND
2 3 4 5 6 7 8 9
D54 PESD5V0L2BT
7
7
PD0_I PD1_I PD2_I PD3_I PD4_I PD5_I PD6_I PD7_I
PC0_I PC1_I PC2_I PC3_I PC4_I PC5_I PC6_I PC7_I
8
8
E
D
C
B
A
B
DPS DIGITÁLNÍ I/O USB KARTY
Obr. B.1: Horní pohled Digitální I/O USB kartu.
Obr. B.2: Dolní pohled na Digitální I/O USB kartu.
81
Obr. B.3: Vnější horní vrstva.
Obr. B.4: Vnitřní vrstva určená pro rozvod signálů.
82
Obr. B.5: Vnitřní vrstva určená pro rozlití zemnící plochy.
Obr. B.6: Vnější spodní vrstva.
83
C
OBSAH CD
/Diplomová práce/ /Hardware/ /Hardware/Eagle/ /Hardware/Výroba/ /Hardware/Náhled/ /Software/Bin/ /Software/Knihovna/ /Software/Firmware/
Text diplomové práce Dokumentace k hardwaru Schéma a DPS nakreslené v programu Eagle 5.11.0 Data pro výrobu DPS ve formátu Gerber RS-274x a vrtací data ve formátu Excellon Vyexportované náhledy na schéma a DPS Binární soubory knihovny DigitalIOUSBCard a firmwaru mikrokontroléru Zdrojové kódy knihovny DigitalIOUSBCard Zdrojové kódy pro firmwaru mikrokontroléru
84