【Amiccom A8106 RF 無線調光 (1)】JTAG debugger 原理解析

作者:Ryan Hu

本系列將介紹如何以 8051 為基礎的 RF 模組來做遙控器與接收器,以完成硬體調光。本篇將先講解其中的 debugger 與 bootloader 運作原理,以及 JTAG 介面的強大功能。

A8106 瑋忠科技版本

一如既往,我們先解釋一下這次的專案要做什麼。簡單來說,我要利用 Amiccom(笙科電子)以 8051 為基底的 RF 模組 — A8106,做一對遙控器和接收器,讓發射端廣播 2.4G 的訊號,而接收端收到 packet 並解析後會完成相對應調光的動作。這次的重點是硬體調光,而不是軟體的 PWM。

這是我在安可爾所經手的第二個案子,老實說,難度真的滿高的。以前在 Arduino 上玩的 WiFi、BLE(都是 2.4G)都是由第三方 library 寫好,再直接 call function 來用即可。但這次我沒有 function 可以 call ,只有下游廠商莫名又難懂的 sample code(很多真的有寫跟沒寫一樣……)能參考,需要自行研究 2.4G RF 的傳輸方式。

幸好經過幾個星期的努力終於破關(不過只搞定最主要的功能,其他部分需要繼續研究);本系列文章便是專案實作的過程,接下來將會一一分享。

debugger 的秘密

做韌體的同好朋友一定都知道,無論要開發的專案內容為何,「燒錄」絕對是最基本、也是最重要的事。

前一個專案是我第一次使用 keil C51 進行開發,當時有個叫做 SN-LINK 的硬體,據說是 SN8F5701 這個模組開發的 debugger;我不疑有他,接上去後照著步驟設定,的確能夠執行燒錄動作。

而因為 Arduino 並不需要這樣的東西,不需要在模組和電腦之間還要連一個 debugger 才可以燒錄;因此我當時只覺得是特例,並沒有多想,直到這次的專案又出現了 debugger(這次名稱是 ICE,是 Amiccom 自家推出的 debugger),這才完全激起我的好奇心。

為什麼這個 debugger 需要存在?它不就是個燒錄器嗎?我們先講結論,其實它的主要功能並不是燒錄,因此如果你沒有要執行 debug mode,那它其實不需要存在。

而故事的源頭,要從 bootloader 開始講起……

bootloader 的意義

我們都知道燒錄和 bootloader 脫離不了關係。

Bird 曾經跟我說過:「Everything can be called bootloader before user code.」

在一個模組(開發板)中,bootloader 可以有很多段;例如,若確定為燒錄模式,就會執行接下來的 bootloader 去等待 UART 的資料,接著再寫到 program flash(像是中間經過類似 erase block 等),執行動作後便完成燒錄。

在模組通電的瞬間,模組內會先執行 MCU 廠商已經寫死在裡面的 bootloader,用來控制硬體;像這次使用的 A8106,在其 datasheet 中便提到:P04 腳位如果在 LOW 時會進入燒錄模式,若為 HIGH 則為 normal mode。也就是說,通電後,bootloader 將利用判斷式去偵測 P04 腳位的情況,再根據判斷結果塞對應的值進去相關的暫存器,以完成燒錄或正常模式。

相信有在玩專案的 maker 同好們或多或少都知道這個流程,不過這些跟 debugger 的關聯為何?

一般的埋控開發,在與電腦連結前,中間都會出現一個 middleware(也就是 debugger),而我們就來好好介紹一下這個連接 debugger 的介面。因為 P04 若為 LOW,則與 debugger 連接的其中兩條線(此為 P14 和 P15)將被設成 debug IO(可以進行燒錄或 debug);反之,若 P04 為 HIGH(normal mode),P14 和 P15 就會是普通的 GPIO。

此介面稱為 JTAG(or SWD),不過一般玩 Arduino 的 maker 不太會接觸 JTAG 的介面,而講到 JTAG, 當然也得一起說明 SWD 才完整,但其實簡單來說,SWD 就是簡化版的 JTAG。

JTAG 是在一般模組、開發板上常會看到的 debug 介面,由四隻腳組成(這裡講的是主要形式,市面上還有許多奇形怪狀的形式),分別是:

1. TDI(data in)
2. TDO(data out)
3. CLK(clock)
4. TMS(mode 切換)
*備註:每家使用的名稱可能會有些許差異,但功能都大同小異。

