國際協定
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(TestAccessPort測試訪問口)通過專用的JTAG測試工具對內部節點進行測試。JTAG測試允許多個器件通過JTAG接口串聯在一起,形成一個JTAG鏈,能實現對各個器件分別測試。現今,JTAG接口還常用於實現ISP(In-SystemProgrammable;線上編程),對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接口,方便多目標系統進行測試,同時還可以實現flash編程。
接口解讀
JTAG接口解讀
通常所說的JTAG大致分兩類,一類用於測試晶片的電氣特性,檢測晶片是否有問題;一類用於Debug;一般支持JTAG的CPU內都包含了這兩個模組。
一個含有JTAGDebug接口模組的CPU,只要時鐘正常,就可以通過JTAG接口訪問CPU的內部暫存器和掛在CPU匯流排上的設備,如FLASH,RAM,SOC(比如4510B,44Box,AT91M系列)內置模組的暫存器,像UART,Timers,GPIO等等的暫存器。
上面說的只是JTAG接口所具備的能力,要使用這些功能,還需要軟體的配合,具體實現的功能則由具體的軟體決定。
例如下載程式到RAM功能。了解SOC的都知道,要使用外接的RAM,需要參照SOCDataSheet的暫存器說明,設定RAM的基地址,匯流排寬度,訪問速度等等。有的SOC則還需要Remap,才能正常工作。運行Firmware時,這些設定由Firmware的初始化程式完成。但如果使用JTAG接口,相關的暫存器可能還處在上電值,甚至時錯誤值,RAM不能正常工作,所以下載必然要失敗。要正常使用,先要想辦法設定RAM。在ADW中,可以在Console視窗通過Let命令設定,在AXD中可以在Console視窗通過Set命令設定。
下面是一個設定AT91M40800的命令序列,關閉中斷,設定CS0-CS3,並進行Remap,適用於AXD(ADS帶的Debug)
setmem0xfffff124,0xFFFFFFFF,32---關閉所有中斷
setmem0xffe00000,0x0100253d,32---設定CS0
setmem0xffe00004,0x02002021,32---設定CS1
setmem0xffe00008,0x0300253d,32---設定CS2
setmem0xffe0000C,0x0400253d,32---設定CS3
setmem0xffe00020,1,32---Remap
如果要在ADW(SDT帶的DEBUG)中使用,則要改為:
let0xfffff124=0xFFFFFFFF---關閉所有中斷
let0xffe00000=0x0100253d---設定CS0
let0xffe00004=0x02002021---設定CS1
let0xffe00008=0x0300253d---設定CS2
let0xffe0000C=0x0400253d---設定CS3
let0xffe00020=1---Remap
為了方便使用,可以將上述命令保存為一個檔案config.ini,在Console視窗輸入obconfig.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接口,無需增加任何額外電路。
支持numonyx,Spansion,Intel,AMD,ST,SST,EON,等廠家的NORFLASH。且提供後續新FLASH型號的全程支持。
不需要CPU任何啟動代碼即可完成燒寫。
即使CPU當機或者因Flash數據損壞導致板卡不能啟動時,同樣可以回讀Flash內容,為維修調試提供依據。
支持塊操作(擦除、加鎖、解鎖)。
除了編程功能以外,還可以通過點燈等操作驗證JTAG器件的基本功能。
使用WH-USB-JTAG電纜,載入FLASH速度比並口電纜快10倍左右。
可以讀寫其他晶片
通過程式可以讀寫與JTAG器件(通常是CPU)相連的其他晶片(如CPLD,ASIC等),這樣在CPU沒有跑起來或沒有軟體的情況下甚至都可以去對單板做一些調試,從而提高效率,縮短開發周期。
JTAG電纜
關於簡單JTAG電纜
目前有各種各樣簡單JTAG電纜,其實只是一個電平轉換電路,同時還起到保護作用。JTAG的邏輯則由運行在PC上的軟體實現,所以在理論上,任何一個簡單JTAG電纜,都可以支持各種套用軟體,如Debug等。可以使用同一個JTAG電纜寫XilinxCPLD,AXD/ADW調試程式。關鍵在於軟體的支持,大多數軟體都不提供設定功能,因而只能支持某種JTAG電纜。
關於簡單JTAG電纜的速度
JTAG是串列接口,使用列印口的簡單JTAG電纜,利用的是列印口的輸出帶鎖存的特點,使用軟體通過I/O產生JTAG時序。由JTAG標準決定,通過JTAG寫/讀一個位元組要一系列的操作,根據我的分析,使用簡單JTAG電纜,利用列印口,通過JTAG輸出一個位元組到目標板,平均需要43個列印口I/O,在我機器上(P41.7G),每秒大約可進行660K次I/O操作,所以下載速度大約在660K/43,約等於15KByte/S.對於其他機器,I/O速度大致相同,一般在600K~800K.
關於如何提高JTAG下載速度。
很明顯,使用簡單JTAG電纜無法提高速度。要提高速度,大致有兩種辦法,
1。使用嵌入式系統提供JTAG接口,嵌入式系統和微機之間通過USB/Ethernet相連,這要求使用MCU。
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的接口是一種特殊的4/5個接腳接口連到晶片上,所以在電路版上的很多晶片可以將他們的JTAG接腳通過DaisyChain的方式連在一起,並且Probe只需連線到一個“JTAG連線埠”就可以訪問一塊電路板上的所有IC。這些連線引腳是:
TDI(測試數據輸入)
TDO(測試數據輸出)
TCK(測試時鐘)
TMS(測試模式選擇)
TRST(測試復位)可選。
JTAG鏈
因為只有一條數據線,通信協定有必要像其他串列設備接口,如SPI一樣為串列傳輸。時鐘由TCK引腳輸入。配置是通過TMS引腳採用狀態機的形式一次操作一位來實現的。每一位數據在每個TCK時鐘脈衝下分別由TDI和TDO引腳傳入或傳出。可以通過載入不同的命令模式來讀取晶片的標識,對輸入引腳採樣,驅動(或懸空)輸出引腳,操控晶片功能,或者旁路(將TDI與TDO連通以在邏輯上短接多個晶片的鏈路)。TCK的工作頻率依晶片的不同而不同,但其通常工作在10-100MHz(每位10-100ns)。
當在積體電路中進行邊界掃描時,被處理的信號是在同一塊IC的不同功能模組間的,而不是不同IC之間的。
TRST引腳是一個可選的相對待測邏輯低電平有效的復位開關——通常是異步的,但有時也是同步的,依晶片而定。如果該引腳沒有定義,則待測邏輯可由同步時鐘輸入復位指令而復位。
儘管如此,極少消費類產品提供外部的JTAG連線埠接口,但作為開發樣品的殘留,這些接口在印刷電路板上十分常見。在研發後,這些接口常常為反向工程提供了非常良好的途徑。
JTAG專業術語:
1.Group,JointTestAction(JTAG)
測試行動聯合組織
2.JointTestActionGroup(JTAG)
測試行動聯合組織