Пішам OTA-загрузнік для ATmega128RFA1 (у складзе прылады Smart Response XE)

Пішам OTA-загрузнік для ATmega128RFA1 (у складзе прылады Smart Response XE)

Усё пачалося з набыцця аўтарам на другасным рынку цікавага прылады – Smart Response XE (кароткае апісанне). Прызначана яно для школ: кожны вучань у класе атрымлівае па аксэсуары, падобнаму на электронную запісную кніжку або перакладчык дзевяностых, настаўнік задае пытанне, і вучні набіраюць на клавіятурах прылад адказы, якія паступаюць па радыёканале (802.15.4) у прымач, падлучаны настаўнік.

Падтрымка гэтых прылад спынена некалькі гадоў таму, і тое, што школы закуплялі па 100-200 даляраў за штуку, зараз усплывае на eBay па 10 і менш. "Жалеза" там ну вельмі падыходзіць для гікаўскіх досведаў:

  • клавіятура на 60 клавіш
  • дысплей з дазволам у 384×136, 2 біта на піксель – аналагічна БК, CGA, але 4 не колеры, а градацыі яркасці
  • мікракантролер ATmega128RFA1 (128 кБ флэш-памяці, 4 кБ ПЗУ, 16 кБ АЗП, прыёмаперадатчык стандарту 802.15.4)
  • знешняя (у адносінах да мікракантролера, а не ўсёй прыладзе) флэш-памяць на 1 мегабіт (128 кілабайт) з інтэрфейсам SPI
  • адсек для 4 элементаў ААА.

Па назове мікракантролера зразумела, што ён ставіцца да сямейства AVR, а значыць, зрабіць прыладу Arduino-сумяшчальным — задача больш за трывіяльная…

З навіны на Hackaday аўтар даведаўся, што гэта ужо зрабілі (па гэтай жа спасылцы расказана, што куды падключаць), атрымаўшы магчымасць запускаць гульні для Arduboy:


Але аўтара больш цікавіць магчымасць не пагуляць на прыладзе, а вывучыць:

  • флэш-памяць з паслядоўным інтэрфейсам SPI
  • загрузнікі для AVR
  • стандарт 802.15.4

Аўтар пачаў з напісання бібліятэкі (GPL v3), якая дазваляе ініцыялізаваць дысплей, выводзіць тэкст і прастакутнікі, а таксама атрымліваць доступ да флэш-памяці з інтэрфейсам SPI. Затым ён пачаў прыдумляць ідэі практычнага выкарыстання прылады: кішэнны VT-100-сумяшчальны тэрмінал, шматкарыстальніцкія гульні. Перарабіўшы тры девайса, ён вырашыў "навучыць" іх атрымліваць скетчы "па паветры". Што было б не толькі цікава, але і вельмі зручна: корпус прылады кожны раз адчыняць цяжка, а пад вечкам батарэйнага адсека знаходзяцца толькі адтуліны, якія дазваляюць падлучаць да платы JTAG-праграматар.

Пішам OTA-загрузнік для ATmega128RFA1 (у складзе прылады Smart Response XE)

Гэтага досыць каб заліць загрузнік Arduino, але не скетч паслядоўны порт туды не выведзены, без выкрыцця корпуса ўсё роўна не абыйсціся. Таксама лініі TX0 і RX0 першага паслядоўнага порта сумешчаны з лініямі апытання матрыцы клавіятуры, а менавіта – тымі, па якіх ідзе апытанне функцыянальных клавіш па баках ад дысплея. Але што парабіць - аўтар збудаваў вось што:

Пішам OTA-загрузнік для ATmega128RFA1 (у складзе прылады Smart Response XE)

Туды ён вывеў лініі JTAG, і зараз батарэйны адсек адчыняць не абавязкова. А каб можна было заліваць і скетчы, вывеў на гэты ж раздым і абодва паслядоўных порта, дадаўшы таксама выключальнік, таму што пры ўсталяваных батарэйках прылада па-іншаму фізічна выключыць немагчыма.

