Пишем OTA буутлоудър за ATmega128RFA1 (като част от устройството Smart Response XE)

Пишем OTA буутлоудър за ATmega128RFA1 (като част от устройството Smart Response XE)

Всичко започна с това, че авторът закупи интересно устройство на вторичния пазар - Smart Response XE (кратко описание). Предназначен е за училищата: всеки ученик от класа получава устройство, подобно на електронен бележник или преводач от 802.15.4-те години, учителят задава въпрос, а учениците въвеждат отговорите на клавиатурите на устройствата, които се получават чрез радиоканал (XNUMX) към приемник, свързан към компютъра на учителя.

Тези устройства бяха спрени преди няколко години и това, което училищата закупиха за $100-$200 всяко, сега се появява в eBay за $10 или по-малко. Хардуерът там е много подходящ за маниакални експерименти:

  • Клавиатура с 60 клавиша
  • дисплей с резолюция 384×136, 2 бита на пиксел - подобно на BC, CGA, но 4 не цвята, а градации на яркост
  • микроконтролер ATmega128RFA1 (128 kB флаш памет, 4 kB ROM, 16 kB RAM, 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 използва програмата за качване на скици avrdude. Той взаимодейства с микроконтролера, използвайки протокола STK500, което ви позволява да прехвърляте файлове в двете посоки. Той е слабо съвместим с канали, където са възможни променливи закъснения, изкривяване и загуба на данни. Ако нещо се разхлаби или шумоли в серийния канал, можете да се побъркате, търсейки причината. Веднъж авторът страда половин ден, докато разбере, че проблемът е в лош кабел, както и в капризен интерфейсен конвертор CP2102. Дори микроконтролер с вграден интерфейсен конвертор, например ATmega32u4, понякога може да действа по този начин. Всеки потребител на Arduino е забелязал, че грешките при качване на скици не са толкова редки. Понякога записът върви добре, но по време на тестово четене се открива грешка. Това не означава, че е имало грешка по време на запис - имаше грешка по време на четене. Сега си представете, че когато работите „по въздуха“, ще се случи същото, но много по-често.

След като опита различни начини за преодоляване на този проблем, авторът стигна до следното. Устройството има 128 KB флаш памет със SPI интерфейс - получаваме данни по кабелите (не забравяйте, че авторът вече има едно устройство с конектор отстрани), използваме тази памет като буфер и изпращаме данните по радиото канал към друго устройство. Здравейте от Cybiko.

След написването на кода за работа с радиоканала, както и шрифта, товарачът стана по-дълъг от 4 килобайта. Следователно стойността на HFUSE трябваше да бъде променена от 0xDA на 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. Twitter на автора - тук.

Източник: www.habr.com

Добавяне на нов коментар