Ne po shkruajmë një ngarkues OTA për ATmega128RFA1 (si pjesë e pajisjes Smart Response XE)

Ne po shkruajmë një ngarkues OTA për ATmega128RFA1 (si pjesë e pajisjes Smart Response XE)

E gjitha filloi me blerjen e autorit të një pajisje interesante në tregun sekondar - Smart Response XE (Përshkrim i shkurtër). Ai është i destinuar për shkolla: çdo nxënës në klasë merr një pajisje të ngjashme me një fletore elektronike ose një përkthyes të viteve nëntëdhjetë, mësuesi bën një pyetje dhe nxënësit i shtypin përgjigjet në tastierat e pajisjeve, të cilat merren nëpërmjet një kanal radio (802.15.4) në një marrës të lidhur me kompjuterin e mësuesit.

Këto pajisje u ndërprenë disa vite më parë, dhe ato që shkollat ​​blenë për 100-200 dollarë secila tani po shfaqen në eBay për 10 dollarë ose më pak. Pajisja atje është shumë e përshtatshme për eksperimente geeky:

  • Tastierë me 60 tastierë
  • ekran me rezolucion 384×136, 2 bit për pixel - i ngjashëm me BC, CGA, por 4 jo ngjyra, por gradime të shkëlqimit
  • mikrokontrolluesi ATmega128RFA1 (memorie flash 128 kB, ROM 4 kB, RAM 16 kB, marrës 802.15.4)
  • memorie flash e jashtme (në lidhje me mikrokontrolluesin, jo të gjithë pajisjen) 1 megabit (128 kilobyte) me ndërfaqe SPI
  • ndarje për 4 elementë AAA.

Nga emri i mikrokontrolluesit është e qartë se ai i përket familjes AVR, që do të thotë se bërja e pajisjes të përputhshme me Arduino është një detyrë më shumë se e parëndësishme...

Nga lajmet e tutje Hakadej autori zbuloi se çfarë ishte kanë bërë tashmë (e njëjta lidhje ju tregon se ku të lidhni), duke pasur mundësinë të ekzekutoni lojëra për Arduboy:


Por autori është më i interesuar për mundësinë për të mos luajtur në pajisje, por për të studiuar:

  • memorie flash me ndërfaqe SPI serike
  • ngarkues për AVR
  • standardi 802.15.4

Autori filloi duke shkruar bibliotekë (GPL v3), i cili ju lejon të inicializoni ekranin, të nxirrni tekstin dhe drejtkëndëshat dhe të përdorni memorien flash SPI. Pastaj ai filloi të dilte me ide për përdorimin praktik të pajisjes: një terminal xhepi i pajtueshëm me VT-100, lojëra me shumë lojtarë. Pasi rindërtoi tre pajisje, ai vendosi t'i "mësojë" ata të marrin skica "në ajër". Çfarë do të ishte jo vetëm interesante, por edhe shumë e përshtatshme: kutia e pajisjes është e vështirë të hapet çdo herë, dhe nën kapakun e ndarjes së baterisë ka vetëm vrima që ju lejojnë të lidhni një programues JTAG me tabelën.

Ne po shkruajmë një ngarkues OTA për ATmega128RFA1 (si pjesë e pajisjes Smart Response XE)

Kjo është e mjaftueshme për të ngarkuar ngarkuesin Arduino, por jo skicën - porta serike nuk është e lidhur atje, kështu që ju ende nuk mund të bëni pa hapur rastin. Gjithashtu, linjat TX0 dhe RX0 të portës së parë serike kombinohen me linjat e votimit të matricës së tastierës, përkatësisht ato që shkruajnë tastet e funksionit në anët e ekranit. Por çfarë mund të bëni - autori e ndërtoi këtë:

Ne po shkruajmë një ngarkues OTA për ATmega128RFA1 (si pjesë e pajisjes Smart Response XE)

Ai solli linjat JTAG atje, dhe tani nuk ka nevojë të hapni ndarjen e baterisë. Dhe që të mund të ngarkoheshin skicat, i lidha të dyja portat serike në të njëjtin konektor, duke shtuar edhe një ndërprerës, sepse me bateritë e vendosura, është fizikisht e pamundur të fikësh pajisjen në ndonjë mënyrë tjetër.

U desh mjaft kohë për të punuar me një hekur saldimi, një thikë të dobishme dhe një armë ngjitëse. Në përgjithësi, ngarkimi i skicave "në ajër" është shumë më i përshtatshëm; ne duhet urgjentisht të shpikim diçka për këtë.

Arduino IDE përdor programin për të ngarkuar skica avrdude. Ai ndërvepron me mikrokontrolluesin duke përdorur protokollin STK500, i cili ju lejon të transferoni skedarë në të dy drejtimet. Është pak i pajtueshëm me kanalet ku vonesat e ndryshueshme, shtrembërimet dhe humbja e të dhënave janë të mundshme. Nëse diçka shpërndahet ose shushurimë në kanalin serial, mund të çmendeni duke kërkuar shkakun. Një herë autori vuajti për gjysmë dite derisa kuptoi se problemi ishte një kabllo e keqe, si dhe një konvertues kapriçioz i ndërfaqes CP2102. Edhe një mikrokontrollues me një konvertues të integruar të ndërfaqes, për shembull, ATmega32u4, ndonjëherë mund të veprojë kështu. Çdo përdorues i Arduino ka vënë re se gabimet gjatë ngarkimit të skicave nuk janë aq të rralla. Ndonjëherë regjistrimi shkon mirë, por gjatë leximit të testit zbulohet një gabim. Kjo nuk do të thotë se ka pasur një gabim gjatë shkrimit - ka pasur një dështim gjatë leximit. Tani imagjinoni që kur punoni "në ajër" e njëjta gjë do të ndodhë, por shumë më shpesh.

Pasi provoi mënyra të ndryshme për të kapërcyer këtë problem, autori doli me sa vijon. Pajisja ka një memorie flash 128 KB me një ndërfaqe SPI - ne marrim të dhëna përmes telave (mos harroni se autori tashmë ka një pajisje me një lidhës në anën), e përdorim këtë memorie si një tampon dhe i dërgojmë të dhënat përmes radios kanali në një pajisje tjetër. Përshëndetje nga Cybiko.

Pasi shkroi kodin për të punuar me kanalin e radios, si dhe fontin, ngarkuesi u bë më i gjatë se 4 kilobajt. Prandaj, vlera HFUSE duhej të ndryshohej nga 0xDA në 0xD8. Tani ngarkuesi mund të jetë deri në 8 kilobajt dhe adresa fillestare është tani 0x1E000. Kjo pasqyrohet në Makefile, por gjithashtu duhet të merret parasysh gjatë plotësimit bootloader nëpërmjet avrdude.

Transmetuesi 802.15.4 në ATmega128RFA1 është krijuar fillimisht për të funksionuar duke përdorur protokollin ZigBee, e cila është mjaft e ndërlikuar, kështu që autori vendosi të transmetojë vetëm paketa në vend. Kjo është implementuar në harduer në ATmega128RFA1, kështu që kërkohet pak kod. Gjithashtu, për thjeshtësi, autori vendosi të përdorë një kanal fiks, duke mos ju lejuar ta zgjidhni atë as manualisht. Standardi 802.15.4 mbështet 16 kanale me numra nga 11 në 26. Ata janë mjaft të mbushur me njerëz, disa gjithashtu mbivendosen kanale WiFi (e kuqe janë kanalet ZigBee, blu, jeshile dhe e verdhë janë WiFi).

Ne po shkruajmë një ngarkues OTA për ATmega128RFA1 (si pjesë e pajisjes Smart Response XE)

Doli se kanalet 15 dhe 26 janë më pak të ndjeshëm ndaj ndërhyrjeve nga WiFi. Autori zgjodhi të dytin prej tyre. Mohim përgjegjësie: përkthyesi nuk e di nëse lejohet të thjeshtojë ZigBee në këtë mënyrë. Ndoshta duhet të bëjmë pak më shumë programim dhe ta zbatojmë plotësisht?

Në pajisjen e parë, është e nevojshme të zbatohet një makinë me gjendje të fundme që transmeton të dhëna përmes protokollit STK500. Në pjesën më të madhe, mesazhet e transmetuara dhe të marra janë të vetë-mjaftueshme, por disa janë të lidhura me ato që kanë kaluar nëpër kanal më herët. Jepet përshkrimi i dialogut këtu.

Një komponent i rëndësishëm i këtij dialogu është transmetimi i paketave që synohen të shkruhen në memorien flash të pajisjes destinuese. Për mikrokontrolluesit e thjeshtë të familjes AVR, madhësia e faqes është 128 byte, por për ATmega128RFA1 është 256. Dhe për memorien flash që lidhet me protokollin SPI, është e njëjta gjë. Programi në pajisjen e parë, kur ngarkon një skicë, nuk e transferon menjëherë në të dytin, por e shkruan në këtë memorie. Kur Arduino IDE kontrollon korrektësinë e hyrjes, dërgohet ajo që është shkruar atje. Tani duhet të transmetojmë të dhënat e marra përmes kanalit të radios në pajisjen e dytë. Në të njëjtën kohë, kalimi nga marrja në transmetim dhe mbrapa ndodh mjaft shpesh. Protokolli STK500 është indiferent ndaj vonesave, por nuk toleron humbjen e të dhënave (e çuditshme, por u tha më lart se vonesat gjithashtu ndikojnë në transferimin e të dhënave). Dhe humbjet gjatë transmetimit me valë janë të pashmangshme. ATmega128RFA1 ka një implementim të integruar të harduerit të kërkesave të përsëritura kur ka dyshime për korrektësinë e transferimit, por autori vendosi të zbatojë të njëjtën gjë në softuer vetë. Ai zhvilloi një protokoll në të cilin shumë më tepër të dhëna rrjedhin në një mënyrë se në tjetrën.

Nuk është perfekte, por funksionon. Faqja 256-byte është e ndarë në katër segmente, secila prej të cilave transmetohet në ajër si një paketë. Një paketë mund të mbajë deri në 125 bajt të dhëna plus një bajt për gjatësi dhe dy bajt për CRC. Pra, fragmente 64 bajt të gjata së bashku me numrat e faqeve dhe segmenteve (nga 0 në 3) vendosen aty. Pajisja marrëse ka një variabël që e lejon atë të gjurmojë se sa segmente janë marrë dhe kur të mbërrijnë të katër, pajisja dërguese merr konfirmimin se e gjithë faqja është marrë. Asnjë konfirmim (CRC nuk përputhet) - ridërgo të gjithë faqen. Shpejtësia është edhe më e madhe se kur transmetohet me kabllo. Shiko:


Por në përgjithësi, do të ishte e nevojshme të sigurohet një mënyrë e përshtatshme për të lidhur kabllon me pajisjet për ngarkimin e skicave dhe përmes tij. Për shembull, vendoseni brenda një konverteri të tillë ndërfaqeje në CP2102, si në foto, dhe ngjiteni në tabelë në mënyrë që të përballojë forcën kur lidhni dhe shkëputni kabllon Micro USB.

Ne po shkruajmë një ngarkues OTA për ATmega128RFA1 (si pjesë e pajisjes Smart Response XE)

Ai gjithashtu ka një stabilizues 3,3 volt (dhe si ta përdorni në një pajisje me një furnizim me energji 6 volt - vetëm nëse ka të njëjtin stabilizues dhe mund të shtoni dy dioda për të zgjedhur automatikisht se cila prej tyre do të fuqizojë pajisjen) . Të tre LED-et duhet të mos bashkohen nga bordi i konvertuesit të ndërfaqes, përndryshe ato do të ngarkojnë shtesë bateritë kur funksionojnë me to, dhe gjithashtu do të ndërhyjnë në sondazhin e tastierës dhe do të punojnë me memorien flash me një ndërfaqe SPI.

Ndjekja e një qëllimi doli të ishte edhe më interesante sesa arritja e tij (dhe nuk keni nevojë për atë shaka për autobusin). Autori mësoi shumë për ngarkuesit AVR, memorien flash SPI, protokollin STK500 dhe standardin 802.15.4.

I gjithë kodi tjetër përveç bibliotekës së përshkruar më sipër është - këtu, dhe është gjithashtu nën GPL v3. Twitter i autorit - këtu.

Burimi: www.habr.com

Shto një koment