Запатрабавалася даволі доўга папрацаваць паяльнікам, канцылярскім нажом і клеевым пісталетам. Увогуле, "па паветры" заліваць скетчы значна зручней, трэба для гэтага тэрмінова нешта вынаходзіць.

Arduino IDE для залівання скетчаў выкарыстоўвае праграму аврчуд. Яна ўзаемадзейнічае з мікракантролерам па пратаколе STK500, які дазваляе перадаваць файлы ў абодва бакі. Ён дрэнна сумяшчальны з каналамі, дзе магчымыя зменныя затрымкі, скажэнне і страта дадзеных. Калі ў паслядоўным канале нешта адыходзіць ці шамаціць, можна сысці з розуму ў пошуках прычыны. Адзін раз аўтар прамучыўся паўдня, пакуль не зразумеў, што справа ў дрэнным кабелі, а таксама капрызным пераўтваральніку інтэрфейсу CP2102. Нават мікракантролер са ўбудаваным пераўтваральнікам інтэрфейсу, напрыклад, ATmega32u4, можа часам так «сваволіць». Кожны карыстач Arduino заўважаў, што памылкі пры заліванні скетчаў не так ужо рэдкія. Часам запіс праходзіць нармальна, а пры праверачным счытванні выяўляецца памылка. Гэта не значыць, што памылка была пры запісе - збой быў пры чытанні. А зараз уявіце, што пры працы «па паветры» будзе адбывацца тое ж самае, але нашмат часцей.

Перакаштаваўшы розныя спосабы пераадолення гэтай праблемы, аўтар прыдумаў наступнае. У прылады ёсць 128-кілабайтная флэш-памяць з інтэрфейсам SPI – прымаем дадзеныя па правадах (памятаем, што адзін девайсы з раздымам на баку ў аўтара ўжо ёсць), выкарыстоўваем гэтую памяць як буфер, і па радыёканале адпраўляем дадзеныя ў іншую прыладу. Такое прывітанне ад Cybiko.

Пасля напісання кода для працы з радыёканалам, а таксама шрыфта, загрузнік стаў даўжэйшы за 4 кілабайт. Таму значэнне HFUSE прыйшлося памяняць з 0xDA to 0xD8. Цяпер загрузнік можа быць даўжынёй да 8 кілабайт, а пачатковы адрас стаў роўны 0x1E000. Гэта адлюстравана ў Makefile, але павінна быць улічана і пры заліванні загрузніка з дапамогай avrdude.

Прыёмаперадатчык стандарту 802.15.4 у ATmega128RFA1 першапачаткова прызначаны для працы па пратаколе ZigBee, які даволі складаны, таму аўтар вырашыў замест гэтага проста перадаваць пакункі. Гэта ў ATmega128RFA1 рэалізавана апаратна, так што кода спатрэбіцца няшмат. Таксама для прастаты аўтар вырашыў выкарыстоўваць фіксаваны канал, не даючы абраць яго нават уручную. Стандарт 802.15.4 падтрымлівае 16 каналаў з нумарамі ад 11 да 26. Яны даволі забітыя, некаторыя таксама перакрываюць каналы WiFi (чырвоным пазначаны каналы ZigBee, сінім, зялёным і жоўтым - WiFi).

Пішам OTA-загрузнік для ATmega128RFA1 (у складзе прылады Smart Response XE)

Аказалася, што найменш схільныя перашкодам ад WiFi каналы 15 і 26. Другі з іх аўтар і абраў. Дысклеймер: перакладчык не ведае, ці дазволена так спрашчаць ZigBee. Можа быць, варта яшчэ крыху папраграмаваць і рэалізаваць яго цалкам?

На першым з прылад трэба рэалізаваць канчатковы аўтамат, які перадае дадзеныя па пратаколе STK500. У большасці сваёй перадаюцца і прыманыя паведамленні самадастатковыя, але некаторыя прывязаныя да ранейшых па канале. Апісанне дыялогу прыведзена тут.