它可以操縱 IC 內暫存器的讀取或寫入,這聽起來沒有很厲害,因為依照上次專案的經驗,我的 user code 也可以直接對 MCU 的暫存器進行設值的動作。
不過我們以這次專案使用的 A8106 為例(雖然 ICE 是走 SWD,不過解釋上用 JTAG),A8106 是 MCU,它只是一顆 IC,原廠的下游廠商則會根據這顆 IC 來做不同的功能,推出市面上我們看到的模組(開發板)。

由此可知,不同廠商很可能都會利用 A8106 這個 MCU ,來兜出不同功能取向的模組,意即若某廠商覺得某些腳位不重要,可能就不會將此腳位拉出來當作為模組的 GPIO pin,或其他功能的 pin 腳位。

Amiccom ICE 的 SWD 示意圖

也就是說,user code 可以控制的部分僅止於「廠商有拉出來的腳位」,而 JTAG 厲害的地方就在於:它甚至可以操控整個 MCU(甚至周邊的 IC)!我之所以說周邊 IC 也可以,是因為到底能不能使用,都是根據事先定義好的 JTAG mapping 去做讀取或寫入的動作,以偵測那些腳位是否出問題,而這都是軟體碰不到的部分。

相信眼尖的同好朋友也有發現,JTAG 也才 4 個腳位,那要怎麼樣才能去讀取或寫入這麼多的腳位呢?其實,JTAG 運用 shift register 的概念,serial to prallel,並透過 buffer 吃值的方式,將序列的 data 轉成並列的形式 (CLK 腳位就是用來控制將 buffer 值倒出來的速度)。

介紹完 JTAG 的強大功能,但這跟燒錄究竟有什麼關係?

如同我剛開始提到的結論,如果不需要 debug mode,那它真的用途不大,因為是否要進入燒錄模式,的確是由 bootloader 決定的;不過如果要 debug,在此也只有 JTAG(or SWD)做得到。

相信有在開發 web 的朋友一定知道,我們在 debug 的時候,可以「一步一步」run progra,看到底是在 code 的哪個環節出了問題,而 Keil C51 debug mode 也可以做到完全一樣的事。這整件事便歸功於這個「debugger」的存在(事實上就是 JTAG),拜 JTAG 能夠操控暫存器所賜,便能直接控制 MCU 裡的 clock,而我們也知道 MCU 可以動起來就是因為 clock 在震,也就是說 JTAG 可以控制 MCU,讓它每動一步,clock 就停住,以達成我們看到的逐步偵錯效果。

因此它叫 debugger 並不是沒有原因,就是因為它的主要功能並不是燒錄,而是執行 debug。

不過!不知道有沒有朋友發現,剛剛上方提到 bootloader,也只是將判斷的結果塞進某些特定的暫存器。那麼讀取或寫入暫存器,不就是 JTAG 的本能嗎?也就是說,JTAG 可以直接設值,讓模組進入燒錄模式!這就難怪常會聽到前輩們說:「JTAG 是整個模組的最後一道防線。」(因為一般常說的「MCU 死了」,通常就是指 bootloader 當掉)

小結

談完以上種種,以及 debugger 的實際定位後,那麼反觀 Arduino 為什麼會沒有 debugger 呢?

經過師父 Bird 的解釋我才了解,原來 Arduino 在 compile 之後,並不是可執行的 machine code,它在燒錄前會再經過中間一層 Arduino 自家的東西,才能成功轉為 machine code 燒錄進板子;至於中間那層到底是什麼,我目前還沒有特別去研究。

搞懂 debugger 以及燒錄的運作細節後,下一篇文章將會開始談 A8106 的 RF 到底如何傳輸資料,請大家拭目以待。

(本文同步發表於自造者萊恩原文連結;責任編輯:賴芳如)

Ryan Hu

Ryan Hu

對於 IOT 軟硬整合相關有極大興趣,鍾愛無人機,目前獨自完成的專案像是瓦力號、GPS 自動語音導覽系統、NTP 網路自動校時時鐘,喜歡流浪。
Ryan Hu

Author: Ryan Hu

對於 IOT 軟硬整合相關有極大興趣,鍾愛無人機,目前獨自完成的專案像是瓦力號、GPS 自動語音導覽系統、NTP 網路自動校時時鐘,喜歡流浪。

Share This Post On
468 ad

Submit a Comment

你的電子郵件位址並不會被公開。 必要欄位標記為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料