Nagsusulat kami ng OTA bootloader para sa ATmega128RFA1 (bilang bahagi ng Smart Response XE device)

Nagsusulat kami ng OTA bootloader para sa ATmega128RFA1 (bilang bahagi ng Smart Response XE device)

Nagsimula ang lahat sa pagbili ng may-akda ng isang kawili-wiling device sa pangalawang merkado - Smart Response XE (Maikling Paglalarawan). Ito ay inilaan para sa mga paaralan: ang bawat mag-aaral sa klase ay tumatanggap ng isang aparato na katulad ng isang elektronikong kuwaderno o isang tagasalin mula noong dekada nobenta, ang guro ay nagtatanong, at ang mga mag-aaral ay nagta-type ng mga sagot sa mga keyboard ng mga aparato, na natatanggap sa pamamagitan ng isang channel ng radyo (802.15.4) sa isang receiver na konektado sa PC ng guro.

Ang mga device na ito ay hindi na ipinagpatuloy ilang taon na ang nakalipas, at kung ano ang binili ng mga paaralan sa halagang $100-$200 bawat isa ay lumalabas na ngayon sa eBay sa halagang $10 o mas mababa. Ang hardware doon ay napaka-angkop para sa mga geeky na eksperimento:

  • 60 key na keyboard
  • display na may resolution na 384Γ—136, 2 bits per pixel - katulad ng BC, CGA, ngunit 4 hindi kulay, ngunit gradations ng ningning
  • microcontroller ATmega128RFA1 (128 kB flash memory, 4 kB ROM, 16 kB RAM, 802.15.4 transceiver)
  • panlabas (kaugnay ng microcontroller, hindi ang buong device) 1 megabit (128 kilobyte) flash memory na may interface ng SPI
  • kompartimento para sa 4 na elemento ng AAA.

Mula sa pangalan ng microcontroller ay malinaw na ito ay kabilang sa pamilya ng AVR, na nangangahulugang ang paggawa ng device na Arduino-compatible ay isang higit pa sa maliit na gawain...

Mula sa balita sa Hackaday nalaman ng may-akda kung ano ito nagawa na (sinasabi sa iyo ng parehong link kung saan ikokonekta), pagkakaroon ng pagkakataong magpatakbo ng mga laro para sa Arduboy:


Ngunit mas interesado ang may-akda sa pagkakataong hindi maglaro sa device, ngunit mag-aral:

  • flash memory na may serial interface ng SPI
  • mga bootloader para sa AVR
  • pamantayan 802.15.4

Nagsimula ang may-akda sa pagsulat mga aklatan (GPL v3), na nagbibigay-daan sa iyong simulan ang display, output ng text at mga parihaba, at i-access ang SPI flash memory. Pagkatapos ay nagsimula siyang makabuo ng mga ideya para sa praktikal na paggamit ng device: isang VT-100-compatible na pocket terminal, mga multiplayer na laro. Sa muling pagtatayo ng tatlong device, nagpasya siyang "turuan" silang tumanggap ng mga sketch "sa hangin." Ano ang magiging hindi lamang kawili-wili, ngunit napaka-maginhawa din: ang kaso ng aparato ay mahirap buksan sa bawat oras, at sa ilalim ng takip ng kompartimento ng baterya ay may mga butas lamang na nagbibigay-daan sa iyo upang ikonekta ang isang JTAG programmer sa board.

Nagsusulat kami ng OTA bootloader para sa ATmega128RFA1 (bilang bahagi ng Smart Response XE device)

Ito ay sapat na upang i-upload ang Arduino bootloader, ngunit hindi ang sketch - ang serial port ay hindi konektado doon, kaya hindi mo pa rin magagawa nang hindi binubuksan ang kaso. Gayundin, ang mga linya ng TX0 at RX0 ng unang serial port ay pinagsama sa mga linya ng botohan ng keyboard matrix, katulad ng mga nagpo-poll sa mga function key sa mga gilid ng display. Ngunit ano ang magagawa mo - binuo ito ng may-akda:

Nagsusulat kami ng OTA bootloader para sa ATmega128RFA1 (bilang bahagi ng Smart Response XE device)

Dinala niya ang mga linya ng JTAG doon, at ngayon ay hindi na kailangang buksan ang kompartamento ng baterya. At upang ma-upload ang mga sketch, ikinonekta ko ang parehong serial port sa parehong connector, nagdaragdag din ng switch, dahil sa naka-install na mga baterya, imposibleng pisikal na patayin ang device sa anumang iba pang paraan.

