为 ATmega128RFA1 编写 OTA 引导加载程序(作为 Smart Response XE 设备的一部分)

为 ATmega128RFA1 编写 OTA 引导加载程序(作为 Smart Response XE 设备的一部分)

这一切都始于笔者在二级市场上购买了一款有趣的设备——Smart Response XE(简要说明)。 它面向学校:班级中的每个学生都会收到一个类似于电子笔记本或九十年代翻译机的设备,老师提出问题,学生在设备的键盘上输入答案,这些答案通过无线电频道 (802.15.4) 到连接到教师 PC 的接收器。

这些设备几年前就停产了,学校每台售价 100 至 200 美元的设备现在在 eBay 上以 10 美元或更低的价格出售。 那里的硬件非常适合极客实验:

  • 60键键盘
  • 显示分辨率为 384×136,每像素 2 位 - 类似于 BC、CGA,但 4 不是颜色,而是亮度等级
  • 微控制器 ATmega128RFA1(128 kB 闪存、4 kB ROM、16 kB RAM、802.15.4 收发器)
  • 外部(相对于微控制器,而不是整个设备)具有 SPI 接口的 1 兆位(128 KB)闪存
  • 可容纳 4 个 AAA 元件的隔间。

从微控制器的名称可以清楚地看出它属于 AVR 系列,这意味着使设备兼容 Arduino 是一项非常简单的任务......

从消息传来 Hackaday 作者发现它是什么 已经做过 (相同的链接告诉您在哪里连接什么),有机会为 Arduboy 运行游戏:


但笔者更感兴趣的不是在设备上玩,而是学习的机会:

  • 具有串行 SPI 接口的闪存
  • AVR 的引导加载程序
  • 标准 802.15.4

作者从写开始 文库 (GPL v3),它允许您初始化显示、输出文本和矩形以及访问 SPI 闪存。 然后他开始想出实际使用该设备的想法:兼容 VT-100 的袖珍终端、多人游戏。 重建了三台设备后,他决定“教”它们“通过无线方式”接收草图。 这不仅有趣,而且非常方便:设备外壳每次都很难打开,并且电池仓盖下方只有一些孔,可以让您将 JTAG 编程器连接到电路板。

为 ATmega128RFA1 编写 OTA 引导加载程序(作为 Smart Response XE 设备的一部分)

这足以上传 Arduino 引导加载程序,但不足以上传草图 - 串行端口未连接到那里,因此您仍然无法不打开外壳。 此外,第一个串行端口的 TX0 和 RX0 线与键盘矩阵的轮询线组合,即轮询显示器侧面的功能键的线。 但你能做什么 - 作者构建了这个:

为 ATmega128RFA1 编写 OTA 引导加载程序(作为 Smart Response XE 设备的一部分)

他把JTAG线带到那里,现在不需要打开电池仓了。 为了上传草图,我将两个串行端口连接到同一个连接器,还添加了一个开关,因为安装了电池后,物理上不可能以任何其他方式关闭设备。

使用烙铁、美工刀和胶枪花了相当长的时间。 一般来说,“通过空中”上传草图要方便得多;我们迫切需要为此发明一些东西。

Arduino IDE使用程序上传草图 阿夫鲁德。 它使用协议与微控制器交互 STK500,它允许您双向传输文件。 它与可能出现可变延迟、失真和数据丢失的通道兼容性较差。 如果串行通道中出现松动或沙沙声,您可能会疯狂地寻找原因。 有一次笔者苦恼了半天,才意识到问题出在电缆坏了,以及反复无常的CP2102接口转换器上。 即使是带有内置接口转换器的微控制器,例如 ATmega32u4,有时也会出现这样的情况。 每个 Arduino 用户都注意到上传草图时出现错误并不罕见。 有时记录顺利,但在测试读取期间检测到错误。 这并不意味着写入过程中出现错误 - 读取过程中出现故障。 现在想象一下,当“通过无线方式”工作时,同样的事情也会发生,但发生的次数要多得多。

在尝试了不同的方法来解决这个问题后,作者提出了以下建议。 该设备有一个带 SPI 接口的 128 KB 闪存 - 我们通过电线接收数据(请记住,作者已经有一个侧面带有连接器的设备),使用该内存作为缓冲区,并通过无线电发送数据通道到另一台设备。 来自 Cybiko 的您好。

