我们为ATmega128RFA1(作为Smart Response XE设备的一部分)编写了OTA加载器。



这一切都始于作者在二级市场上购买了一种有趣的设备-Smart Response XE( 简短说明 )。 它适用于学校:班上的每个学生都会收到类似于90年代的电子笔记本或翻译器的设备,老师会问一个问题,然后学生会在设备的键盘上键入通过无线电频道(802.15.4)接收到的答案的答案,并将其接收到与教师PC相连的接收器上。

对这些设备的支持在几年前就已经停止了,学校以每台100-200美元的价格购买的事实,现在在eBay上以10美元或更少的价格出现。 铁在那里非常适合极客实验:

  • 60键键盘
  • 分辨率为384x136的显示器,每个像素2位-与BK,CGA相似,但4种不是颜色,而是亮度等级
  • ATmega128RFA1微控制器(128 kB闪存,4 kB ROM,16 kB RAM,802.15.4标准收发器)
  • 带有SPI的1 MB(128 KB)外部(相对于微控制器,而非整个设备)闪存
  • 4个AAA元件的隔层。

以微控制器的名称,很明显它属于AVR系列,这意味着制造与Arduino兼容的设备是一项艰巨的任务。

Hackaday的新闻中作者发现他们已经做到了 (相同的链接说明了要连接的内容),并有机会为Arduboy运行游戏:


但是作者对不是在设备上玩游戏而是研究的机会更感兴趣:

  • 串行闪存SPI
  • AVR下载器
  • 标准802.15.4

作者首先编写了一个 (GPL v3),该允许您初始化显示,显示文本和矩形,以及使用SPI接口访问闪存。 然后,他开始想出该设备的实际使用思路:一个口袋大小的VT-100兼容终端,多人游戏。 改造了这三个设备后,他决定“教”他们如何“空中”获取草图。 这不仅很有趣,而且非常方便:每次都很难打开设备外壳,并且在电池盖下方只有孔,可以将JTAG编程器连接到板上。



这足以填充Arduino引导加载程序,但不足够草图-串行端口未在其中输出,如果不打开外壳,您仍然无法做到。 同样,第一串行端口的TX0和RX0线与键盘矩阵的轮询线对齐,也就是沿其将功能键轮询到显示器侧面的轮询线。 但是该怎么做-作者构建了以下代码:



他在那里带出了JTAG线,现在不必打开电池盒了。 为了能够填写草图,我将两个串行端口都移到了同一连接器上,还添加了一个开关,因为在安装电池时,无法以不同的方式关闭设备。

花了很长时间才使用烙铁,笔刀和胶枪。 通常,“空中”浇注草图要方便得多,为此迫切需要发明一些东西。

Arduino IDE使用avrdude填写草图。 它通过STK500协议与微控制器交互,使您可以双向传输文件。 它与可能存在可变延迟,失真和数据丢失的通道的兼容性较差。 如果串行通道出现故障或沙沙作响,您可能会发疯寻找原因。 作者遭受了半天的折磨,直到他意识到问题出在电缆不良以及CP2102接口的反复无常的问题上。 即使是带有内置接口转换器的微控制器,例如ATmega32u4,有时也很顽皮。 每个Arduino用户都已经注意到上传草图时的错误并不太常见。 有时记录会很好,并且在验证读取期间会检测到错误。 这并不意味着写入时发生错误-读取时发生了故障。 现在想象一下,当“无线”工作时,会发生相同的事情,但是更多的时候会发生。

为了克服这个问题,作者尝试了以下方法。 该设备具有一个带SPI接口的128 KB闪存-我们通过电线接收数据(请记住作者已经有一个设备的侧面带有连接器),我们将该内存用作缓冲区,然后通过无线电通道将数据发送到另一设备。 Cybiko这么打招呼。

在编写了用于无线电频道的代码以及字体后,引导加载程序的长度超过了4 KB。 因此,必须将HFUSE值从0xDA更改为0xD8。 现在,引导加载程序的最大长度为8 KB,并且起始地址已变为0x1E000。 这反映在Makefile中,但在用avrdude填充引导加载程序时应予以考虑。

ATmega128RFA1中的802.15.4标准收发器最初设计为可在ZigBee协议上运行,该协议相当复杂,因此作者决定改为简单地传输数据包。 这是ATmega128RFA1中实现的硬件,因此需要一些代码。 另外,为简单起见,作者决定使用固定通道,从而阻止他手动选择它。 802.15.4标准支持16个通道,编号从11到26。它们非常阻塞,有些通道还与WiFi通道重叠(红色表示ZigBee通道,蓝色,绿色和黄色-WiFi)。



事实证明,信道15和26最不容易受到WiFi干扰,作者选择了其中的第二个。 免责声明:译者不知道ZigBee是否如此简化。 也许值得进行一些编程和完整的实现?

在第一个设备上,有必要实现使用STK500协议传输数据的状态机。 在大多数情况下,发送和接收的消息是自给自足的,但有些消息与早先通过该通道的消息相关。 在此给出对话的说明。

该对话的重要组成部分是将要写入的数据包传输到目标设备的闪存中。 AVR系列的简单微控制器的页面大小为128字节,而ATmega128RFA1的页面大小为256。通过SPI协议连接的闪存具有相同的大小。 倒入草图时,第一个设备中的程序不会立即将其传输到第二个设备,而是将其写入此存储器。 当Arduino IDE检查记录的正确性时,他们会将记录中的内容发送给它。 现在,您需要通过无线方式将接收到的数据传输到第二台设备。 同时,从接收切换到传输,反之亦然。 STK500协议对延迟无关紧要,但是不能容忍数据丢失(奇怪,但是上面说过,数据传输的延迟也会影响)。 无线传输的损失是不可避免的。 ATmega128RFA1具有重复请求的内置硬件实现,怀疑是否正确传输,但是作者决定自己以编程方式实现同​​样的功能。 他开发了一种协议,在该协议中,一个方向传递的数据要多于另一个方向。

这是不完美的,但是一切正常。 256字节的页面分为四个段,每个段作为分组在空中传输。 一个数据包最多可容纳125个字节的数据,再加上一个字节的长度和两个CRC。 因此,将64个字节长的片段以及页和段号(从0到3)放置在此处。 在接收设备中,提供了一个变量,该变量使您可以跟踪接收到多少段,并且在接收到全部四个段时,向发送设备发送确认已接收到整个页面的确认。 没有确认(CRC不匹配)-再次发送整个页面。 同时速度比通过电缆传输时还要快。 请参阅:


但是实际上,有必要提供一种方便的方法将电缆设备连接到设备,以填写草图及其上的内容。 例如,如图所示,将此类接口转换器放在CP2102上,然后将其粘贴到板上,以便在连接和断开Micro USB电缆时可以承受力。



它还具有一个3.3伏稳定器(以及如何在具有6伏电源的设备中使用它-如果那里只有相同的稳定器,则可以添加两个二极管以自动选择从哪个二极管为设备供电)。 应将所有三个LED从接口转换器板上卸下,否则在使用它们时会另外给电池加电,并且还会干扰键盘轮询并通过SPI接口使用闪存。

追求目标比实现目标更加有趣(而且您不必为公交车开玩笑)。 作者了解了很多有关AVR的引导程序,具有SPI,STK500协议和802.15.4标准的闪存的知识。

除了上述库之外,所有其他代码都在此处 ,并且也在GPL v3下。 作者的推特在这里

Source: https://habr.com/ru/post/zh-CN447026/


All Articles