這一切都始於筆者在二級市場上購買了一款有趣的設備——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標準的知識。
除了上述庫之外的所有其他程式碼是 -
來源: www.habr.com