Medyo matagal bago magtrabaho gamit ang isang soldering iron, isang utility na kutsilyo at isang pandikit na baril. Sa pangkalahatan, ang pag-upload ng mga sketch "sa himpapawid" ay mas maginhawa; kailangan namin agad na mag-imbento ng isang bagay para dito.

Ginagamit ng Arduino IDE ang program upang mag-upload ng mga sketch avrdude. Nakikipag-ugnayan ito sa microcontroller gamit ang protocol STK500, na nagbibigay-daan sa iyong maglipat ng mga file sa parehong direksyon. Hindi ito katugma sa mga channel kung saan posible ang mga variable na pagkaantala, pagbaluktot at pagkawala ng data. Kung may kumawala o kumaluskos sa serial channel, maaari kang mabaliw sa paghahanap ng dahilan. Minsan ang may-akda ay nagdusa ng kalahating araw hanggang sa napagtanto niya na ang problema ay isang masamang cable, pati na rin ang isang kapritsoso na CP2102 interface converter. Kahit na ang isang microcontroller na may built-in na interface converter, halimbawa, ATmega32u4, ay maaaring kumilos nang ganito. Napansin ng bawat gumagamit ng Arduino na ang mga error kapag nag-upload ng mga sketch ay hindi gaanong bihira. Minsan ang pag-record ay napupunta nang maayos, ngunit sa panahon ng isang pagsubok na pagbabasa ay may nakitang error. Hindi ito nangangahulugan na nagkaroon ng error habang nagsusulat - nagkaroon ng kabiguan habang nagbabasa. Ngayon isipin na kapag nagtatrabaho "sa hangin" ang parehong bagay ay mangyayari, ngunit mas madalas.

Matapos subukan ang iba't ibang paraan upang mapagtagumpayan ang problemang ito, naisip ng may-akda ang mga sumusunod. Ang device ay may 128 KB flash memory na may SPI interface - tumatanggap kami ng data sa mga wire (tandaan na ang may-akda ay mayroon nang isang device na may connector sa gilid), gamitin ang memorya na ito bilang buffer, at ipadala ang data sa radyo channel sa isa pang device. Kamusta mula sa Cybiko.

Matapos isulat ang code upang gumana sa channel ng radyo, pati na rin ang font, ang loader ay naging mas mahaba sa 4 kilobytes. Samakatuwid, ang halaga ng HFUSE ay kailangang baguhin mula 0xDA hanggang 0xD8. Ngayon ang bootloader ay maaaring hanggang 8 kilobytes ang haba, at ang panimulang address ay 0x1E000 na ngayon. Ito ay makikita sa Makefile, ngunit dapat ding isaalang-alang kapag pinupunan bootloader sa pamamagitan ng avrdude.

Ang 802.15.4 transceiver sa ATmega128RFA1 ay orihinal na idinisenyo upang gumana gamit ang protocol ZigBee, na medyo kumplikado, kaya nagpasya ang may-akda na magpadala na lamang ng mga packet. Ito ay ipinatupad sa hardware sa ATmega128RFA1, kaya maliit na code ang kinakailangan. Gayundin, para sa pagiging simple, nagpasya ang may-akda na gumamit ng isang nakapirming channel, hindi pinapayagan kang piliin ito kahit na mano-mano. Ang 802.15.4 standard ay sumusuporta sa 16 na channel na may mga numero mula 11 hanggang 26. Medyo masikip ang mga ito, ang ilan ay nagsasapawan din ng mga WiFi channel (pula ang mga ZigBee channel, asul, berde at dilaw ang WiFi).

Nagsusulat kami ng OTA bootloader para sa ATmega128RFA1 (bilang bahagi ng Smart Response XE device)

Lumalabas na ang mga channel 15 at 26 ay hindi gaanong madaling kapitan ng interference mula sa WiFi. Pinili ng may-akda ang pangalawa sa kanila. Disclaimer: hindi alam ng tagasalin kung pinapayagan itong gawing simple ang ZigBee sa ganitong paraan. Siguro dapat tayong gumawa ng kaunti pang programming at ganap na ipatupad ito?

Sa unang aparato, kinakailangan upang ipatupad ang isang may hangganan na makina ng estado na nagpapadala ng data sa pamamagitan ng STK500 protocol. Para sa karamihan, ang mga mensaheng ipinadala at natanggap ay sapat sa sarili, ngunit ang ilan ay nakatali sa mga dumaan sa channel nang mas maaga. Ang paglalarawan ng diyalogo ay ibinigay dito.

