在台大電機的第一個學期終於結束,也撐過了地獄的兩個月,過年期間我將過去一年的種種在 Facebook 網誌上好好整理一番,在此就讓我直接開始那個從 12 月初就積欠到現在的專案文章吧!
有限的 A8106 datasheet
上篇【Amiccom A8106 RF 無線調光(1)】JTAG debugger 原理解析以埋控開發必備的 debugger 作為開頭,事實上跟 A8106 沒有絕對的關係,只是做了幾種 8051 單晶片的開發後,對於 debugger 之於開發的重要性有感而發,因而放置在此系列的第一個部分。
若要介紹 A8106 是如何進行 RF 通訊與實作,必須要先瞭解 A8106 的特性,那就得從 datasheet 下手,網路上能找到的是瑋忠 A8106 RF module 規格書,這裡面只有記載一些比較基本的資訊,像是 Electrical Specification,哪些 GPIO 在這個版本有被拉出來(Interface Descriptions),一些簡略的 features 介紹等等。
實際上如果要真的使用 A8106 實作 RF 通訊,還是要回歸到最原始 Amiccom A8106 datasheet 清楚瞭解各個 SFR(Special Function Register)和其他像是 timer、port 等等的功用,才有辦法成功實現,不過網路上並沒有相關文件(應該是沒有釋出),所以我只能將我用到的部分分享給大家參考。
實作 — 遙控器控制燈具
上篇文章也已經提到,此專案會利用遙控器(transmitter)發出 2.4G 訊號來控制燈具(receiver),並且利用硬體 PWM 的方式進行燈光控制。若在功能上定義得更清楚些,從接收端講起,由於接收器燈具的部分客戶會提供,我只負責將控制的部分寫好,收 RF 訊號,控制 8 顆燈(8 段亮度,每顆燈分別不做 PWM 只有 on/off 行為)的亮滅,實現硬體 PWM 的感覺。
不論發射端或是接收端,公司還是得搭配 A8106 設計我們自己的電路板,為了成本以及開發的便利性,基本上 transmitter 和 receiver 的板子是一模一樣的(至少在測試的時候是,不過由於電路圖是公司資產,我無法放上來),要模擬真實情況的應用,因此板上有三個 button(模擬發射器的三個鍵),以及由 A8106 拉出來的 8 隻 GPIO 以及一隻 GND 作為 output 給燈使用,如下圖:
此圖中的遙控器已是實際樣品的版本(新版本的 PCB 設計),不為前述給測試之用(圖片來源:Ryan 提供)
功能確定了,那接著就來看要如何從 datasheet 提供的資訊,利用 code 將 RF 做出來。
1. 理解 sample code 的脈絡
和之前的狀況一樣,為了讓開發者更容易上手他們家的單晶片,廠商都會釋出他們的 sample code 給下游做參考,以利下游公司的開發速度,這次也不例外,基本上所有基礎功能的 function 都已經寫好,像是 timer、interrupt、uart 等(不過看不看得懂又是另外一回事了...像這次的 code 真的很髒...,要不就是沒 comment、test code 糞 code 沒標註,要不就是變數名稱取的很難理解...)。
根據 sample code 的指示,我自己整理出了主要的功能脈絡,將 sample code 改寫成我要的東西。在 main 裡面,很乾淨的利用 define P3_5(*註 1),1 時為 transmitter,0 時為 receiver,不過有些東西是不論 transmitter 或是 receiver 都要設定好的初始值 - port 的設定。
2. 設定 GPIO 腳位
A8106 在 GPIO 方面,總共有三個 port,任一 port 皆由 8 bits 組成,每個 bit 代表一隻腳位(所以共 24 隻 I/O),像上述提到的 P3_5 即為一例。在設定方面,A8106 有一般的 logic high/low(*註 2)(eg. P0 = 0x00 -> port 0 所有 pin 腳皆是 LOW state),OE (output enable, eg. P0OE = 0x00 -> port 0 所有 pin 腳皆為 input mode),PUN(pull-up, eg. P0PUN = ~P0OE -> input pin 才需 pull-up),WUN (wake-up enable,這個部分牽涉到 sleep mode,因此會留到介紹 sleep mode 時一併說明)。
3. 設定 RF 腳位
根據需求以及上述說明來設定 register,除此之外,在 A8106 中,有三隻特殊給 RF 專用的腳位,分別為 GPIO1(P1_2),GPIO2(P1_3),CKO(P0_7),原先看 datasheet 以為這是 RF 運作時會用到的三隻腳位,不能讓我將其使用於一般 GPIO,不過後來經查證發現事實不然,RF 早就被 module 本身做掉了,何必要在使用三隻額外的 GPIO 做傳輸呢?
果然,此三隻腳位如果在 IOSEL 這個 register 為 xxxx 1111 時,可以用來對 RF 做一些設定或者說控制,並不是 RF 在傳輸時會利用到這三隻腳位,因此對我來說,此三腳位完全可以當作 GPIO 做使用(且瑋忠甚至沒有把 P1_2 拉出來)。
接著,timer0,RF 等的初始化,一些重要 flag(eg. TR0, EA)的設定,RF mode 的選擇等等做完後終於可以進入 transmitter 的部分。
*註 1:後來發現,瑋忠科技的版本因為有把 P3_5 這隻 GPIO 拉出來,既不是控制 8 個燈的其中任何一個 output pin,也不是 button input pin(因為公司設計的板子根本沒拉出 P3_5),所以實際上可以利用硬體的一個切換鈕去決定現在板子要是發射端或是接收端,不需要每次 upload 時都手動去更改 code 裡面 define P3_5 所代表的值。
*註 2:稍微提醒一下,我發現不少人會在實作的過程中將 logic HIGH / LOW 和 INPUT / OUTPUT 混在一起,且本人自己也犯過類似的錯,很神奇,但就是有可能會錯在這種地方...。
(本文同步發表於自造者萊恩;責任編輯:賴佩萱)
只需不到短短一分鐘...
輸入您的信箱與ID註冊即可享有一切福利!
會員福利
免費電子報
會員搶先看
主題訂閱
好文收藏
2019/02/22
寫的簡結有力!讚!