Scriem un bootloader OTA pentru ATmega128RFA1 (ca parte a dispozitivului Smart Response XE)

Scriem un bootloader OTA pentru ATmega128RFA1 (ca parte a dispozitivului Smart Response XE)

Totul a început cu autorul achiziționării unui dispozitiv interesant pe piața secundară - Smart Response XE (scurtă descriere). Este destinat școlilor: fiecare elev din clasă primește un dispozitiv asemănător unui caiet electronic sau un traducător din anii 802.15.4, profesorul pune o întrebare, iar elevii tastează răspunsurile pe tastaturile aparatelor, care sunt primite printr-un canal radio (XNUMX) la un receptor conectat la calculatorul profesorului.

Aceste dispozitive au fost întrerupte în urmă cu câțiva ani, iar ceea ce școlile au cumpărat cu 100-200 USD fiecare apare acum pe eBay pentru 10 USD sau mai puțin. Hardware-ul de acolo este foarte potrivit pentru experimente geek:

  • Tastatură cu 60 de taste
  • afișaj cu o rezoluție de 384×136, 2 biți per pixel - similar cu BC, CGA, dar 4 nu culori, ci gradații de luminozitate
  • microcontroler ATmega128RFA1 (memorie flash de 128 kB, ROM 4 kB, RAM 16 kB, transceiver 802.15.4)
  • extern (în raport cu microcontrolerul, nu cu întregul dispozitiv) memorie flash de 1 megabit (128 kilobyte) cu interfață SPI
  • compartiment pentru 4 elemente AAA.

Din numele microcontrolerului reiese clar că acesta aparține familiei AVR, ceea ce înseamnă că a face dispozitivul compatibil cu Arduino este o sarcină mai mult decât banală...

De la știri încolo Hackaday autorul a aflat despre ce este vorba au făcut deja (același link vă spune ce să vă conectați unde), având posibilitatea de a rula jocuri pentru Arduboy:


Dar autorul este mai interesat de oportunitatea de a nu juca pe dispozitiv, ci de a studia:

  • memorie flash cu interfață serială SPI
  • bootloadere pentru AVR
  • standard 802.15.4

Autorul a început prin a scrie bibliotecă (GPL v3), care vă permite să inițializați afișajul, să scoateți text și dreptunghiuri și să accesați memoria flash SPI. Apoi a început să vină cu idei pentru utilizarea practică a dispozitivului: un terminal de buzunar compatibil VT-100, jocuri multiplayer. După ce a reconstruit trei dispozitive, a decis să le „învețe” să primească schițe „pe aer”. Ce ar fi nu numai interesant, ci și foarte convenabil: carcasa dispozitivului este greu de deschis de fiecare dată, iar sub capacul compartimentului bateriei există doar găuri care vă permit să conectați un programator JTAG la placă.

Scriem un bootloader OTA pentru ATmega128RFA1 (ca parte a dispozitivului Smart Response XE)

Acest lucru este suficient pentru a încărca bootloader-ul Arduino, dar nu și schița - portul serial nu este conectat acolo, așa că tot nu puteți face fără deschiderea carcasei. De asemenea, liniile TX0 și RX0 ale primului port serial sunt combinate cu liniile de interogare ale matricei tastaturii, și anume cele care interogează tastele funcționale de pe lateralele afișajului. Dar ce poți face - autorul a construit asta:

Scriem un bootloader OTA pentru ATmega128RFA1 (ca parte a dispozitivului Smart Response XE)

A adus liniile JTAG acolo, iar acum nu mai este nevoie să deschideți compartimentul bateriei. Și pentru ca schițele să poată fi încărcate, am conectat ambele porturi seriale la același conector, adăugând și un comutator, deoarece cu bateriile instalate este imposibil din punct de vedere fizic să oprești dispozitivul în alt mod.

A fost nevoie de ceva timp pentru a lucra cu un fier de lipit, un cuțit utilitar și un pistol de lipici. În general, încărcarea schițelor „prin aer” este mult mai convenabilă, trebuie urgent să inventăm ceva pentru asta.

Arduino IDE folosește programul pentru a încărca schițe avrdude. Interacționează cu microcontrolerul folosind protocolul STK500, care vă permite să transferați fișiere în ambele direcții. Este slab compatibil cu canalele în care sunt posibile întârzieri variabile, distorsiuni și pierderi de date. Dacă ceva se slăbește sau foșnește pe canalul serial, poți să înnebunești căutând cauza. Odată autorul a suferit o jumătate de zi până și-a dat seama că problema era un cablu prost, precum și un convertor capricios de interfață CP2102. Chiar și un microcontroler cu un convertor de interfață încorporat, de exemplu, ATmega32u4, poate acționa uneori astfel. Fiecare utilizator Arduino a observat că erorile la încărcarea schițelor nu sunt atât de rare. Uneori, înregistrarea merge bine, dar în timpul unui test de citire este detectată o eroare. Acest lucru nu înseamnă că a existat o eroare în timpul scrierii - a existat o eroare în timpul citirii. Acum imaginați-vă că atunci când lucrați „pe aer” se va întâmpla același lucru, dar mult mai des.

După ce a încercat diferite moduri de a depăși această problemă, autorul a venit cu următoarele. Dispozitivul are o memorie flash de 128 KB cu o interfață SPI - primim date prin fire (rețineți că autorul are deja un dispozitiv cu un conector pe lateral), folosim această memorie ca un buffer și trimitem datele prin radio canal către alt dispozitiv. Salutare de la Cybiko.

