JTAG
聯合測試行為組織
JTAG是英文“Joint Test Action Group(聯合測試行為組織)”的詞頭字母的簡寫,該組織成立於1985年,是由幾家主要的電子製造商發起制訂的PCB和IC測試標準。JTAG建議於1990年被IEEE批准為IEEE1149.1-1990測試訪問埠和邊界掃描結構標準。該標準規定了進行邊界掃描所需要的硬體和軟體。自從1990年批准后,IEEE分別於1993年和1995年對該標準作了補充,形成了現在使用的IEEE1149.1a-1993和IEEE1149.1b-1994。JTAG主要應用於:電路的邊界掃描測試和可編程晶元的在線系統編程。
JTAG也是一種國際標準測試協議(IEEE1149.1兼容),主要用於晶元內部測試。現今多數的高級器件都支持JTAG協議,如DSP、FPGA、ARM、部分單片機器件等。標準的JTAG介面是4線:TMS、TCK、TDI、TDO,分別為模式選擇、時鐘、數據輸入和數據輸出線。相關JTAG引腳的定義為:TCK為測試時鐘輸入;TDI為測試數據輸入,數據通過TDI引腳輸入JTAG介面;TDO為測試數據輸出,數據通過TDO引腳從JTAG介面輸出;TMS為測試模式選擇,TMS用來設置JTAG介面處於某種特定的測試模式;TRST為測試複位,輸入引腳,低電平有效。GND
TI還定義了一種叫SBW-JTAG的介面,用來在引腳較少的晶元上通過最少的利用引腳實現JTAG介面,它只有兩條線,SBWTCK,SBWTDIO。實際使用時一般通過四條線連接,VCC,SBWTCK,SBWTDIO,GND,這樣就可以很方便的實現連接,又不會佔用大量引腳。
JTAG最初是用來對晶元進行測試的,基本原理是在器件內部定義一個TAP(Test Access Port測試訪問口)通過專用的JTAG測試工具對內部節點進行測試。JTAG測試允許多個器件通過JTAG介面串聯在一起,形成一個JTAG鏈,能實現對各個器件分別測試。現今,JTAG介面還常用於實現ISP(In-System Programmable;在線編程),對FLASH等器件進行編程。
JTAG編程方式是在線編程,傳統生產流程中先對晶元進行預編程后再裝到板上因此而改變,簡化的流程為先固定器件到電路板上,再用JTAG編程,從而大大加快工程進度。JTAG介面可對DSP晶元內部的所有部件進行編程。
在硬體結構上,JTAG介面包括兩部分:JTAG埠和控制器。與JTAG介面兼容的器件可以是微處理器(MPU)、微控制器(MCU)、PLD、CPL、FPGA、DSP、ASIC或其它符合IEEE1149.1規範的晶元。IEEE1149.1標準中規定對應於數字集成電路晶元的每個引腳都設有一個移位寄存單元,稱為邊界掃描單元BSC。它將JTAG電路與內核邏輯電路聯繫起來,同時隔離內核邏輯電路和晶元引腳。由集成電路的所有邊界掃描單元構成邊界掃描寄存器BSR。邊界掃描寄存器電路僅在進行JTAG測試時有效,在集成電路正常工作時無效,不影響集成電路的功能。
JTAG是一種所謂的邊界掃描技術。
邊界掃描測試是在20世紀80年代中期作為解決PCB物理訪問問題的JTAG介面發展起來的,這樣的問題是新的封裝技術導致電路板裝配日益擁擠所產生的。邊界掃描在晶元級層次上嵌入測試電路,以形成全面的電路板級測試協議。利用邊界掃描--自1990年以來的行業標準IEEE1149.1--您甚至能夠對最複雜的裝配進行測試、調試和在系統設備編程,並且診斷出硬體問題。
邊界掃描的優點:
通過提供對掃描鏈的IO的訪問,可以消除或極大地減少對電路板上物理測試點的需要,這就會顯著節約成本,因為電路板布局更簡單、測試夾具更廉價、電路中的測試系統耗時更少、標準介面的使用增加、上市時間更快。除了可以進行電路板測試之外,邊界掃描允許在PCB貼片之後,在電路板上對幾乎所有類型的CPLD和快閃記憶體進行編程,無論尺寸或封裝類型如何。在系統編程可通過降低設備處理、簡化庫存管理和在電路板生產線上集成編程步驟來節約成本並提高產量。
邊界掃描原理:
IEEE1149.1標準規定了一個四線串列介面(第五條線是可選的),該介面稱作測試訪問埠(TAP),用於訪問複雜的集成電路(IC),例如微處理器、DSP、ASIC和CPLD。除了TAP之外,混合IC也包含移位寄存器和狀態機,以執行邊界掃描功能。在TDI(測試數據輸入)引線上輸入到晶元中的數據存儲在指令寄存器中或一個數據寄存器中。串列數據從TDO(測試數據輸出)引線上離開晶元。邊界掃描邏輯由TCK(測試時鐘)上的信號計時,而且TMS(測試模式選擇)信號驅動TAP控制器的狀態。TRST(測試重置)是可選項。根據相關數據手冊中的說明,TRST、TDI、TMS引腳上需要接一個10KΩ的上拉電阻,而TCK需要接一個10KΩ的下拉電阻。
在PCB上可串列互連多個可兼容掃描功能的IC,形成一個或多個掃描鏈,每一個鏈都由其自己的TAP。每一個掃描鏈提供電氣訪問,從串列TAP介面到作為鏈的一部分的每一個IC上的每一個引線。在正常的操作過程中,IC執行其預定功能,就好像邊界掃描電路不存在。但是,當為了進行測試或在系統編程而激活設備的掃描邏輯時,數據可以傳送到IC中,並且使用串列介面從IC中讀取出來。這樣數據可以用來激活設備核心,將信號從設備引線發送到PCB上,讀出PCB的輸入引線並讀出設備輸出。
JTAG介面解讀
通常所說的JTAG大致分兩類,一類用於測試晶元的電氣特性,檢測晶元是否有問題;一類用於Debug;一般支持JTAG的CPU內都包含了這兩個模塊。
一個含有JTAG Debug介面模塊的CPU,只要時鐘正常,就可以通過JTAG介面訪問CPU的內部寄存器和掛在CPU匯流排上的設備,如FLASH,RAM,SOC(比如4510B,44Box,AT91M系列)內置模塊的寄存器,像UART,Timers,GPIO等等的寄存器。
上面說的只是JTAG介面所具備的能力,要使用這些功能,還需要軟體的配合,具體實現的功能則由具體的軟體決定。
例如下載程序到RAM功能。了解SOC的都知道,要使用外接的RAM,需要參照SOC DataSheet的寄存器說明,設置RAM的基地址,匯流排寬度,訪問速度等等。有的SOC則還需要Remap,才能正常工作。運行Firmware時,這些設置由Firmware的初始化程序完成。但如果使用JTAG介面,相關的寄存器可能還處在上電值,甚至時錯誤值,RAM不能正常工作,所以下載必然要失敗。要正常使用,先要想辦法設置RAM。在ADW中,可以在Console窗口通過Let命令設置,在AXD中可以在Console窗口通過Set命令設置。
下面是一個設置AT91M40800的命令序列,關閉中斷,設置CS0-CS3,並進行Remap,適用於AXD(ADS帶的Debug)
setmem 0xfffff124,0xFFFFFFFF,32---關閉所有中斷
setmem 0xffe00000,0x0100253d,32---設置CS0
setmem 0xffe00004,0x02002021,32---設置CS1
setmem 0xffe00008,0x0300253d,32---設置CS2
setmem 0xffe0000C,0x0400253d,32---設置CS3
setmem 0xffe00020,1,32---Remap
如果要在ADW(SDT帶的DEBUG)中使用,則要改為:
let 0xfffff124=0xFFFFFFFF---關閉所有中斷
let 0xffe00000=0x0100253d---設置CS0
let 0xffe00004=0x02002021---設置CS1
let 0xffe00008=0x0300253d---設置CS2
let 0xffe0000C=0x0400253d---設置CS3
let 0xffe00020=1---Remap
為了方便使用,可以將上述命令保存為一個文件config.ini,在Console窗口輸入ob config.ini即可執行。
使用其他debug,大體類似,只是命令和命令的格式不同。
設置RAM時,設置的寄存器以及寄存器的值必須和要運行程序的設置一致。一般編譯生成的目標文件是ELF格式,或類似的格式,包含有目標碼運行地址,運行地址在Link時候確定。Debug下載程序時根據ELF文件中的地址信息下載程序到指定的地址。如果在把RAM的基地址設置為0x10000000,而在編譯的時候指定Firmware的開始地址在0x02000000,下載的時候,目標碼將被下載到0x02000000,顯然下載會失敗。
通過JTAG下載程序前應關閉所有中斷,這一點和Firmware初始化時關閉中斷的原因相同。在使用JTAG介面的時候,各中斷的使能未知,尤其是FLASH里有可執行碼的情況,可能會有一些中斷被使能。使用JTAG下載完代碼,要執行時,有可能因為未完成初始化就產生了中斷,導致程序異常。所以,需要先關閉中斷,一般通過設置SOC的中斷控制寄存器完成。
使用JTAG寫Flash。在理論上,通過JTAG可以訪問CPU匯流排上的所有設備,所以應該可以寫FLASH,但是FLASH寫入方式和RAM大不相同,需要特殊的命令,而且不同的FLASH擦除,編程命令不同,而且塊的大小,數量也不同,很難提供這一項功能。所以一般Debug不提供寫Flash功能,或者僅支持少量幾種Flash。
現今就我知道的,針對ARM,只有FlashPGM這個軟體提供寫FLASH功能,但使用也非常麻煩。AXD,ADW都不提供寫FLASH功能。寫Flash的方法可以是,自己寫一個簡單的程序,專門用於寫目標板的FLASH,利用JTAG介面,下載到目標板,再把要燒寫的目標碼裝成BIN格式,也下到目標板(地址和燒FLASH的程序的地址不同),然後運行已經下載的燒FLASH的程序。使用這種方式,比起FlashPGM的寫Flash,速度似乎要快一些。
上面說的是以前的情形,現今情況有變——哲遠科技已經開發出成熟JTAG燒寫軟體,並且經過多家公司的驗證,產品主要特點:
不需要使用帶插座的FLASH,提高可靠性。
與CPU架構無關,支持PowerPC/ARM/MIPS等架構的CPU或SoC。
使用CPU的JTAG介面,無需增加任何額外電路。
不需要CPU任何啟動代碼即可完成燒寫。
即使CPU死機或者因Flash數據損壞導致板卡不能啟動時,同樣可以回讀Flash內容,為維修調試提供依據。
支持塊操作(擦除、加鎖、解鎖)。
除了編程功能以外,還可以通過點燈等操作驗證JTAG器件的基本功能。
使用WH-USB-JTAG電纜,載入FLASH速度比並口電纜快10倍左右。
可以讀寫其他晶元
通過程序可以讀寫與JTAG器件(通常是CPU)相連的其他晶元(如CPLD,ASIC等),這樣在CPU沒有跑起來或沒有軟體的情況下甚至都可以去對單板做一些調試,從而提高效率,縮短開發周期。
關於簡單JTAG電纜
目前有各種各樣簡單JTAG電纜,其實只是一個電平轉換電路,同時還起到保護作用。JTAG的邏輯則由運行在PC上的軟體實現,所以在理論上,任何一個簡單JTAG電纜,都可以支持各種應用軟體,如Debug等。可以使用同一個JTAG電纜寫Xilinx CPLD,AXD/ADW調試程序。關鍵在於軟體的支持,大多數軟體都不提供設定功能,因而只能支持某種JTAG電纜。
關於簡單JTAG電纜的速度
JTAG是串列介面,使用列印口的簡單JTAG電纜,利用的是列印口的輸出帶鎖存的特點,使用軟體通過I/O產生JTAG時序。由JTAG標準決定,通過JTAG寫/讀一個位元組要一系列的操作,根據我的分析,使用簡單JTAG電纜,利用列印口,通過JTAG輸出一個位元組到目標板,平均需要43個列印口I/O,在我機器上(P4 1.7G),每秒大約可進行660K次I/O操作,所以下載速度大約在660K/43,約等於15K Byte/S.對於其他機器,I/O速度大致相同,一般在600K ~800K.
關於如何提高JTAG下載速度。
很明顯,使用簡單JTAG電纜無法提高速度。要提高速度,大致有兩種辦法,
2。使用CPLD/FPGA提供JTAG介面,CPLD/FPGA和微機之間使用EPP介面(一般微機列印口都支持EPP模式),EPP介面完成微機和CPLD/FPGA之間的數據傳輸,CPLD/FPGA完成JTAG時序。
這兩種方法本人都實現過。第一個方法可以達到比較高的速度,實測超過了200KByte/S(注意:是Byte,不是Bit);但是相對來說,硬體複雜,製造相對複雜。第二種相對來說,下載速度要慢一些,最快時達到96KByte/S,但電路簡單,製造方便,而且速度可以滿足需要。第二種方案還有一個缺點,由於進行I/O操作時,CPU不會被釋放,因此在下載程序時,微機CPU顯得很繁忙。
總的來說,本人認為,對於個人愛好者來說,第二種方法更可取。
JTAG
JTAG
TDI(測試數據輸入)
TDO(測試數據輸出)
TCK(測試時鐘)
TMS(測試模式選擇)
TRST(測試複位)可選。
因為只有一條數據線,通信協議有必要像其他串列設備介面,如SPI一樣為串列傳輸。時鐘由TCK引腳輸入。配置是通過TMS引腳採用狀態機的形式一次操作一位來實現的。每一位數據在每個TCK時鐘脈衝下分別由TDI和TDO引腳傳入或傳出。可以通過載入不同的命令模式來讀取晶元的標識,對輸入引腳採樣,驅動(或懸空)輸出引腳,操控晶元功能,或者旁路(將TDI與TDO連通以在邏輯上短接多個晶元的鏈路)。TCK的工作頻率依晶元的不同而不同,但其通常工作在10-100MHz(每位10-100ns)。
當在集成電路中進行邊界掃描時,被處理的信號是在同一塊IC的不同功能模塊間的,而不是不同IC之間的。
儘管如此,極少消費類產品提供外部的JTAG埠介面,但作為開發樣品的殘留,這些介面在印刷電路板上十分常見。在研發后,這些介面常常為反向工程提供了非常良好的途徑。
JTAG專業術語:
1. | Group,Joint Test Action(JTAG) 測試行動聯合組織 |
2. | Joint Test Action Group(JTAG) 測試行動聯合組織 |