Controlere USB
Controlerele USB sunt circuite integrate ce permit interfațarea unui sistem electronic cu un port USB. Controlerele USB se pot configura dar nu pot executa un program (nu sunt programabile) putând efectua doar sarcini simple de conversie între diverse protocoale seriale sau paralele și comunicația USB. Aceste circuite pot înlocui un microcontroler într-un sistem simplu de achiziție, comandă sau comunicație scăzând prețul și complexitatea sistemului. Exemple de astfel de circuite:
- Familia de circuite FTDI FT-X ce include convertoare USB-to-UART, USB-to-SPI sau USB-to-I2C. Circuitul FT232RL a echipat plăcile de dezvoltare Arduino Duemilanove (plăci Arduino de generație mai veche) pentru conversia USB-to-UART fiind înlocuite ulterior cu microcontrolerele ATmega16U2/8U2 pentru plăcile Arduino Uno și Arduino Mega. Modulele necesare programării plăcilor de dezvoltare Arduino Ethernet și Arduino Pro Mini se bazează pe același circuit FT232RL. Adafruit FT232H Breakout (imagine de mai jos) este un exemplu de modul capabil să ofere simultan conectivitate UART, I2C și SPI prin intermediul unei conexiuni USB.
- Seria de circuite Smart I/O a companiei Prolific conține diverse circuite (PL-2303xx) pentru conversia USB-to-UART, acestea fiind regăsite pe majoritatea clonelor de plăci Arduino sau pe diverse module ieftine de conversie USB-to-RS232 sau USB-to-UART.
- Controlerul USB Microchip MCP2221 este un circuit cu facilități de configurare extrem de flexibile putând fi utilizat simultan pentru conversia USB-UART, USB-I2C, USB-parallel și chiar și pentru achiziția analogică prin intermediul conexiunii USB. Datorită prețului scăzut și al facilităților oferite vom utiliza acest controler pentru cele două exemple din cadrul lecției.
Controlerul USB MCP2221
Unul dintre avantajele controlerului MCP2221 este disponibilitatea în format THT (PDIP14) permițând astfel realizarea de montaje pe breadboard fără a fi nevoie de un modul de tip breakout, în plus circuitul nu necesită sursă de oscilație (cuarț) extern sau alte componente suplimentare (cu alte cuvinte este utilizabil la un cost minimal). Pinii circuitului au următoarele semnificații și funcționalități:
- VDD, VSS (5V, GND) sunt pinii de alimentare a circuitului și trebuie conectați la pinii de alimentare a conexiunii USB;
- D+, D- sunt pinii de comunicație USB, se conectează la pinii corespondenți ai conexiunii USB;
- SCL, SDA sunt cele două linii de comunicație ale magistralei I2C;
- /RST pin de resetare a circuitului;
- Vusb pin de alimentare la 3.3V în cazul în care nu se dorește alimentarea oferită de conexiunea USB (nu se utilizează pinii VDD și VSS);
- URx, UTx sunt pinii de comunicație UART;
- GP0, GP1 – pini I/O de uz general; pot fi folosiți și ca pini de comandă pentru LED-urile de activitate RX, TX pentru comunicația serială; pinul GP1 poate fi folosit ca și pin de achiziție analogică sau ca linie de întrerupere externă.
- GP2 – pin I/O de uz general; poate fi folosit ca pin de intrare analogică, pin de ieșire analogică sau pin de stare a conexiunii USB (USBCFG);
- GP3 – pin I/O de uz general; poate fi folosit ca pin de intrare analogică, pin de ieșire analogică sau comandă pentru LED-ul de activitate magistrală I2C.
După cum se poate observa funcționalitatea oferită de controlerul USB MCP2221 este una diversă: convertor USB-to-UART, convertor USB-to-I2C, achiziție analogică prin USB, comandă digitală prin USB, comandă analogică prin USB. Pentru configurarea controlerului se utilizează programul MCP2221 Utility (captură de ecran de mai jos).
Prin intermediul acestui program se poate modifica:
- Descriptorul USB al controlerului:
- VID / PID ce identifică în mod unic dispozitivul USB și pe baza cărora sistemul de operare instalează driverele corecte – modificarea acestora conduce la probleme de instalare a driverelor implicite Microchip;
- Curentul necesar funcționării dispozitivului (între 100mA și 500mA);
- Dacă se alimentează din conexiunea USB sau se alimentează în mod autonom;
- Informații descriptive (pot fi modificate fără probleme pentru personalizarea descrierii perifericului USB): descriere, producător, număr serial.
- Funcționalitatea și configurația celor patru pini GPIO (GP0-GP3):
- GP0: pin I/O (direcție, stare inițială), SSPND (USB state) sau LED_URx;
- GP1: pin I/O (direcție, stare inițială), generator semnal de ceas (CLK_OUT), pin achiziție analogică (tensiune referință), linie de întrerupere externă (tip declanșare) sau LED_UTx;
- GP2: pin I/O (direcție, stare inițială), USBCFG, pin de achiziție analogică (tensiune referință) sau pin de comandă analogică (tensiune referință);
- GP3: pin I/O (direcție, stare inițială), LED_I2C, pin de achiziție analogică (tensiune referință) sau pin de comandă analogică (tensiune referință);
Datorită facilităților diverse oferite de controlerul MCP2221 se pot realiza proiecte embedded variate în care microcontrolerul să fie înlocuit de circuitul MCP2221. În cadrul acestei lecții vom exemplifica utilizarea circuitului MCP2221 prin două sisteme simple: un ceas USB și un termometru USB.
Sistem de tip Ceas USB
Controlerul MCP2221 este văzut de sistemul de operare ca două dispozitive USB distincte: un dispozitiv CDC prin care se realizează conversia USB-to-UART (un port serial) și un dispozitiv HID prin care se realizează comunicația cu restul de componente (pini I/O, magistrală I2C, pini analogici). Pentru proiectul Ceas USB ne vom folosi de facilitatea de convertor USB-to-UART a circuitului MCP2221 pentru a comanda afișarea orei pe un LCD grafic serial de rezoluție 128×64 pixeli. Schema de interconectare este foarte simplă:
Pinii D+ și D- ai conexiunii USB vor fi conectați direct la controlerul USB. Pinii de alimentare ai conexiunii USB vor asigura funcționarea a controlerului și a ecranului LCD. Comunicația serială între controler și afișaj va fi unidirecțională și va folosi o singură linie: pinul 6 (UTx) al controlerului va fi conectat la pinul RX al afișajului.
Pentru ca sistemul să funcționeze, pe PC va rula un program ce va prelua ora de pe sistemul PC și va transmite comenzile de afișare pe portul serial către afișaj (controlerul USB va fi o componentă transparentă pentru program). Programul va necesita o parte de inițializare:
- Dacă dispozitivul USB cu ID-ul xxxxxxx este conectat:
- Identifică portul serial asociat cu dispozitivul USB cu ID-ul xxxxxxx;
- Transmite pe portul serial comandă de ștergere a ecranului: 0x7C,0x00
și o buclă infinită în care:
- Transmite pe portul serial comandă de poziționare pe X: 0x7C, 0x18, … și pe Y: 0x7C, 0x19, …;
- Preia ora de pe sistemul PC și transmite ora pe portul serial.
Sistem de tip Termometru USB
Sistemul Termometru USB își propune citirea unui senzor de temperatură I2C conectat la controlerul MCP2221. Temperatura citită poate fi ulterior afișată pe ecranul PC-ului. Senzorul utilizat va fi TMP102 dar se poate utiliza orice alt senzor I2C sau analogic. Schema de interconectare a celor două componente este:
Deoarece senzorul TMP102 funcționează la 3.3V va fi alimentat prin intermediul pinului Vusb al controlerului MCP2221 (controlerul are inclus un regulator de tensiune 5V->3.3V – imagine de mai jos).
Liniile magistralei I2C (SCL și SDA) se vor conecta la pinii 10 și 9 ai controlerului. Din punct de vedere al programului ce va rula pe PC, comunicația cu magistrala I2C se va realiza prin intermediul unei biblioteci software puse la dispoziție de Microchip: MCP2221 DLL. Pentru a realiza achiziția de temperatură de la senzor este necesar să utilizăm următoarele funcții ale bibliotecii (directorul bibliotecii include exemple de utilizare pentru mai multe limbaje de programare):
- DllInit() – pentru inițializarea comunicației;
- GetConnectionStatus() – pentru a verifica dacă dispozitivul este conectat;
- SelectDev(ID) – pentru a selecta dispozitivul;
ReadI2C() – ce va avea ca parametrii adresa senzorului I2C și numărul de octeți citiți.