簡(jiǎn)介
MAXQ微控制器使用測(cè)試訪問(wèn)端口(TAP),通過(guò)一個(gè)4線同步串行接口實(shí)現(xiàn)與主機(jī)器件的通信。該TAP支持在系統(tǒng)編程和在線調(diào)試。TAP與JTAG IEEE標(biāo)準(zhǔn)1149兼容。為實(shí)現(xiàn)與TAP的連接,Dallas Semiconductor開(kāi)發(fā)了串口轉(zhuǎn)JTAG接口板和固件,通過(guò)標(biāo)準(zhǔn)RS-232串口接受命令,并將這些命令轉(zhuǎn)換成適當(dāng)?shù)腏TAG信號(hào)。本應(yīng)用筆記對(duì)固件使用的命令協(xié)議進(jìn)行說(shuō)明。如果需要串口轉(zhuǎn)JTAG接口板的更詳細(xì)信息,請(qǐng)將問(wèn)題通過(guò)電子郵件發(fā)至 micro.software@dalsemi.com (English only)。下載:本應(yīng)用筆記中的源程序和原理圖。
注意:本應(yīng)用筆記假定您已熟悉MAXQ微控制器的TAP和基本JTAG通信。關(guān)于這些主題的詳細(xì)信息,請(qǐng)參考MAXQ系列用戶指南。
與固件接口
采用115200bps,8位、無(wú)校驗(yàn)和1停止位格式與接口板串口連接,建立與串口轉(zhuǎn)JTAG接口板的通信。連接建立后,可采用ASCII或二進(jìn)制模式中的任何一種與固件接口。固件默認(rèn)為ASCII模式,將文本命令送至接口板,結(jié)果以文本字符串形式返回。二進(jìn)制模式將在下面進(jìn)行解釋?zhuān)撃J较滤袀鬏敒?位字節(jié)序列。可通過(guò)命令在任意時(shí)刻切換這兩種模式。在ASCII模式下,可使用表1列出的命令。所有命令均對(duì)大小寫(xiě)敏感??稍谝恍兄休斎胍唤M命令,也可以一次輸入一個(gè)命令。表1. 任何模式下均可接受的命令
命令 | 說(shuō)明 |
h | 保持復(fù)位,MAXQ停止運(yùn)行。 |
H | 釋放RESET使MAXQ工作。 |
I | 使系統(tǒng)進(jìn)入旁路模式,復(fù)位TAP,使其返回Run-Test-Idle狀態(tài)。 |
JB | 指示固件開(kāi)始接受背景模式命令。該命令不切換目標(biāo)MAXQ模式,也不對(duì)目標(biāo)器件發(fā)送任何的JTAG命令。該命令僅指示固件MAXQ由其它途徑改變了模式。 |
JD | 指示固件開(kāi)始接受調(diào)試模式命令。該命令不切換目標(biāo)MAXQ的模式,也不對(duì)目標(biāo)器件發(fā)送任何的JTAG命令。該命令僅指示固件MAXQ由其它途徑改變了模式。 |
JL | 指示固件開(kāi)始接受自舉加載命令。該命令不切換目標(biāo)MAXQ的模式,也不對(duì)目標(biāo)器件發(fā)送任何的JTAG命令。該命令僅指示固件MAXQ由其它途徑改變了模式。 |
JX | 指示固件開(kāi)始接受旁路模式命令。該命令不切換目標(biāo)MAXQ的模式,也不對(duì)目標(biāo)器件發(fā)送任何的JTAG命令。該命令僅指示固件MAXQ由其它途徑改變了模式。 |
Q | 查詢JTAG接口板的接口版本號(hào)。版本號(hào)以兩個(gè)十六進(jìn)制字符的形式輸出。任何時(shí)候任何命令格式或輸出改變后,該版本號(hào)改變。本文撰寫(xiě)時(shí)接口版本號(hào)為01。 |
q | 查詢JTAG接口板的固件版本號(hào)。版本號(hào)以兩個(gè)十六進(jìn)制字符的形式輸出。任何時(shí)候固件改變后,該版本號(hào)改變。本文撰寫(xiě)時(shí)固件版本號(hào)為02。 |
Vtxxyy | 設(shè)置JTAG接口板Timer0。由于JTAG時(shí)鐘必須小于目標(biāo)時(shí)鐘的1/8,固件使用Timer0來(lái)控制JTAG時(shí)鐘速率。固件在產(chǎn)生JTAG時(shí)鐘每個(gè)邊沿前,等待定時(shí)器溢出。用定時(shí)器T0M位的值替換命令中的't',用TH0的值替換'xx',用TL0的值替換'yy'。所有值均以十六進(jìn)制格式輸入。關(guān)于這些值的詳細(xì)信息,請(qǐng)參考超高速閃存微控制器用戶指南。 |
Yrbbdd | 直接向TAP發(fā)送一個(gè)數(shù)值。用希望寫(xiě)入的TAP寄存器替換'r':0為DR,1為IR。'bb'是要寫(xiě)入的位數(shù)(不包括狀態(tài)位),'dd'是發(fā)送的數(shù)據(jù)。所有數(shù)值應(yīng)以十六進(jìn)制格式輸入。 |
Z | 將固件切換為二進(jìn)制傳輸。 |
z | 執(zhí)行JTAG時(shí)鐘的單個(gè)脈沖。 |
+ | 進(jìn)行JTAG接口板簡(jiǎn)單硬件測(cè)試。CLK、TMS和TDI引腳全部置高,讀取TDO狀態(tài),輸出為'0'或'1'。然后可測(cè)量引腳電壓,檢查其是否正常工作。 |
- | 進(jìn)行JTAG接口板簡(jiǎn)單硬件測(cè)試。CLK、TMS和TDI引腳全部置低,讀取TDO狀態(tài),輸出為'0'或'1'。然后可測(cè)量引腳電壓,檢查其是否正常工作。 |
如上述命令所示,MAXQ JTAG引擎具有不同的模式:旁路模式、自舉加載模式、背景模式和調(diào)試模式。JTAG引擎功能在每個(gè)模式中均不同。當(dāng)JTAG引擎進(jìn)入不同模式時(shí),除上面列出的命令以外,其它命令也開(kāi)始生效。
旁路模式
上電復(fù)位時(shí),TAP初始化為旁路模式。在該模式下,TAP被禁用,與MAXQ微控制器的其它部件沒(méi)有相互作用。在該模式下要激活TAP,可輸入兩個(gè)附加命令之一:'D'和'L'。'D'命令激活在線調(diào)試器,'L'命令激活自舉加載器。自舉加載模式
當(dāng)采用'L'命令激活自舉加載器時(shí),可直接向MAXQ固定用途ROM發(fā)送數(shù)據(jù)字節(jié)。每個(gè)發(fā)送的字節(jié)值以兩個(gè)十六進(jìn)制字符的形式表示。(關(guān)于固定用途ROM可接受字節(jié)的詳細(xì)信息,請(qǐng)聯(lián)系 micro.software@dalsemi.com (English only)。) 對(duì)于輸入的每個(gè)字節(jié),固件輸出加載器返回的字節(jié)和自TAP接收的狀態(tài)位。輸出格式為"00xx:ss",其中'xx'是輸出字節(jié),'ss'是狀態(tài)位。一旦輸入"Exit Loader"命令(0x01)后,必須使用表1中列出的'J'命令之一,指示JTAG接口板MAXQ不再處于自舉加載模式。背景模式
在JTAG引擎的背景模式,可以讀寫(xiě)JTAG斷點(diǎn)寄存器(BP0-BP5),讀寫(xiě)在線調(diào)試寄存器(ICDC、ICDF、ICDA和ICDD),判決何時(shí)出現(xiàn)斷點(diǎn)匹配,人工調(diào)用調(diào)試模式。支持這些操作的命令列于表2中。該模式下所有帶有輸出的命令,其輸出格式為"xxyy:ss",其中'xx'是輸出數(shù)據(jù)的MSB,'yy'是LSB,'ss'是從TAP返回的狀態(tài)位。表2. 背景模式下的命令
命令 | 說(shuō)明 |
A | 讀ICDA寄存器 |
axxyy | 寫(xiě)ICDA寄存器,其中'xx'是新值的MSB,'yy'是新值的LSB。以兩個(gè)十六進(jìn)制字符形式輸入。 |
Bi | 讀6個(gè)斷點(diǎn)寄存器之一,'i'是要讀取的斷點(diǎn)寄存器索引(0至5)。 |
bixxyy | 寫(xiě)6個(gè)斷點(diǎn)寄存器之一,'i'是要寫(xiě)入的斷點(diǎn)寄存器索引(0至5),'xx'是新數(shù)值的MSB,'yy'是LSB。MSB和LSB的值應(yīng)以兩個(gè)十六進(jìn)制字符形式輸入。 |
C | 讀ICDC寄存器。 |
cxx | 寫(xiě)ICDC寄存器,'xx'是新值。新值應(yīng)以兩個(gè)十六進(jìn)制字符形式輸入。 |
D | 讀ICDD寄存器。 |
dxxyy | 寫(xiě)ICDD寄存器,'xx'是新值的MSB,'yy'是新值的LSB。新值應(yīng)以兩個(gè)十六進(jìn)制字符形式輸入。 |
E | 進(jìn)入調(diào)試模式。 |
F | 讀ICDF寄存器。 |
N | 無(wú)操作。 |
調(diào)試模式
JTAG引擎采用兩種方法進(jìn)入調(diào)試模式。第一種方法是在背景模式下,輸入"進(jìn)入調(diào)試模式"命令("E")。第二種方法是發(fā)生斷點(diǎn)匹配時(shí)激活調(diào)試模式。在這種情況下,應(yīng)輸入"JD"命令,通知固件模式已經(jīng)改變。在調(diào)試模式下,可以讀寫(xiě)MAXQ寄存器,讀程序堆棧,讀寫(xiě)數(shù)據(jù)存儲(chǔ)器,單步運(yùn)行MAXQ CPU,返回至背景模式,驗(yàn)證密碼以解鎖某些命令。表3列出了該功能支持的命令。表3. 調(diào)試模式下的命令
命令 | 說(shuō)明 |
E | 退出調(diào)試模式,返回背景模式。 |
G | 讀所有寄存器內(nèi)容。寄存器內(nèi)容返回順序取決于MAXQ的類(lèi)型。 |
Mxxyyiijj | 讀數(shù)據(jù)存儲(chǔ)器,'xx'是要讀取字地址的MSB,'yy'是地址的LSB,'ii'是要讀取數(shù)量的MSB,'jj'是其LSB。所有數(shù)值應(yīng)以兩個(gè)十六進(jìn)制字符形式輸入。 |
mxxyyiijj | 向數(shù)據(jù)存儲(chǔ)器寫(xiě)一個(gè)字,'xx'是字地址的MSB,'yy'是地址的LSB,'ii'是要寫(xiě)入字的MSB,'jj'是要寫(xiě)入字的LSB。所有數(shù)值應(yīng)以兩個(gè)十六進(jìn)制字符形式輸入。 |
n | 無(wú)操作。 |
Pxx1...xx32 | 用給定數(shù)據(jù)匹配密碼。所有32個(gè)字節(jié)值應(yīng)以兩個(gè)十六進(jìn)制字符形式輸入。 |
R0iim | 讀寄存器,'ii'是寄存器索引,'m'是寄存器模數(shù)。索引應(yīng)以兩個(gè)十六進(jìn)制字符形式輸入,模數(shù)應(yīng)以一個(gè)十六進(jìn)制字符形式輸入。 |
r0iimxxyy | 寫(xiě)寄存器,'ii'是寄存器索引,'m'是寄存器模數(shù),'xx'是新數(shù)值的MSB,'yy'是LSB。索引和新數(shù)值的每個(gè)字節(jié)應(yīng)以兩個(gè)十六進(jìn)制字符形式輸入。模數(shù)應(yīng)以一個(gè)十六進(jìn)制字符形式輸入。 |
Sxxyyiijj | 讀程序堆棧,'xx'是要讀取的字地址MSB,'yy'是地址的LSB,'ii'是要讀取數(shù)量的MSB,'jj'是其LSB。所有數(shù)值應(yīng)以兩個(gè)十六進(jìn)制字符形式輸入。 |
T | 在當(dāng)前指令指針處執(zhí)行指令。 |
注意:表2中列出的所有背景模式命令('E'除外)也可以用于調(diào)試模式。
二進(jìn)制傳輸
表1、2和3中描述的命令可方便的進(jìn)行手工輸入,其輸出也易于理解。但在多種情況下,將由軟件控制JTAG接口板。由于軟件不方便使用ASCII命令,將結(jié)果轉(zhuǎn)換回二進(jìn)制數(shù)據(jù)時(shí)也存在不必要的處理過(guò)程,因此,JTAG固件也支持二進(jìn)制傳輸。在二進(jìn)制傳輸模式下,數(shù)據(jù)傳送至TAP,首先發(fā)送一個(gè)字節(jié)用于指示要發(fā)送字節(jié)的數(shù)量,然后發(fā)送數(shù)據(jù)。對(duì)于發(fā)送數(shù)據(jù)的每個(gè)字節(jié),固件輸出兩個(gè)字節(jié)。返回的第一個(gè)字節(jié)是傳輸中讀取的狀態(tài)位。第二個(gè)字節(jié)是傳輸中從TAP讀取的數(shù)值。二進(jìn)制模式還具有特殊命令。這些命令在表4中進(jìn)行了說(shuō)明。發(fā)送這些特殊命令時(shí),長(zhǎng)度字節(jié)應(yīng)為0,以指示固件將接收的下一個(gè)字節(jié)做為特殊命令處理。對(duì)于這些特殊命令,返回單個(gè)字節(jié)。這通常只是命令的回應(yīng)。表4. 二進(jìn)制傳輸時(shí),使用的特殊命令
命令 | 說(shuō)明 |
0x00 | 退出二進(jìn)制模式傳輸,重新接受ASCII命令。 |
0x01 | 設(shè)置TAP IR寄存器為數(shù)據(jù)傳輸目的寄存器。 |
0x02 | 設(shè)置TAP DR寄存器為數(shù)據(jù)傳輸目的寄存器。 |
0x03 | 傳輸數(shù)據(jù)時(shí),僅發(fā)送每個(gè)字節(jié)的低3位。 |
0x04 | 設(shè)置RESET引腳為邏輯高電平。 |
0x05 | 清零RESET引腳為邏輯低電平。 |
0x06 | 執(zhí)行JTAG時(shí)鐘的單個(gè)脈沖。 |
0x07 | 讀取TDO引腳的狀態(tài)。 |
0x08 | 傳輸數(shù)據(jù)時(shí),發(fā)送每個(gè)字節(jié)的所有8位。 |
0x09 | 設(shè)置TMS引腳為邏輯高電平。 |
0x0A | 清零TMS引腳為邏輯低電平。 |
0x0B | 設(shè)置TDI引腳為邏輯高電平。 |
0x0C | 清零TDI引腳為邏輯低電平。 |
0x0D | 設(shè)置T0M位。關(guān)于該位的詳細(xì)信息,請(qǐng)參考表1中'V'命令的說(shuō)明。 |
0x0E | 清零T0M位。關(guān)于該位的詳細(xì)信息,請(qǐng)參考表1中'V'命令的說(shuō)明。 |
0x11 | 采用接收的下一字節(jié)做為T(mén)L0數(shù)值。發(fā)"下一"字節(jié)時(shí)不需要先發(fā)一個(gè)長(zhǎng)度字節(jié),也不需要'0'做為特殊命令說(shuō)明字符。關(guān)于TL0寄存器的詳細(xì)信息,請(qǐng)參考表1中'V'命令的說(shuō)明。 |
0x12 | 采用接收的下一字節(jié)做為T(mén)H0數(shù)值。發(fā)"下一"字節(jié)時(shí)不需要先發(fā)一個(gè)長(zhǎng)度字節(jié),也不需要'0'做為特殊命令說(shuō)明字符。關(guān)于TH0寄存器的詳細(xì)信息,請(qǐng)參考表1中'V'命令的說(shuō)明。 |
探測(cè)錯(cuò)誤
在ASCII傳輸模式和二進(jìn)制傳輸模式下,發(fā)生的任何錯(cuò)誤均由命令的輸出指示。在ASCII模式下,錯(cuò)誤輸出形式為"*ERR=xx*",其中xx為錯(cuò)誤類(lèi)型。在二進(jìn)制模式下,輸出錯(cuò)誤代碼,而不是命令回應(yīng)。請(qǐng)參考表5的錯(cuò)誤代碼說(shuō)明。表5. 錯(cuò)誤代碼
錯(cuò)誤代碼 | 說(shuō)明 |
0x80 | 無(wú)法識(shí)別的命令或無(wú)效命令。 |
0x90 | 接收到無(wú)效的十六進(jìn)制字符。 |
0xA0 | 接收的輸入不足。 |
0xB0 | 錯(cuò)誤斷點(diǎn)寄存器索引。 |
0xC? | 接收到非預(yù)期狀態(tài),其中?表示接收到的狀態(tài)位。 |
評(píng)論