![]()
USB-väylän lisäämiseksi sulautettuun järjestelmään on kaksi suoraviivaista tapaa: joko käyttämällä sovelluskohtaista ASIC-piiriä tai valitsemalla mikro-ohjain, johon on integroitu oheislohkona tuki USB-protokollalle. Kummallakin lähestymistavalla on omat hyvät ja huonot puolensa.
|
Artikkelin kirjoittaja Robert Perkel toimii sovellusinsinöörinä Microchip Technologyn 8-bittisten mikro-ohjainten ryhmässä, missä hän kehittää ja tuottaa teknistä sisältöä kuten sovellusdokumentteja, teknisiä artikkeleita ja videoita. Hän vastaa myös oheislaitelohkojen erilaisten käyttötapausten analysoinnista sekä koodiesimerkkien ja demonstraatioiden kehittämisestä. Perkel on valmistunut Virginia Tech -yliopistosta, missä hän suoritti tietotekniikan tutkinnon. |
USB on erittäin yleinen sarjaliikenneprotokolla, jota käytetään tehokkaissa mikro-ohjaimissa (MCU) ja mikroprosessoreissa (MPU), mutta aina sitä ei ole mukana sulautetuissa järjestelmissä. Tähän on lukuisia syitä: sähköisen signaloinnin vaatimukset, protokollan lisäkustannukset ja yksinkertaisempien tiedonsiirtoprotokollien (SPI, I2C, UART) yleinen saatavuus.
Vaikka USB ei syrjäytäkään yksinkertaisempia siirtoväyliä, sitä kannattaa harkita varsinkin kannettavissa sulautetuissa sovelluksissa.
Toteutus ASIC-piirillä
Yksinkertainen tapa lisätä USB-liitäntä järjestelmään on käyttää ASIC-piiriä, joka käsittelee USB-datansiirron sisäisesti ja syöttää tarvittavat tiedot ja signaalit eteenpäin. Yksi yleisimmistä sovelluskohtaisista piireistä on USB-UART-silta, joka on (suhteellisen) läpinäkyvä rajapinta datan siirtämiseksi USB-isännästä sulautettuun järjestelmään. Usein tämä on muodoltaan isännän virtuaalinen COM-portti, jonka sarjamuotoinen päätesovellus voi avata kaksisuuntaista tiedonsiirtoa varten.
Usein näissä ASIC-piireissä on mukana myös muita toimintoja, kuten USB-I2C, I/O-linjan ohjaus, analoginen näytteenotto jne. Nämä toimintalohkot ovat valmiina lisättäväksi suunniteltavaan järjestelmään, joten niiden toteuttaminen on helppoa ja vaivatonta. Ne sopivat täydellisesti lisättäväksi suunnitteluun vielä aivan viime hetkelläkin.
Tällaisten ASIC-piirien käytöllä on kuitenkin muutamia rajoituksia. Yksi haittapuoli on, että lähestymistapana on ’yksi koko sopii kaikille’. Jos jotain haluttua toiminnallisuutta ei voida saavuttaa ASIC-piirillä, tämä lähestymistapa ei toimi. Toinen haittapuoli on osaluetteloon lisättävät ylimääräiset komponentit (BOM). Tarvittavat lisäosat vaativat enemmän piirilevyalaa ja lisäävät järjestelmän kokonaiskustannuksia.
Toteutus mikro-ohjaimella
Jos jo ennen mikro-ohjaimen valitsemista järjestelmään tiedetään, että USB-datansiirtoa tullaan tarvitsemaan, hyvä vaihtoehto on harkita ohjainpiiriä, jossa on sisäänrakennettuna USB-oheislohko. Tällaisia MCU-piirejä löytyy laaja valikoima niukasti tehoa kuluttavista 8-bittisistä pikkupiireistä aina hyvin suorituskykyisiin 32-bittisiin ohjaimiin. Sopivan mikro-ohjaimen valinta riippuu sovelluskohteesta.
Näppäimistön, hiiren tai USB-UART-muuntimen kaltaisiin yksinkertaisiin sovelluksiin sopivat 8-bittiset piirit oikein hyvin. Ne tarjoavat yhdistelmän pientä kokoa, vähäistä tehonkulutusta, edullisia kustannuksia ja natiivia +5 voltin toimintaa.
Laskennan kannalta intensiivisissä sovelluksissa kannattaa harkita 32-bittisiä mikro-ohjaimia, jotka ovat tehokkaampia ja sisältävät enemmän käytettävissä olevaa muistia. 32-bittiset mikro-ohjaimet voivat kuitenkin olla kalliita, suurikokoisia ja käyttöjännitteeltään rajallisia. Oheisessa taulukossa on vertailtu eri lähestymistapojen etuja ja haittoja.

Kuva 1. Eri toteutustapojen vertailu.
USB-sovellus AVR DU -piirillä
Saatavissa on lukuisa joukko erilaisia mikro-ohjaimia, joihin on integroitu USB-oheislohkot. Seuraavassa keskitytään AVR DU -mikro-ohjainperheeseen, joka on XMEGA D -ohjainperheen ’henkinen seuraaja’
AVR DU -tuoteperheessä on useita parannuksia edellisen polven piireihin verrattuna. Ensinnäkin piiri tulee toimeen ilman ulkoista kidettä, mikä alentaa osakokonaisuuden kustannuksia. DU-tuoteperhe sisältää myös sirulle integroidun LDO-regulaattorin (Linear Drop-Out) USB-lohkolle, kun ohjainpiirille syötetään käyttöjännitettä vähintään 3,9 voltin lähteestä.
Lisäksi AVR DU -piireissä on mukana PDID-toiminto (Program and Debug Interface Disable), jolla voidaan lukita ohjain pysyvästi ja estää piirin sisältämän datan lukeminen, poistaminen ja uudelleenohjelmointi.
Seuraavat esimerkit ovat yksinkertaisia sovelluksia, jotka on kehitetty AVR DU -piireille. Näissä esimerkeissä on käytetty MPLAB-kehityspakettiin kuuluvaa ilmaista MCC-työkalua (MPLAB Code Configurator), joka konfiguroi ja luo sovelluksen API-ohjelmointirajapinnan oheislohkoille mukana tulevan USB Stack Libraryn avulla. Kirjasto tukee natiivisti CDC- (Communications Device Class) ja HID-laitteita (Human Interface Device) kuten näppäimistöjä ja hiiriä.

