Avr și usb

În acest articol vom vorbi despre o interfață destul de populară ca USB, mai exact cum să folosim această interfață USB pe microcontrolerele din familia AVR. Există o mulțime de informații pe Internet, dar cea mai mare parte este reprezentată de fragmente separate și nu oferă o imagine completă a modului de utilizare a acestei interfețe pe microcontrolerele AVR.







Astfel de interfețe, cum ar fi COM, MIDI, LPT utilizat pe scară largă la un moment dat, dar acum ele sunt depășite și din ce în ce mai puțin și mai puțin frecvente în calculatoare moderne, în special în calculatoare pentru echipamente industriale si extrem de specializate. Pentru a contacta dispozitivul asamblat cu computerul, puteți utiliza toate tipurile de adaptoare și convertoare emulatoare, dar după cum arată practica, ele generează o mulțime de probleme.

Pentru a folosi prietenii USB și AVR, puteți merge în trei moduri:

Utilizați suport hardware pentru interfața USB, de exemplu microcontrolerul AT90USB *. Pentru a-l utiliza, trebuie să scrieți un firmware special pentru el. Și dacă dispozitivul asamblat nu este o clasă USB standard, atunci va trebui să scrieți un driver pentru computer, care va explica PC-ul cu care dispozitiv avem de-a face.

Utilizați convertoarele USB în altă interfață (de exemplu, USB-UART pe chipul FTDI FT232RL). Calitatea altor interfețe poate fi RS232, I2C sau altele. Cu această abordare, nu trebuie să evităm și să știm cum funcționează interfața USB, de asemenea dispare nevoia de driver pentru computer, deoarece driverele pentru astfel de convertoare sunt deja scrise de producător.

Puteți face tot mai complicată microcontroler ia AVR și să scrie pentru el un program care emulează de locuri de muncă USB. Cu această abordare, există o dificultate în realizarea unei rate mari a datelor. Interfața USB funcționează la viteză mare, care poate fi: LowSpeed ​​- 1,5 Mbit / s, FullSpeed ​​- 12 Mbit / s, Highspeed - 480 Mbit / s, în timp ce viteza de interfață USB 3.0 poate fi chiar mai mare. Prin urmare, dispozitivul AVR se poate face numai cu viteza LowSpeed. Pentru majoritatea dispozitivelor fabricate automat această viteză este suficientă.

Vom folosi metoda emulației software. În prezent, există deja trei proiecte gata făcute pentru microcontrolerele AVR pentru a emula interfața USB.
  • USBtiny;
  • V-USB;
  • Igor Cesko.

Igor Cesko a fost primul care a realizat un astfel de proiect, a fost scris în asamblarea lingvistică.

După ce a apărut proiectul V-USB care este scris în C folosind codul de asamblare Utilizând V-USB, a fost realizat proiectul receptorului IR pentru computer.

USBtiny, la rândul său, este arbitrară dintr-o versiune anterioară a proiectului V-USB. Dacă este posibil, este inferior V-USB, dar este mult mai ușor de învățat teoretic și relativ ușor.

Vom folosi proiectul V-USB

Avr și usb

In experimentele lor, USB, Flash microcontroler scris în mediul de limbaj C în AVR-Studio 4 + WinAVR, software-ul PC-ul a fost dezvoltat folosind mediul Borland C ++ Builder ca opțiunea cea mai simplă și hustry. Prin urmare, toate exemplele de mai jos vor fi aceleași. Din alegerea corectă a uneltelor depinde de cantitatea de cefalee în pașii următori. Cu ocazia faptului că este mai bine C sau Assembler, este posibil să vorbim mult. În ceea ce pentru mine nevoia de a deține toate instrumentele, unele într-o măsură mai mare în unele mai puțin, și de a folosi una sau alta, în funcție de sarcina specifică la îndemână.

