USB mikroprocesory PIC a ich použitie
http://mcu.cz/news.php?extend.623.2
Tímto článkem bych chtěl nastínit použití zabudovaného USB rozhraní v procesorech PIC18 a popis předprogramovaného firmwaru, který poskytuje Microchip. Účelem článku je především ukázat použití USB modulu bez nutnosti znalosti USB protokolu a dlouhého studování USB specifikace. Pro zjednodušení práce byla sestavena vývojová deska nazvaná USB PICDEV, kde jsou vyvedeny všechny porty procesoru, ke každé bráně i napájení, a navíc jsou na portu D vyvedeny LED diody pro snadnou analýzu portu. Dále jsou připojena tlačítka pro reset a aktivaci bootloaderu a připojen krystal. To vše je napájeno jen z USB.
Definice pojmů:
- Host - na sběrnici může být jen jeden. Je to v podstatě Master zařízení a v případě připojování k PC je právě PC vždy Host. Dále v textu se budu odkazovat na Hosta (psáno úmyslně s velkým H) a bude tím myšleno právě PC.
- Zařízení - je to zařízení připojené na sběrnici. Ve skutečnosti to může být myš, klávesnice, náš PIC s naprogramovaným firmwarem, prostě cokoli, co je možné na USB sběrnici připojit a schopné komunikovat s Hostem.
- Firmware - skvělá knihovna funkcí naprogramovaná firmou Microchip pro usnadnění práce s USB modulem. Obsahuje vše potřebné pro snadnou komunikaci Zařízení s Hostem.
Mikroprocesory PIC, které mají v tuto chvíli zabudované USB 2.0 jsou: PIC18F4550, 18F4455, 18F2455 a 18F2550. Liší se od sebe velikostí flash paměti (16/32kB) a počtem vývodů. Pro detailnější popis je potřeba nahlédnout do datasheetů těchto obvodů.
1. Základním popis USB komunikace
Detailním popisem USB by bylo nošení dříví do lesa, kvalitní články v češtině již vyšly na níže uvedených odkazech. Já se zaměřím jen na ten nejzákladnější a nejdůležitější popis termínů, nezbytných pro práci s PIC a USB. Hlavním záměrem tohoto článku je právě přiblížení použití USB bez detailních znalostí komunikace.
Zajímavé články na téma USB - popisu komunikace, lze tedy najít např. na
- http://www.hw.cz/Rozhrani/ART1232-USB-2.0---dil-1.html
- http://www.hw.cz/Rozhrani/ART1244-USB-2.0---dil-2.html
- http://www.hw.cz/Rozhrani/ART1264-USB-2.0---Typy-a-formaty-prenosu.html
Detailní (oficiální) specifikace USB
- http://www.usb.org
- http://www.usb.org/developers/docs - Dokumentace ke stažení
- http://www.mcu.cz - USB sekce
Takže jen to nejzákladnější z USB komunikace:
USB protokol je podobný jakémukoliv jinému sériovému protokolu, jen je zde zapotřebí předat navzájem mezi Hostem a Zařízením více informací pro komunikaci. Dále je nutné sdělit Hostu, jaký typ zařízení vlastně připojuji na sběrnici. To vše se děje v inicializační fázi.
Nejdůležitější je asi tzv. „Endpoint“. Je to jakýsi vstupní (resp. výstupní) bod (registr), odkud se přijímají/vysílají data mezi Hostem a Zařízením, to podle toho, jestli je endpoint nadefinován jako vstupní či jako výstupní. V závislosti na tom, jak endpoint nakonfigurujeme, tak s ním podle toho Host komunikuje. Typy přenosu (Izochronní, bulk, přerušovaný a řídicí) jsou popsány na výše zmiňovaných odkazech). Endpoint má také předem danou maximální velikost přenášených dat v jednom paketu. Komunikace probíhá po tzv. „pipes“ (roury). To jsou vlastně jakési virtuální kanály k jednotlivým endpointům. Jestliže je endpoint výstupní, proudí do něj data od Hosta a odtud se potom zapisují do paměti procesoru, odkud si je můžeme vzít my. Jestliže je endpoint vstupní, data z paměti proudí přes tento endpoint do Hosta. Díky firmwaru se toto děje automaticky. Stačí firmwaru říci: Tady, v tomto poli (pole předem známe velikosti znaků typu char), jsou data a pošli je Hostu. O vše ostatní se firmware postará sám. Nebo naopak, zeptáte se firmwaru, jestli jsou přijata nějaká data a jestliže ano, vezmete si je z pole (opět předem známá velikost pole).
Nebo ještě jednodušeji, při použití třídy CDC použijete pro příjem či vysílání znaků funkce firmwaru, které jsou velice podobné funkcím pro použití UART modulu. V tom případě už se ani nestaráte o velikost vysílané či přijímané zprávy.
Po připojení Zařízení na sběrnici se Host zeptá na konfiguraci Zařízení a endpointů. Tato inicializace se nazývá SETUP a Hostu se při tom předávají informace např. o typu zařízení (HID, CDC, Mass Storage, atd.), rychlosti přenosu, odběru proudu a slovním popisu zařízení (definované jako string descriptor). To vše probíhá přes endpoint číslo 0. Firmware PIC je již předkonfigurován pro základní typy přenosů (konkrétně HID — human interface device; CDC — Communication Device Class - virtuální sériový port; Mass Storage Class; Microchip Custom Driver). Záleží jen na nás, jaký typ konfigurace si vybereme. V případě použití jedné z těchto tříd je konfigurace již naprogramována přímo ve firmwaru. Jestliže nám z jakéhokoliv důvodu nevyhovují předdefinované konfigurace, je možné si nadefinovat vlastní. To už však vyžaduje prostudování firmwaru jako takového a hlubší znalost USB. Popis jednotlivých částí firmwaru v češtině je k dispozici společně s kitem USB PICDEV.
Samotná komunikace — přenos dat mezi jednotlivými endpointy — čtení /zápis na připojený PIC procesor — definované uživatelem (vývojářem)
A to je v podstatě celá věda. Ve skutečnosti je vše samozřejmě složitější, ale není potřeba se tím zabývat, neboť veškerou inicializaci, následnou komunikaci a obsluhu všech přerušení z USB za nás udělá firmware. My jen musíme použít funkce firmwaru v PIC pro komunikaci s PC vytvořit vlastní programové vybavení na straně PC. V případě použití CDC třídy nemusíme ani to, protože počítač vidí náš PIC jako sériové rozhraní a komunikuje s ním přes virtuální sériový port, jako je tomu v případě třeba řadičů FTDI. V případě použití Microchip Custom Driver můžeme zase použít funkce windows driveru od Microchipu, jen je pak potřeba správně získat „handle“ na naše zařízení. Oba typy komunikace budou popsány v dalších dílech tohoto článku. Pouze v případě definovaní vlastního typu komunikace je potřeba si buď firmware upravit, nebo vyvinout vlastní. Ovšem nevím o žádné běžné aplikaci, kde by to bylo potřeba.
2. USB PICDEV vývojová deska
Jedná se o jednoduché vyvedení portů na klasické pinhead konektory. Dále jsou použita tlačítka reset a tlačítko pro aktivaci bootloaderu a samozřejmě krystal. Jako poslední důležitá věc je ještě ICD konektor, sloužící jednak pro prvotní nahrání bootloaderu, příp. pro ladění pomocí ICD2 prostředku. Připojení kabelu USB indikuje červená LED dioda, která ovšem neznamená úspěšnou inicializaci!
Všechny vyvedené porty mají u sebe ještě vždy vyvedené napájecí napětí (včetně vazebních kondenzátorů). Je to poměrně elegantní způsob, umožňující napájení připojovaných modulů. Tlačítko S3 slouží jako resetovací, tlačítko S4 se používá k aktivaci bootloaderu. USB konektor je typu B. Vše ostatní je patrné ze schématu.
Rozložení součástek na desce
Seznam součástek:
R1, R3-R10 | 470R |
R11, R13 | 4k7 |
R15 | 1M |
C1, C2 | 22pF |
C3 | 470nF |
C4, C5, C7, C8, C9, C10 | 100nF |
C6 | 100u/16V |
Q1 | krystal 20MHz |
S3, S4 | tlačítko P-B1729 |
JP1, JP2, JP3, JP7, JP8, JP10 | konektory typu PINHEAD |
USB1 | konektor USB typ B |
LED1 | led 5mm, červená |
LED2-LED9 | led 3mm, zelená |
Rozložení portů na desce
Instalace ovladačů
Po nahrání bootloaderu do procesoru můžeme připojit desku k PC. Windows si vyžádají driver desky — potřebujete soubor mchpusb.sys. V případě, že jste již nainstalovali soubor __en021827.exe__ viz link níže, najdete tento ovladač v adresáři „C:MCHPFSUSBPcMCHPUSB DriverRelease“. Doporučují nainstalovat soubor en021827.exe jako první (před připojením desky). Tento soubor je v podstatě samorozbalovací archiv, který obsahuje firmware, ovladače pro PC a nějaké demo aplikace. Vše včetně zdrojových kódů.
Bootloader
Bootloader je krátký prográmek, který se nahraje do spodní části flash paměti, a který má za úkol nahrávat naše vlastní programy do flash paměti přes USB, tzn. není nutný žádný další programátor. To je dobré především jako upgradovací nástroj pro již hotová zařízení, dá se však použít i pro vývojové účely. Pro nahrání našeho vlastního programu slouží program PDFSUSB.exe, který poskytuje Microchip, samozřejmě zdarma. ICD konektor tedy slouží jednak k prvotnímu nahrání bootloaderu do procesoru, příp. přeprogramování procesoru v případě, že jsme si bootloader nějakým způsobem poškodili nebo smazali a dále pro ladění procesoru pomocí ICD2 přípravku. Samozřejmě že ti, kteří mají k dispozici ICD2 prostředek a preferují používání tohoto prostředku pro programování, příp. ladění, nemesí ani bootloader nahrávat. Samozřejmě je možné mít nahraný bootloader v paměti a zároveň používat ICD2 pro ladění.
Bottloader se aktivuje přidržením tlačítka S4 a následným stiskem tlačítka S3 (reset). Pak můžeme v programu PDFSUSB v záložce „Bootload mode“ naši desku, vybrat hex soubor stiskem tlačítka Load HEX, který chceme nahrát a stisknout tlačítko Program device. Mikroprocesor se naprogramuje a stiskem tlačítka Execute se procesor resetuje a začne provádět náš program. Viz obr. 2. Náš program může být v podstatě jakýkoliv, jen je potřeba dát pozor na to, že vektory resetu a přerušení jsou přesunuty na jiné adresy (viz soubor boot.h ve zdrojovém kódu bootloaderu a demo aplikace) a je nutné pro náš vlastní program tyto vektory vždy přemapovat. Dále je potřeba mít na paměti, že bootloader nastavuje registry oscilátoru, WDT, MCLR, některá nastavení konfiguračních registrů a nastavení ochrany částí paměti proti přepsání. V případě, že toto nastavení změníme, bootloader již nemusí, a pravděpodobně ani nebude, fungovat.
Detailní seznam ovlivněných registrů je v následující tabulce (převzato z oficiální dokumentace k bootloaderu)
TABLE 1: DEFAULT CONFIGURATION WORD VALUES FOR THE BOOTLOADER
Address | Register | Value Comment |
0x300000 | CONFIG1L | 0x24 Clock configuration |
0x300001 | CONFIG1H | 0x0E Clock configuration |
0x300002 | CONFIG2L | 0x3F BOR, PWRT, USB voltage regulator |
0x300003 | CONFIG2H | 0x1E WDT configuration |
0x300005 | CONFIG3H | 0x81 MCLR, CCP2, A/D configuration |
0x300006 | CONFIG4L | 0x81 Core microcontroller configuration |
0x300008 | CONFIG5L | 0x0F Code protect (program memory) |
0x300009 | CONFIG5H | 0xC0 Code protect (boot block/EEPROM) |
0x30000A | CONFIG6L | 0x0F Write protect (program memory) |
0x30000B | CONFIG6H | 0xA0 Write protect (boot block/EEPROM) |
0x30000C | CONFIG7L | 0x0F Table Read protect (program memory) |
0x30000D | CONFIG7H | 0x40 Table Read protect (boot block/EEPROM) |
Note: Only implemented configuration words are listed.
V prípadě, že použijete jako bootloader firmware vývojové desky PICDEM FS USB (originál od Microchipu), bude okno pro programování po USB vypadat asi takto:
Ukázka, jak má vypadat program, který nahráváme do paměti procesoru pomocí USB bootloaderu. Všimněte si přemapování vektorů resetu a přerušení (na adresy 0800 — reset; 0808 a 0818 — přerušení):
*
* Example User Program to be used with resident Bootloader
*
*********************************************************************
/** I N C L U D E S **********************************************************/
#include <p18cxxx.h>/** V A R I A B L E S ********************************************************/
#pragma udata
/** V E C T O R R E M A P P I N G *******************************************/
extern void _startup (void); // See c018i.c in your C18 compiler dir
#pragma code _RESET_INTERRUPT_VECTOR = 0x000800
void _reset (void){
_asm goto _startup _endasm
}
#pragma code
#pragma code _HIGH_INTERRUPT_VECTOR = 0x000808
void _high_ISR (void){
}
#pragma code _LOW_INTERRUPT_VECTOR = 0x000818
void _low_ISR (void){
}
#pragma code
/** D E C L A R A T I O N S **************************************************/
#pragma code
/** L E D ***********************************************************/
#define mInitAllLEDs() LATD &= 0xF0; TRISD &= 0xF0;
#define mLED_1 LATDbits.LATD0
#define mLED_1_On() mLED_1 = 1;
#define mLED_1_Off() mLED_1 = 0;
#define mLED_1_Toggle() mLED_1 = !mLED_1;
/** S W I T C H *****************************************************/
#define mInitAllSwitches() TRISBbits.TRISB4=1;
#define mInitSwitch2() TRISBbits.TRISB4=1;
#define sw2 PORTBbits.RB4
void main(void){
ADCON1 |= 0x0F; // Default all pins to digital
mInitAllSwitches();
mInitAllLEDs();
while(1){
if(sw2 == 0){
mLED_2_On();
}
else{
mLED_2_Off();
}//end if else
}//end while
}//end main
/** EOF Demo02.c *************************************************************/
To je k tomuto dílu vše, v dalším díle se již zaměřím na popis firmwaru, detailní rozebrání všech jeho částí, ukázku úpravy „string deskriptorů“ — to jsou texty, které se zobrazují popřipojení k PC a nakonec ukázka komunikace s PC pomocí třídy CDC (virtuální sériový port).
Odkazy na soubory a dokumentaci, potřebných pro vývojovou desku:
- [http://www.microchip.com/stellent/groups/picmicro_sg/documents/devicedoc/en021827.exe|Booloader a firmware:]
- [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1335&dDocName=en010300|Domovská stránka procesoru 18F4550 (datasheety, app notes apod.)]
- [http://ww1.microchip.com/downloads/en/DeviceDoc/51526a.pdf|PICDEM Full Speed USB evaluation board — uživatelský manuál]
Snažil jsem se vše popsat co nejsrozumitelněji a nejjednodušeji, a případné další dotazy rád zodpovím v diskuzi k článku.
Vývojová deska jako kit (stavebnice), obsahující všechny součástky, včetně přeprogramovaného procesoru PIC18F4550 a DPS stojí 550 Kč. Součástí dodávky je návod na stavbu, CD obsahující všechny potřebné programy, vývojové prostředí MPLAB, velké množství datasheetů, aplikačních poznámek a popis jednotlivých částí USB firmwaru v češtině.
Vývojová deska kompletně sestavená a oživená stojí 800 Kč. Součástí dodávky je CD obsahující všechny potřebné programy, vývojové prostředí MPLAB, velké množství datasheetů, aplikačních poznámek a popis jednotlivých částí USB firmwaru v češtině.
Samotný, nenaprogramovaný procesor PIC18F4550 stojí 300 Kč.
Petr Tomíček tel: 723 119 571