Важным складнікам гэтага дыялогу з'яўляецца перадача пакетаў, прызначаных для запісу ў флэш-памяць прылады прызначэння. У простых мікракантролераў сямейства AVR памер старонкі складае 128 байт, але ў ATmega128RFA1 – 256. А ў той флэш-памяці, якая падключаецца па пратаколе SPI, ён такі ж. Праграма ў першай прыладзе пры заліванні скетчу не перадае яго адразу ў другое, а піша яго ў гэтую памяць. Калі ж Arduino IDE правярае правільнасць запісу, яму дасылаюць тое, што туды запісалася. Зараз трэба перадаць атрыманыя дадзеныя па радыёканале ў другую прыладу. Пры гэтым пераключэнне з прыёму на перадачу і зваротна адбываецца даволі часта. Пратакол STK500 абыякавы да затрымак, але не церпіць страты дадзеных (дзіўна, а вышэй сказана, што затрымкі на перадачы дадзеных таксама адбіваюцца). А страты пры бесправадной перадачы непазбежныя. У ATmega128RFA1 убудавана апаратная рэалізацыя паўторных запытаў пры сумневах у правільнасці перадачы, але аўтар вырашыў рэалізаваць тое ж самае праграмна самастойна. Ён распрацаваў пратакол, пры якім у адзін бок праходзіць нашмат больш дадзеных, чым у іншы.

Ён неідэальны, але ўсё працуе. 256-байтная старонка разбіваецца на чатыры сегменты, кожны з якіх перадаецца па радыёканале ў выглядзе пакета. Пакет месціць да 125 байт дадзеных плюс адзін байт - даўжыня і два - CRC. Так што фрагменты даўжынёй па 64 байта разам з нумарамі старонак і сегментаў (ад 0 да 3) туды змяшчаюцца. У прымальнай прыладзе прадугледжана зменная, якая дазваляе адсачыць, колькі сегментаў прынята, і калі прыходзяць усе чатыры, на якая перадае прылада ідзе пацверджанне, што прынята ўся старонка. Няма пацверджання (CRC не супала) - адпраўляем усю старонку нанова. Хуткасць пры гэтым атрымліваецца нават большая, чым пры перадачы па кабелі. Глядзіце:


Але наогул-то, трэба бы прадугледзець зручны спосаб падлучэння да прылад кабеля для залівання скетчаў і па ім. Напрыклад, змясціць унутр такі пераўтваральнік інтэрфейсаў на CP2102, як на фота, і прыляпіць яго да платы так, каб ён вытрымліваў высілак пры падлучэнні і адключэнні Micro USB-кабеля.

Пішам OTA-загрузнік для ATmega128RFA1 (у складзе прылады Smart Response XE)

Таксама ў ім ёсць 3,3-вольтавы стабілізатар (і як яго ўжыць у прыладзе з 6-вольтавым харчаваннем – калі толькі там ёсць такі ж стабілізатар, і можна дадаць два дыёда, каб аўтаматычна выбіраць, ад якога з іх будзе сілкавацца прылада). З платы пераўтваральніка інтэрфейсу трэба выпаяць усе тры святлодыёда, інакш яны будуць дадаткова нагружаць батарэйкі пры працы ад іх, а таксама мяшаць апытанню клавіятуры і працы з флэш-памяццю з інтэрфейсам SPI.

Пераслед мэты аказаўся нават цікавейшым, чым яе дасягненне (і не трэба таго анекдота пра аўтобус). Аўтар даведаўся шмат новага пра загрузнікі для AVR, флэш-памяці з інтэрфейсам SPI, пратаколе STK500 і стандарце 802.15.4.

Увесь астатні код у дадатак да апісанай вышэй бібліятэкі. тут, і ён таксама пад GPL v3. Твітэр аўтара тут.

Крыніца: habr.com

Дадаць каментар