După ce a scris codul pentru a funcționa cu canalul radio, precum și cu fontul, încărcătorul a devenit mai lung de 4 kilobytes. Prin urmare, valoarea HFUSE a trebuit să fie schimbată de la 0xDA la 0xD8. Acum, bootloader-ul poate avea o lungime de până la 8 kilobytes, iar adresa de pornire este acum 0x1E000. Acest lucru se reflectă în Makefile, dar ar trebui să fie luat în considerare și la completare bootloader via avrdude.

Transceiver-ul 802.15.4 din ATmega128RFA1 este proiectat inițial să funcționeze folosind protocolul ZigBee, care este destul de complicat, așa că autorul a decis să transmită doar pachete. Acest lucru este implementat în hardware în ATmega128RFA1, așa că este necesar puțin cod. De asemenea, pentru simplitate, autorul a decis să folosească un canal fix, nepermițându-vă să îl selectați nici măcar manual. Standardul 802.15.4 suportă 16 canale cu numere de la 11 la 26. Sunt destul de aglomerate, unele se suprapun și canale WiFi (roșu sunt canale ZigBee, albastru, verde și galben sunt WiFi).

Scriem un bootloader OTA pentru ATmega128RFA1 (ca parte a dispozitivului Smart Response XE)

S-a dovedit că canalele 15 și 26 sunt cel mai puțin susceptibile la interferențe de la WiFi Autorul a ales al doilea dintre ele. Disclaimer: traducătorul nu știe dacă este permis să simplifice ZigBee în acest fel. Poate ar trebui să facem puțin mai multă programare și să o implementăm complet?

Pe primul dispozitiv, este necesar să se implementeze o mașină cu stări finite care transmite date prin protocolul STK500. În cea mai mare parte, mesajele transmise și primite sunt autosuficiente, dar unele sunt legate de cele care au trecut prin canal mai devreme. Este oferită descrierea dialogului aici.

O componentă importantă a acestui dialog este transmiterea pachetelor destinate a fi scrise în memoria flash a dispozitivului de destinație. Pentru microcontrolerele simple din familia AVR, dimensiunea paginii este de 128 de octeți, dar pentru ATmega128RFA1 este de 256. Și pentru memoria flash care este conectată prin protocolul SPI, este același lucru. Programul din primul dispozitiv, atunci când încarcă o schiță, nu o transferă imediat pe al doilea, ci o scrie în această memorie. Când IDE-ul Arduino verifică corectitudinea intrării, i se trimite ceea ce a fost scris acolo. Acum trebuie să transmitem datele primite prin canal radio către al doilea dispozitiv. În același timp, trecerea de la recepție la transmitere și înapoi are loc destul de des. Protocolul STK500 este indiferent la întârzieri, dar nu tolerează pierderea de date (ciudat, dar s-a spus mai sus că întârzierile afectează și transferul de date). Și pierderile în timpul transmisiei fără fir sunt inevitabile. ATmega128RFA1 are o implementare hardware încorporată a solicitărilor repetate atunci când există îndoieli cu privire la corectitudinea transferului, dar autorul a decis să implementeze el însuși același lucru în software. El a dezvoltat un protocol în care mult mai multe date circulă într-un fel decât în ​​altul.

Nu este perfect, dar funcționează. Pagina de 256 de octeți este împărțită în patru segmente, fiecare dintre acestea fiind transmisă prin aer sub formă de pachet. Un pachet poate conține până la 125 de octeți de date plus un octet pentru lungime și doi octeți pentru CRC. Deci fragmentele de 64 de octeți, împreună cu numerele de pagină și de segment (de la 0 la 3) sunt plasate acolo. Dispozitivul de primire are o variabilă care îi permite să urmărească câte segmente au fost primite, iar când sosesc toate patru, dispozitivul expeditor primește confirmarea că întreaga pagină a fost primită. Nicio confirmare (CRC nu s-a potrivit) - retrimiteți întreaga pagină. Viteza este chiar mai mare decât la transmiterea prin cablu. Vedea:


Dar, în general, ar fi necesar să se ofere o modalitate convenabilă de a conecta cablul la dispozitivele pentru încărcarea schițelor și prin intermediul acestuia. De exemplu, plasați în interiorul unui astfel de convertor de interfață pe CP2102, ca în fotografie, și lipiți-l pe placă, astfel încât să poată rezista forței la conectarea și deconectarea cablului Micro USB.

Scriem un bootloader OTA pentru ATmega128RFA1 (ca parte a dispozitivului Smart Response XE)

De asemenea, are un stabilizator de 3,3 volți (și cum să-l folosești într-un dispozitiv cu o sursă de alimentare de 6 volți - doar dacă are același stabilizator și poți adăuga două diode pentru a selecta automat care dintre ele va alimenta dispozitivul) . Toate cele trei LED-uri trebuie să fie dezlipite de pe placa convertorului de interfață, altfel vor încărca suplimentar bateriile atunci când funcționează pe ele și, de asemenea, vor interfera cu sondarea tastaturii și vor lucra cu memoria flash cu interfața SPI.

Urmărirea unui obiectiv s-a dovedit a fi chiar mai interesantă decât atingerea acestuia (și nu am nevoie de gluma aceea despre autobuz). Autorul a învățat multe despre încărcătoarele AVR, memoria flash SPI, protocolul STK500 și standardul 802.15.4.

Toate celelalte coduri în plus față de biblioteca descrisă mai sus sunt - aici, și este, de asemenea, sub GPL v3. Twitter-ul autorului - aici.

Sursa: www.habr.com

Adauga un comentariu