这一切都始于笔者在二级市场上购买了一款有趣的设备——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 收发器)
- 外部(相对于微控制器,而不是整个设备)具有 SPI 接口的 1 兆位(128 KB)闪存
- 可容纳 4 个 AAA 元件的隔间。
从微控制器的名称可以清楚地看出它属于 AVR 系列,这意味着使设备兼容 Arduino 是一项非常简单的任务......
从消息传来
但笔者更感兴趣的不是在设备上玩,而是学习的机会:
- 具有串行 SPI 接口的闪存
- AVR 的引导加载程序
- 标准 802.15.4
作者从写开始
这足以上传 Arduino 引导加载程序,但不足以上传草图 - 串行端口未连接到那里,因此您仍然无法不打开外壳。 此外,第一个串行端口的 TX0 和 RX0 线与键盘矩阵的轮询线组合,即轮询显示器侧面的功能键的线。 但你能做什么 - 作者构建了这个:
他把JTAG线带到那里,现在不需要打开电池仓了。 为了上传草图,我将两个串行端口连接到同一个连接器,还添加了一个开关,因为安装了电池后,物理上不可能以任何其他方式关闭设备。
使用烙铁、美工刀和胶枪花了相当长的时间。 一般来说,“通过空中”上传草图要方便得多;我们迫切需要为此发明一些东西。
Arduino IDE使用程序上传草图
在尝试了不同的方法来解决这个问题后,作者提出了以下建议。 该设备有一个带 SPI 接口的 128 KB 闪存 - 我们通过电线接收数据(请记住,作者已经有一个侧面带有连接器的设备),使用该内存作为缓冲区,并通过无线电发送数据通道到另一台设备。 来自 Cybiko 的您好。
在编写了与无线电频道和字体一起使用的代码后,加载程序变得超过 4 KB。 因此,HFUSE 值必须从 0xDA 更改为 0xD8。 现在引导加载程序的长度可达 8 KB,起始地址现在为 0x1E000。 这在Makefile中有所体现,但填写时也应考虑到
ATmega802.15.4RFA128 中的 1 收发器最初设计为使用该协议进行操作
结果发现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标准的知识。
除了上述库之外的所有其他代码是 -
来源: habr.com