Всичко започна с това, че авторът закупи интересно устройство на вторичния пазар - Smart Response XE (
Тези устройства бяха спрени преди няколко години и това, което училищата закупиха за $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 е повече от тривиална задача...
От новините нататък
Но авторът се интересува повече от възможността да не играе на устройството, а да учи:
- флаш памет със сериен SPI интерфейс
- буутлоудъри за AVR
- Стандарт 802.15.4
Авторът започна с писане
Това е достатъчно, за да качите буутлоудъра на Arduino, но не и скицата - серийният порт не е свързан там, така че все още не можете да направите, без да отворите кутията. Също така линиите TX0 и RX0 на първия сериен порт се комбинират с линиите за запитване на матрицата на клавиатурата, а именно тези, които анкетират функционалните клавиши отстрани на дисплея. Но какво можете да направите - авторът е построил това:
Той донесе JTAG линиите там и сега няма нужда да отваряте отделението за батерии. И за да могат да се качват скици, свързах двата серийни порта към един конектор, като добавих и превключвател, тъй като с поставени батерии е физически невъзможно да изключа устройството по друг начин.
Отне доста време за работа с поялник, макетно ножче и пистолет за лепило. Като цяло качването на скици „по въздуха“ е много по-удобно, спешно трябва да измислим нещо за това.
Arduino IDE използва програмата за качване на скици
След като опита различни начини за преодоляване на този проблем, авторът стигна до следното. Устройството има 128 KB флаш памет със SPI интерфейс - получаваме данни по кабелите (не забравяйте, че авторът вече има едно устройство с конектор отстрани), използваме тази памет като буфер и изпращаме данните по радиото канал към друго устройство. Здравейте от Cybiko.
След написването на кода за работа с радиоканала, както и шрифта, товарачът стана по-дълъг от 4 килобайта. Следователно стойността на HFUSE трябваше да бъде променена от 0xDA на 0xD8. Сега буутлоудърът може да бъде с дължина до 8 килобайта, а началният адрес вече е 0x1E000. Това е отразено в Makefile, но също трябва да се вземе предвид при попълване
Приемопредавателят 802.15.4 в ATmega128RFA1 първоначално е проектиран да работи с помощта на протокола
Оказа се, че най-малко податливи на смущения от WiFi са канали 15 и 26. Авторът избра втория от тях. Отказ от отговорност: преводачът не знае дали е позволено да се опрости ZigBee по този начин. Може би трябва да направим малко повече програмиране и да го внедрим напълно?
На първото устройство е необходимо да се внедри краен автомат, който предава данни чрез протокола STK500. В по-голямата си част предаваните и получаваните съобщения са самодостатъчни, но някои са свързани с тези, които са преминали през канала по-рано. Дава се описание на диалога
Важен компонент на този диалог е предаването на пакети, предназначени да бъдат записани във флаш паметта на целевото устройство. За обикновените микроконтролери от семейството AVR размерът на страницата е 128 байта, но за ATmega128RFA1 е 256. А за флаш паметта, която е свързана чрез SPI протокола, е същата. Програмата в първото устройство при качване на скица не я прехвърля веднага на второто, а я записва в тази памет. Когато Arduino IDE провери коректността на въведеното, се изпраща написаното там. Сега трябва да предадем получените данни по радиоканал към второто устройство. В същото време превключването от приемане към предаване и обратно се случва доста често. Протоколът STK500 е безразличен към закъсненията, но не толерира загуба на данни (странно, но по-горе беше казано, че закъсненията също влияят на преноса на данни). А загубите по време на безжично предаване са неизбежни. ATmega128RFA1 има вградена хардуерна реализация на повтарящи се заявки, когато има съмнения относно коректността на трансфера, но авторът реши сам да внедри същото софтуерно. Той разработи протокол, при който много повече данни текат в едната посока, отколкото в другата.
Не е перфектно, но работи. Страницата от 256 байта е разделена на четири сегмента, всеки от които се предава по въздуха като пакет. Един пакет може да съдържа до 125 байта данни плюс един байт за дължина и два байта за CRC. Така че там се поставят фрагменти с дължина 64 байта заедно с номера на страници и сегменти (от 0 до 3). Получаващото устройство има променлива, която му позволява да проследи колко сегмента са получени и когато и четирите пристигнат, изпращащото устройство получава потвърждение, че цялата страница е получена. Няма потвърждение (CRC не съответства) - изпратете отново цялата страница. Скоростта е дори по-голяма, отколкото при предаване по кабел. Вижте:
Но като цяло би било необходимо да се осигури удобен начин за свързване на кабела към устройствата за качване на скици и чрез него. Например, поставете вътре такъв интерфейсен конвертор на CP2102, както е на снимката, и го залепете към платката, така че да може да издържи силата при свързване и изключване на Micro USB кабела.
Има и стабилизатор 3,3 волта (и как да го използвам в устройство с 6 волта захранване - само да е със същия стабилизатор и да добавите два диода, за да изберете автоматично кой от тях да захранва устройството) . И трите светодиода трябва да бъдат разпоени от платката на интерфейсния преобразувател, в противен случай те допълнително ще заредят батериите, когато работят върху тях, а също така ще пречат на избирането на клавиатурата и работата с флаш памет със SPI интерфейс.
Преследването на цел се оказа дори по-интересно от постигането й (и нямате нужда от тази шега за автобуса). Авторът научи много за AVR буутлоудърите, SPI флаш паметта, протокола STK500 и стандарта 802.15.4.
Целият друг код в допълнение към библиотеката, описана по-горе, е −
Източник: www.habr.com