嵌入式開發中,大家免不了需要模擬調試代碼,線上調試是排除bug最有效直接的方式,今天我們要聊的是調試里最基礎的東西,即介面標準。ARM內核原生支持2種業界通用的介面標準,分別是JTAG和SWD。本節課豹哥先給大家詳細講講JTAG介面。 ...
大家好,我是豹哥,獵豹的豹,犀利哥的哥。今天豹哥給大家講的是嵌入式調試里的介面標準JTAG。
在結束《ARM Cortex-M開發文件詳解》系列文章之後,豹哥休整了一小段時間,但是講課的心完全停不下來啊,所以忍不住新開了一個系列文章,叫《ARM Cortex-M調試過程探析》,本文是這個系列文章的第一篇,歡迎各位嵌入式朋友前來圍觀捧場~~~
嵌入式開發中,大家免不了需要模擬調試代碼,尤其是當應用工程功能邏輯複雜到一定程度時,免不了在寫代碼時會引入一些邏輯bug,僅靠代碼審查有時候並不一定能排除所有bug,所以線上調試便成為排除bug最有效直接的方式,今天我們要聊的是調試里最基礎的東西,即介面標準。ARM內核原生支持2種業界通用的介面標準,分別是JTAG和SWD。本節課豹哥先給大家詳細講講JTAG介面。
一、JTAG介面標準
JTAG全稱“Joint Test Action Group”,既是個標準也是個組織,這是個由幾家主要的電子製造商(IBM、AT&T、TI、Philips等)成立於1985年的組織,這個組織成立的目的是發起制訂一種PCB和晶元測試標準。
JTAG標準於1990年被IEEE批准為IEEE1149.1測試訪問埠和邊界掃描結構標準。JTAG標準規定了進行邊界掃描所需要的硬體和軟體,主要應用於電路的邊界掃描測試和可編程晶元的線上系統編程。
1.1 IEEE1149.1標準
IEEE 1149.1工作組 http://grouper.ieee.org/groups/1149/1/
最初版手冊1149.1-1990 http://standards.ieee.org/findstds/standard/1149.1-1990.html
最新版手冊1149.1-2013 http://standards.ieee.org/findstds/standard/1149.1-2013.html
1.2 JTAG介面信號
JTAG介面,總稱測試訪問介面TAP(Test Access Port),使用如下信號來實現邊界掃描操作:
- TCK(測試時鐘):同步內部狀態機操作的時鐘信號。
- TMS(測試模式選擇):控制內部狀態機轉換的模式信號(TCK上升沿採樣)。
- TDI(測試數據輸入):移入器件測試或編程邏輯的數據(TCK上升沿採樣)。
- TDO(測試數據輸出):移出器件測試或編程邏輯的數據(TCK下降沿採樣)。
除了以上信號線外,還有1個可選的信號:
- TRST(測試重置):重置TAP控制器的狀態機的複位信號。
1.3 JTAG系統內部構造
JTAG系統內部最基本的單元是邊界掃描單元(其掃描獲取的值存在邊界掃描寄存器BSR(Boundary Scan Register)中),每個邊界掃描單元都位於目標器件的邊界上,所以很多時候JTAG測試也被稱為邊界掃描。
所有目標器件核心邏輯與針腳之間的信號都會被串聯的邊界掃描單元所攔截。正常運行時,這些邊界掃描單元是不可見的。但是,在測試模式下這些單元可以被用來設置/讀取目標器件針腳或核心邏輯的值。
除了上述BSR之外,JTAG系統還需要以下3個寄存器:
- 指令寄存器:存儲當前的指令,指令內容被TAP控制器用來決定如何處理接收到的信號。
- 旁路寄存器(BYPASS):把信息從TDI傳到TDO的單位寄存器。
- 識別碼寄存器(IDCODES):含有器件的識別碼和版本序號,該信息可以使器件和它的邊界掃描描述語言(BSDL)文件相關聯。
JTAG系統最核心的是TAP控制器,TAP控制器被設計用來與JTAG系統內部寄存器相互動,TAP控制器是一個被TMS信號控制轉換的同步狀態機,控制著JTAG系統的行為。
如上圖所示,TAP控制器的內部狀態機一共16個狀態,關於各個狀態具體含義可查閱IEEE1149.1手冊。TAP控制器的基本功能是產生BSR和指令寄存器正常工作所需要的時鐘和控制信號,其主要功能有以下幾點:
- 提供信號將指令裝入指令寄存器。
- 提供信號將輸入數據從TDI管腳移入內部寄存器、把輸出數據從內部寄存器移出到TDO管腳。
- 執行相應功能,如捕獲、移位和更新數據等。
指令寄存器是用來存儲需要解釋執行的指令的,IEEE 1149.1標準規定了JTAG相容器件必須要具備的指令:
- BYPASS:用單一單元旁路寄存器傳送數據,縮短JTAG鏈上不必要的掃描鏈路。
- EXTEST:將已知值(存在BSR)驅動到晶元針腳上。
- SAMPLE/PRELOAD:將捕獲到的晶元針腳值裝入BSR。
除了必備的指令外,IEEE 1149.1標準還規定瞭如下可選的指令:
- IDCODE:將IDCODES寄存器中的數據移出。
- INTEST:將已知值(存在BSR)驅動到晶元核心邏輯上。
- RUNBIST:當TAP進入測試運行空閑狀態時,晶元進行自檢。
1.4 JTAG調試工具pinout
通常支持JTAG介面的調試編程工具其實只是利用了JTAG技術的四線TAP通信協議,而除了標準TAP信號線外,有時還加入其他輔助信號線構成完整pinout,對於ARM JTAG調試工具來說,有兩種比較通用的pinout標準,即ARM20 JTAG header和ARM14 JTAG header:
上述兩種ARM JTAG header中除了標準TAP信號線外,其他輔助信號線含義如下:
信號名 | ARM20-pin | ARM14-pin | 信號含義 |
---|---|---|---|
Vref | P1 | P1,P13 | JTAG介面電平參考電壓。用於檢查目標系統是否供電,該引腳通常與目標系統Vdd相連,中間不允許串接電阻。 |
Vsupply | P2 | N/A | 電源輸入 |
nSRST | P15 | P12 | System Reset信號,與目標系統複位信號相連。可以直接對目標系統複位,同時可以檢測目標系統的複位情況。為了防止誤觸發,應在目標端加上適當的上拉電阻。 |
RTCK | P11 | N/A | Return Test Clock。由目標系統反饋給JTAG的時鐘信號,用來動態控制TCK速率。不使用時可以直接接地。 |
GND | P4,P6,P8,P10,P12,P14,P16,P18,P20 | P2,P4,P6,P8,P10,P14 | 接地 |
DBGRQ | P17 | N/A | 連接到目標系統的調試請求信號 |
DBGACK | P19 | N/A | 由目標系統反饋回來的調試應答信號 |
Note:更多JTAG pinout詳見JTAG test網站的整理 http://www.jtagtest.com/pinouts/
二、JTAG介面進階
前面講完了JTAG基礎知識,下麵豹哥再給大家多介紹一些JTAG相關的“黑科技”。
2.1 BSDL文件
現如今支持JTAG介面的晶元越來越多,為了統一各晶元廠商的具體JTAG實現,促進整個電子行業的一致性,IEEE1149.1標準制訂了BSDL語言規範。BSDL是JTAG設備的標準建模語言,它的語法是VHDL的子集,是對JTAG器件的邊界掃描特性的描述,主要用來溝通晶元廠商、用戶與測試工具之間的聯繫。
開源的JTAG BSDL庫網站(http://bsdl.info/),涵蓋主流廠商的主流晶元的BSDL文件
豹哥隨便找一款晶元的BSDL文件(Freescale K60_1M(K24_144QFP))簡單分析下:
entity k60_1m is
generic (PHYSICAL_PIN_MAP : string := "K24_144qfp");
-- 此處描述晶元所有引腳屬性
port (
PTA0: in bit;
...
XTAL32: linkage bit);
use STD_1149_1_2001.all;
use STD_1149_6_2003.all;
-- 描述晶元引腳pinout
attribute COMPONENT_CONFORMANCE of k60_1m: entity is "STD_1149_1_2001";
attribute PIN_MAP of k60_1m: entity is PHYSICAL_PIN_MAP;
constant K24_144qfp :PIN_MAP_STRING :=
"PTA0: 50," &
...
"XTAL32: 40" ;
-- 描述JTAG信號在晶元引腳分配
attribute TAP_SCAN_OUT of PTA2 : signal is true;
attribute TAP_SCAN_CLOCK of PTA0 : signal is (2.00e+07,BOTH);
attribute TAP_SCAN_MODE of PTA3 : signal is true;
attribute TAP_SCAN_IN of PTA1 : signal is true;
-- 描述JTAG指令寄存器相關屬性
attribute INSTRUCTION_LENGTH of k60_1m: entity is 4;
attribute INSTRUCTION_OPCODE of k60_1m: entity is
"BYPASS (1111)," &
"CLAMP (1100)," &
"EXTEST (0100)," &
"HIGHZ (1001)," &
"IDCODE (0000)," &
"PRELOAD (0010)," &
"SAMPLE (0011)," &
"ENABLE_CENSOR_CTRL (0111)," &
"ENABLE_TEST_CTRL (0110)," &
"EZPORT (1101)," &
"JTAGDP_ABORT (1000)," &
"JTAGDP_APACC (1011)," &
"JTAGDP_DPACC (1010)," &
"JTAGDP_IDCODE (1110)";
attribute INSTRUCTION_CAPTURE of k60_1m: entity is "xx01";
attribute INSTRUCTION_PRIVATE of k60_1m: entity is
"ENABLE_CENSOR_CTRL," &
"ENABLE_TEST_CTRL," &
"EZPORT," &
"JTAGDP_ABORT," &
"JTAGDP_APACC," &
"JTAGDP_DPACC," &
"JTAGDP_IDCODE";
-- 描述JTAG識別碼寄存器相關屬性
attribute IDCODE_REGISTER of k60_1m: entity is
"0000" & -- Version
"1011001100011010" & -- Part Number
"00000001110" & -- Manufacturer Identity
"1"; -- IEEE 1149.1 Requirement
attribute REGISTER_ACCESS of k60_1m: entity is
"BYPASS (BYPASS)," &
"DEVICE_ID (IDCODE)";
-- 描述JTAG邊界掃描寄存器相關屬性
attribute BOUNDARY_LENGTH of k60_1m: entity is 196;
attribute BOUNDARY_REGISTER of k60_1m: entity is
-- num cell port/* function safe [ccell dis rslt]
" 0 (BC_2, *, control, 1) ," &
" 1 (BC_8, PTE0, bidir, X, 0, 1, Z) ," &
...
" 194 (BC_2, *, control, 1) ," &
" 195 (BC_8, PTD15, bidir, X, 194, 1, Z) ";
end k60_1m;
2.2 JTAG菊花鏈
當你的系統中有多個JTAG設備時,為解決JTAG口過多占用PCB的問題,JTAG支持如下菊花鏈方式連接(在FPGA應用尤其廣泛):
從上圖可以看出TMS、TCK是一主多從並聯的結構(設備過多時TMS,TCK電路需加緩衝器(如74LVC245)增加驅動能力);TDI、TDO是一主一從串聯的結構,這種菊花鏈方式使得PCB上只需要一個JTAG介面便可以訪問所有JTAG設備。
至此,嵌入式調試里的介面標準JTAG豹哥便介紹完畢了,掌聲在哪裡~~~