Să încercăm să asambleze primul dispozitiv HID USB de pe microcontrolerul Atmega8 și să-l învățăm să comunice cu un computer folosind interfața USB. Întrebarea "de ce dispozitivul HID" poate apărea. Răspunsul este cel mai simplu, pentru că nu vrem să ne stricăm, să scoatem creierul și să scriem tot felul de drivere în Windows. Și când conectăm dispozitivul HID, sistemul de operare selectează și include driverul necesar. Programul nostru de sub calculator nu va trebui să instaleze și să configureze ce va folosi imediat algoritmul gata de lucru cu dispozitivul HID.

Pentru muncă avem nevoie de următoarele programe:
  • Borland C ++ Builder 6 - mediu pentru dezvoltarea unei aplicații pentru Windows în limba de programare C ++;
  • V-USB - program pentru microcontrolere AVR implementează lucrările de viteză redusă USB 1.1, downloadvusb.tar.gz;
  • WinAVR este un set pentru dezvoltatorii AVR, aici avem nevoie de un compilator GNU GCC care se integrează automat în studio;
  • AVR Studio - un mediu excelent pentru dezvoltarea de programe pentru microcontrolere AVR.

Schema de conectare a AVR la USB

Avr și usb

Microcontrolerul ATmega8 este conectat printr-o schemă clasică de alimentare de 5 volți. Alte scheme pot fi găsite în arhiva V-USB din catalogul de circuite. Interfața USB de pe liniile D + și nivelul semnalului D este de 3,3 V, iar întreaga noastră de circuit este alimentat de tensiune este de 5 V. Prin urmare, necesitatea de a alinia niveluri USB cu schema noastră pentru acest set D1 și D2 Zener care reduce semnalul de la microcontroler pe rezistoarele de blocare R3 și R4 la nivelul necesar de 3,3 V din standardul cerut. Pentru a determina versiunea de protocol utilizată de tensiune rezistori despărțitoare R1 și R2, care generează la linia de nivel D 3.4 V într-un mod de ralanti. Dacă se utilizează o valoare de rezistență diferită de 1,5 kOhm în locul menționat R1 2,2 kohm sau dacă nu pentru a seta toate rezistorul R2 în loc de 3,4 V 3,7 V turn care rezultă în deschiderea dioda D1 zener care se va reduce la tensiunea deschisă de 3.4 V - 3.5 V. ca rezultat, vom transforma prejudecată curent la mers în gol (diodă zener D2 nu va încărcat deloc, iar pe D1 este deja un curent sa curga), iar acest lucru se va reflecta în lungimea cablurilor USB. Valorile rezistenței R3 și R4 sunt determinate de curent, în acest circuit AVR USB sunt egale cu o valoare de 68 ohmi.

Assesmblernaya partea V-USB-ului este scris urmatoarea serie de frecvențe 12 MHz, 12,8 MHz, 15 MHz, 16 MHz, 16,5 MHz, 18 MHz, 20 MHz. Alte frecvențe nu sunt acceptate. Această frecvență nu este setată manual oriunde, este definită în configurația proiectului AVR Studio. Proget> Opțiuni de configurare> General> Frecvență. Frecvența este indicată în Hertz, dacă nu setați corect frecvența, atunci vor apărea o mulțime de avertismente în timpul compilației și programul nu va fi compilat. În studio, există o variabilă F_CPU utilizată de compilator și este disponibilă pentru întregul proiect, V-USB o folosește și ea. Pentru funcționarea corectă a cuarțului, este necesar să setați corect biții FUSE ai microcontrolerului.







Avr și usb

12 MHz este o frecvență frecvent utilizată pentru V-USB, este frecvența minimă la care pot fi emulate toate temporizările necesare ale caietului de sarcini USB;

15 MHz - aproape de 12 MHz, locurile NOP-s sunt afișate. Utilizarea unei astfel de frecvențe face ca codul să fie ceva mai mic, datorită faptului că o frecvență mai mare permite o utilizare mai mare a ciclurilor;