Ang isang mahalagang bahagi ng diyalogong ito ay ang pagpapadala ng mga packet na nilalayong isulat sa flash memory ng patutunguhang device. Para sa mga simpleng microcontroller ng pamilya AVR, ang laki ng pahina ay 128 bytes, ngunit para sa ATmega128RFA1 ito ay 256. At para sa flash memory na konektado sa pamamagitan ng SPI protocol, ito ay pareho. Ang programa sa unang aparato, kapag nag-upload ng isang sketch, ay hindi agad na inilipat ito sa pangalawa, ngunit isinulat ito sa memorya na ito. Kapag sinusuri ng Arduino IDE ang kawastuhan ng entry, ipinapadala nito ang nakasulat doon. Ngayon ay kailangan nating ipadala ang natanggap na data sa pamamagitan ng radio channel sa pangalawang device. Kasabay nito, madalas na nangyayari ang paglipat mula sa pagtanggap sa pagpapadala at pabalik. Ang STK500 protocol ay walang malasakit sa mga pagkaantala, ngunit hindi pinahihintulutan ang pagkawala ng data (kakaiba, ngunit sinabi sa itaas na ang mga pagkaantala ay nakakaapekto rin sa paglilipat ng data). At ang mga pagkalugi sa panahon ng wireless transmission ay hindi maiiwasan. Ang ATmega128RFA1 ay may built-in na pagpapatupad ng hardware ng mga paulit-ulit na kahilingan kapag may mga pagdududa tungkol sa kawastuhan ng paglilipat, ngunit nagpasya ang may-akda na ipatupad ang parehong sa software mismo. Gumawa siya ng isang protocol kung saan mas maraming data ang dumadaloy sa isang paraan kaysa sa iba.

Ito ay hindi perpekto, ngunit ito ay gumagana. Ang 256-byte na pahina ay nahahati sa apat na mga segment, ang bawat isa ay ipinapadala sa himpapawid bilang isang packet. Ang isang packet ay maaaring maglaman ng hanggang 125 byte ng data kasama ang isang byte para sa haba at dalawang byte para sa CRC. Kaya't ang mga fragment na 64 bytes ang haba kasama ang mga numero ng pahina at segment (mula 0 hanggang 3) ay inilalagay doon. Ang receiving device ay may variable na nagbibigay-daan dito na subaybayan kung gaano karaming mga segment ang natanggap, at kapag dumating ang apat, ang nagpapadalang device ay makakatanggap ng kumpirmasyon na ang buong page ay natanggap. Walang kumpirmasyon (CRC ay hindi tumugma) - muling ipadala ang buong pahina. Ang bilis ay mas malaki kaysa kapag nagpapadala sa pamamagitan ng cable. Tingnan:


Ngunit sa pangkalahatan, kinakailangan na magbigay ng isang maginhawang paraan upang ikonekta ang cable sa mga device para sa pag-upload ng mga sketch at sa pamamagitan nito. Halimbawa, ilagay sa loob ng naturang interface converter sa CP2102, tulad ng nasa larawan, at idikit ito sa board upang mapaglabanan nito ang puwersa kapag kumokonekta at dinidiskonekta ang Micro USB cable.

Nagsusulat kami ng OTA bootloader para sa ATmega128RFA1 (bilang bahagi ng Smart Response XE device)

Mayroon din itong 3,3-volt stabilizer (at kung paano ito gamitin sa isang device na may 6-volt power supply - kung mayroon lamang itong parehong stabilizer, at maaari kang magdagdag ng dalawang diode upang awtomatikong piliin kung alin sa mga ito ang magpapagana sa device) . Ang lahat ng tatlong LED ay dapat na hindi na-solder mula sa interface converter board, kung hindi man ay mai-load din nila ang mga baterya kapag nagpapatakbo sa mga ito, at makagambala din sa pagboto sa keyboard at gagana sa flash memory na may interface ng SPI.

Ang paghabol sa isang layunin ay naging mas kawili-wili kaysa sa pagkamit nito (at hindi kailangan ang biro tungkol sa bus). Maraming natutunan ang may-akda tungkol sa mga AVR bootloader, SPI flash memory, ang STK500 protocol at ang 802.15.4 standard.

Ang lahat ng iba pang code bilang karagdagan sa aklatan na inilarawan sa itaas ay βˆ’ dito, at nasa ilalim din ito ng GPL v3. Twitter ng may-akda - dito.

Pinagmulan: www.habr.com

Magdagdag ng komento