Kuva 2. USB-SPI/I²C-projektin avaaminen MCC-työkaluohjelmassa.
CDC-sovellus: USB-yhteys SPI/I²C-väyliin
Tässä esimerkissä toteutetaan USB-SPI/I²C-muunnin, joka toimii ilman räätälöityä ajuria. Tämä saavutetaan tunnistamalla mikro-ohjain yleiseksi CDC-luokan laitteeksi. Useimmissa käyttöjärjestelmissä on käytössä yleiskäyttöinen ajuri tämän tyyppiselle tiedonsiirrolle, jonka avulla käyttäjä voi lähettää ja vastaanottaa dataa ilman erillisen ajurin asentamista.
Sarjaliikenteen aloittamiseksi käyttäjä lähettää mikro-ohjaimelle erityisesti muotoillun ’lauseen’. Mikro-ohjaimen vastaanottama data jäsennetään ja muunnetaan (jos mahdollista) SPI- tai I2C-väyläoperaatioksi. Sen jälkeen ohjainpiiri raportoi komentovirheistä, tiedonsiirtovirheistä (vain I2C) tai siirron aikana luetuista tiedoista. SPI:n tapauksessa ’lauseet’ muotoillaan seuraavasti:
spi eeprom/dac/usd <byte data to send>
Tässä käytetyt termit ’eeprom’, dac’ ja ’usd’ viittaavat sovelluksessa käytetyn Curiosity Nano Explorer -kehitysalustan komponentteihin. Seuraava pätkä on esimerkki ’lauseesta’, jonka avulla käyttäjä kommunikoi Explorer-testauskortilla sijaitsevan EEPROM-piirin (25CSM04) kanssa. Tämä komento lukee muistisirun tunnisterekisterin.
spi eeprom 9F 00 00 00 00 00
> FF 29 CC 00 01 00
I2C-väylän tapauksessa käytössä on kolme samankaltaista mutta muodoltaan erilaista ’lausetta’, koska I2C-väylä on jaettu kaikkien liitettyjen laitteiden kesken.
i2c <address> r <number of bytes to read>
i2c <address> w <bytes to write>
i2c <address> wr <register address byte> <number of bytes to read>
Kuten SPI:n tapauksessakin, tämän nopean testauksen tehtävänä on lukea anturin valmistajan antama tunnus – tässä tapauksessa kyseessä on lämpötila-anturi MCP9808.
i2c 1c wr 06 02
> 00 54
Tämä esimerkki on saatavissa Github-versionhallintasivustolla.
HID-sovellus: USB-näppäimistö
Yksinkertainen mutta helposti käyttöön sovitettava esimerkki USB-tiedonsiirrosta on näppäimistön toteuttaminen. Tyypillisesti kun näppäimistö havaitsee näppäimen painalluksen, isäntäkoneelle lähetetään raportti, joka osoittaa käyttäjän painaman näppäimen (tai näppäinyhdistelmän). Kun näppäin vapautetaan, lähetetään toinen raportti, joka kertoo, että käyttäjä on vapauttanut näppäimen.
Tämä esimerkki on toteutettu eri tavalla. Sen sijaan että raportoitaisiin yksi näppäin tai painike, kuten tavallisessa näppäimistössä, tässä esimerkissä raportoidaan usean näppäimen syötteet yhdellä painalluksella funktiomakrojen luomiseksi. Esimerkiksi AVR64DU32 Curiosity Nanon SW0-painikkeen painaminen lähettää isäntäkoneelle raportin näppäimillä ’AVR DU’. Curiosity Nano -testauskortin ledivalo ilmaisee isäntäjärjestelmän Caps Lock -tilan.
Curiosity Nanon lisäksi sovitinkortin Curiosity Adapter Board kautta on kytketty myös 2x2-näppäimistö. Painikkeet on yhdistetty seuraaviin makroihin: CTRL + C (kopioi), CTRL + V (liitä), CTRL + Z (kumoa) ja CTRL + X (leikkaa). Mukaan voidaan liittää myös valinnainen ulkoinen painike, joka lähettää näppäinyhdistelmän ALT + F4 isännälle. Tämäkin esimerkki on saatavissa Githubissa.
Vaihtoehdot puntariin
Vaikka USB on yksi sulautettujen järjestelmien monimutkaisimmista sarjaliikennetyypeistä, sen yleisyys kaikkialla tuo merkittävää lisäarvoa suunnitteluun. USB-liitäntä voidaan helposti lisätä järjestelmään käyttämällä ASIC-piiriä, tosin suurikokoisen rakenneosan lisäkustannusten hinnalla.
Toinen, kustannuksiltaan edullisempi vaihtoehto on valita mikro-ohjainpiiri, jossa on integroituna USB-oheislohko. Tämän jälkeen on vain päätettävä, vaatiiko MCU-pohjainen suunnittelu 32-bittisen piirin suorituskykyä vai riittääkö yksinkertaisempi mutta kustannustehokkaampi 8-bittinen ohjainpiiri, kuten tässä esitelty AVR DU -perheen mikro-ohjain.






