16 MHz - această frecvență a fost adăugată utilizatorilor de arduino și a altor placi de bază care au un oscilator de cristal de 16 MHz. Implementarea asamblatorului acestei frecvențe a fost scrisă cu câteva subtilități care aplică cicluri de decelerare. Acest lucru se datorează faptului că 16 MHz nu este posibil să se împartă complet în ceas bit USB cu viteză mică;

12,8 MHz și 16,5 MHz - frecvențele date sunt destinate pentru ceasornicarea generatorului RC intern, precizia fiind de 1%.

18 MHz - această frecvență este cea mai apropiată de standardele USB. Utilizarea acestei frecvențe vă permite să verificați direct pachetele CRC primite în zbor. Dacă pachetele nu au suma de control corectă, atunci acestea sunt respinse. Există, de asemenea, o opțiune pentru a verifica datele de integritate la nivel de program.

20 MHz - pentru cei cărora le place viteza mare. Din moment ce 20 MHz nu împărtășește ceasul bitului de viteză USB de 1,5 MHz. Se aplică atât cicluri de decelerare, cât și la o frecvență de 16 MHz.

Crearea unui proiect în AVR Studio

Creați un proiect AVR GCC, numiți-l, de exemplu, Hid_example_firmware. Și începe să scriem firmware-ul nostru.

Avr și usb

Apoi, trebuie să copiem toate fișierele din arhiva descărcată anterior vusb.tar.gz în directorul de proiect. Apoi adăugăm următoarele fișiere la proiect:
  • usbdrv.c;
  • oddebug.c;
  • usbdrvasm.s.

Pentru a adăuga un fișier, selectați "Adăugați fișierele sursă existente" din meniul contextual

Avr și usb

Algoritmul muncii

Înainte de a începe să scrieți un program pentru MC, trebuie să înțelegeți principiile de bază ale muncii. Dispozitivul HID comunică cu datele fierbinți, datele sunt primite în blocuri de mărime fixă ​​- sau rapoarte. Structura lor este descrisă în HID, care oferă gazdă conexiunea. Gazda programului pe calculator efectuează inițializarea recepției și transmiterii datelor. În cazul în care gazda dorește să trimită date către dispozitiv, mai întâi trimite comanda HID_SET_REPORT, în timp ce V-USB apelează funcția usbFunctionRead ().