在编写了与无线电频道和字体一起使用的代码后,加载程序变得超过 4 KB。 因此,HFUSE 值必须从 0xDA 更改为 0xD8。 现在引导加载程序的长度可达 8 KB,起始地址现在为 0x1E000。 这在Makefile中有所体现,但填写时也应考虑到 引导程序 通过 avrdude。

ATmega802.15.4RFA128 中的 1 收发器最初设计为使用该协议进行操作 ZigBee的,这相当复杂,所以作者决定只传输数据包。 这是在 ATmega128RFA1 的硬件中实现的,因此只需要很少的代码。 另外,为了简单起见,作者决定使用固定通道,甚至不允许您手动选择它。 802.15.4标准支持16个通道,编号从11到26。它们相当拥挤,有些还重叠WiFi通道(红色是ZigBee通道,蓝、绿、黄是WiFi)。

为 ATmega128RFA1 编写 OTA 引导加载程序(作为 Smart Response XE 设备的一部分)

结果发现15和26频道最不容易受到WiFi的干扰,笔者选择了其中的第二个。 免责声明:译者不知道是否允许这样简化ZigBee。 也许我们应该多做一点编程并完全实现它?

在第一个设备上,需要实现一个通过 STK500 协议传输数据的有限状态机。 大多数情况下,发送和接收的消息是自给自足的,但有些消息与之前通过通道传递的消息相关。 给出了对话的描述 这里.

该对话的一个重要组成部分是传输要写入目标设备闪存的数据包。 对于AVR系列的简单微控制器,页面大小为128字节,但对于ATmega128RFA1,页面大小为256。对于通过SPI协议连接的闪存,也是相同的。 第一个设备中的程序在上传草图时不会立即将其传输到第二个设备,而是将其写入该内存。 当 Arduino IDE 检查条目的正确性时,会发送其中写入的内容。 现在我们需要通过无线电信道将接收到的数据传输到第二个设备。 同时,从接收到发送以及返回的切换也经常发生。 STK500协议对延迟漠不关心,但不容忍数据丢失(奇怪,不过上面说了延迟也会影响数据传输)。 而无线传输过程中的损耗是不可避免的。 ATmega128RFA1有一个内置的硬件实现,当对传输的正确性存在疑问时重复请求,但作者决定自己在软件中实现相同的功能。 他开发了一种协议,其中单向流动的数据比另一向流动的数据多得多。

它并不完美,但它有效。 256 字节的页面分为四个段,每个段都作为数据包通过空中传输。 一个数据包最多可容纳 125 个字节的数据,加上一个字节的长度和两个字节的 CRC。 因此,64 字节长的片段以及页号和段号(从 0 到 3)都放置在那里。 接收设备有一个变量,允许它跟踪已接收到多少个段,并且当所有四个段都到达时,发送设备会收到已接收到整个页面的确认。 没有确认(CRC 不匹配)- 重新发送整个页面。 速度甚至比通过电缆传输时还要快。 看:


但总的来说,有必要提供一种方便的方式将电缆连接到上传草图的设备并通过它。 例如,在CP2102上放置一个这样的接口转换器,如图所示,并将其粘在板上,使其能够承受连接和断开Micro USB电缆时的力。

为 ATmega128RFA1 编写 OTA 引导加载程序(作为 Smart Response XE 设备的一部分)

它还具有 3,3 伏稳定器(以及如何在具有 6 伏电源的设备中使用它 - 如果它具有相同的稳定器,并且您可以添加两个二极管来自动选择其中哪个将为设备供电) 。 所有三个 LED 都必须从接口转换板上拆下,否则它们在运行时会额外加载电池,并且还会干扰键盘轮询以及使用 SPI 接口的闪存。

事实证明,追求一个目标比实现它更有趣(并且不需要那个关于公共汽车的笑话)。 作者学习了很多关于AVR引导加载程序、SPI闪存、STK500协议和802.15.4标准的知识。

除了上述库之外的所有其他代码是 - 这里,并且它也遵循 GPL v3。 作者的推特 - 这里.

来源: habr.com

添加评论