我們正在為 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使用程式上傳草圖 AVRDUDE。 它使用協議與微控制器交互 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。 作者的推特 - 這裡.

來源: www.habr.com

添加評論