linie de date D + conectat la INT0 întrerupere, deoarece această întrerupere, cu cea mai mare prioritate. În procesul de schimb de date prin USB microcontroler INT0 merge în mod constant la prelucrarea, care este doar conectat V-USB. Iar după aceea, controlul va fi transferat în programul principal. Dacă aveți nevoie de dispozitivul și chiar se ocupe de întrerupere lor, este necesar să se stabilească de pavilion de întrerupere la nivel mondial folosind sei) comanda (pentru a se putea lucra cu scopul de funcționare INT0 V-USB propriu-zis.

O funcție ca usbPoll () indică gazdei că dispozitivul conectat este încă în viață și este gata să meargă, această funcție ar trebui să fie apelată cel puțin 50 ms. Dacă această condiție nu este îndeplinită, sistemul de operare Windows va scrie următoarele: "Un dispozitiv necunoscut este conectat"

Intervalul de 50ms - acest timeout USB pentru a accepta o configurare este o Message echipă specială de gazdă în acest exemplu HID_SET_REPORT și HID_GET_REPORT.

Funcția usbFunctionSetup () a fost mesaje de configurare, aici vine procesarea comenzilor de control USB, începe funcția usbFunctionRead în continuare există () sau usbFunctionWrite () funcție.

Descrierea raportului HID USB

Explicarea cuvinte mai inteligibile sunt colectate în matrice constantă și cusute în dispozitive de memorie Flash sunt necesare și să descrie structura pachetelor de date (raportul HID). Conține informații despre numărul de pachete pe care dispozitivul le acceptă. Fiecare bit și fiecare octet din pachet își are scopul. Odată ce dispozitivul este conectat la un calculator, descriptorul informează toți parametrii săi, la rândul său, sistemul de operare al calculatorului va înțelege cum să comunice cu dispozitivul, de exemplu, va ști ce biți Responsabilitatea pentru apăsarea butoanelor joystick unele.

Schimbarea descriptorului poate fi reprezentată de un dispozitiv HID specific, de exemplu, o tastatură sau altceva. Exemple interesante pe acest subiect: Micul USB murdar și cablul USB bântuit! Multe exemple interesante pot fi găsite pe site-ul V-USB.

Cum are loc procesul de transfer de date

În scopul transferului de date, facem o structură, utilizarea sa va face ca codul să fie mai convenabil și mai flexibil pentru a relua decât utilizarea simplă a unei matrice. Dacă aveți nevoie de o matrice, puteți să o adăugați și să o utilizați în interiorul structurii. In acest descriptor este un tip de raport, care are o dimensiune de 8 biți - REPORT_SIZE, valoarea acestora este egală cu mărimea structurii transferate - REPORT_COUNT. Se pare că datele sunt transmise în loturi de 8 biți. Implicit, V-USB acceptă transmisia și recepția de dimensiuni de 254 de octeți. Dacă avem nevoie de o dimensiune mai mare togla ne nuzheno în vystavitUSB_CFG_LONG_TRANSFERS usbconfig.h fișier la 1, dar în acest caz, crește dimensiunea conducătorului auto.

Procesarea datelor primite și transmise în interiorul microcontrolerului are două funcții:
  • usbFunctionRead (uncachar * data, unchar len);
  • usbFinctionWrite (date uncachar *, unchar).

Pentru simplificare, structura de date este populată în interiorul acestor funcții, dar nu trebuie să faceți acest lucru, puteți să le completați în alte părți ale codului, caz în care trebuie să le declarați volatile.

Un astfel de parametru ca * date este un indicator al tamponului V-USB unde originea este citirea și scrierea datelor care au o dimensiune len. Un astfel de tampon de date are o dimensiune maximă de 1 octet de tip uchar și această valoare este egală cu dimensiunea raportului nostru. Și dimensiunea structurii noastre este mai mare de 1 octet, motiv pentru care procesul de transfer de date are loc în părți. Pentru aceasta, există variabile curentAddress și bytesRemaining în care informațiile despre transferul curent sunt stocate.

Se pare că am declarat un indicator cu numele tampon uchar * la un anumit loc din memoria unde structura noastră este stocată. Transmisia se efectuează prin piese uchar.

Avr și usb

Programul pentru microcontroler

Apoi, trebuie să compilați programul și să îl scrieți în microcontroler. Dacă totul este configurat și realizat corect, după conectarea microcontrolerului la USB, calculatorul ar trebui să definească dispozitivele dvs. ca HID.

Avr și usb

Avr și usb

Scrierea unui program pentru un calculator

Avr și usb

Oferă o interfață convenabilă și simplă pentru lucrul cu HID. Creeping în a deveni "comunicarea cu controlerul prin USB". Configurarea proiectului și transferul de date au durat destul de mult până am dat peste această bibliotecă.

În cod nu există nimic complicat, există o funcție connect () este necesar să se conecteze dispozitivul, precum și manipulatorii de evenimente pentru trimiterea de date și pentru acceptarea de date. Cu ajutorul acestor butoane puteți bli LED-urile, porniți și opriți sarcini. Datele sunt transferate folosind structura dataexchange_t, aceeași structură este descrisă pentru microcontroler.

Pentru ca programul nostru să funcționeze pe alte compilatoare unde Borland C ++ nu este instalat, trebuie să treceți prin setările proiectului și să opriți utilizarea bibliotecilor dinamice. Pentru a face acest lucru, trebuie să faceți următoarele: Proiect> Opțiuni. În filele Linker și Packages, debifați "Utilizați RTL dinamic" și "Build with packages runtime".

Avr și usb







Trimiteți-le prietenilor: