SVF文件完整教程:从入门到精通
术语表
在开始学习之前,先了解这些重要术语的含义:
基础术语
- SVF - Serial Vector Format,串行向量格式,用于描述JTAG操作的标准文件格式
- JTAG - Joint Test Action Group,联合测试行动组,一种标准的测试和调试接口
- TAP - Test Access Port,测试访问端口,JTAG设备的标准接口
信号线术语
- TCK - Test Clock,测试时钟信号
- TMS - Test Mode Select,测试模式选择信号
- TDI - Test Data In,测试数据输入信号
- TDO - Test Data Out,测试数据输出信号
- TRST - Test Reset,测试复位信号(可选)
寄存器术语
- IR - Instruction Register,指令寄存器,用于接收和存储指令码
- DR - Data Register,数据寄存器,用于数据传输和操作
- HIR - Header Instruction Register,指令寄存器头部数据
- HDR - Header Data Register,数据寄存器头部数据
- TIR - Trailer Instruction Register,指令寄存器尾部数据
- TDR - Trailer Data Register,数据寄存器尾部数据
操作术语
- SIR - Shift Instruction Register,移位指令寄存器操作
- SDR - Shift Data Register,移位数据寄存器操作
- IDCODE - 设备识别码,用于识别JTAG设备的唯一标识
- BYPASS - 旁路模式,让数据直接通过设备而不进行处理
设备相关术语
- FPGA - Field Programmable Gate Array,现场可编程门阵列
- CPLD - Complex Programmable Logic Device,复杂可编程逻辑器件
- Flash - 闪存,用于存储配置数据的非易失性存储器
- ISC - In-System Configuration,在系统配置模式
状态和模式术语
- IDLE - 空闲状态,TAP状态机的基本等待状态
- RESET - 复位状态,TAP状态机的初始状态
- DRPAUSE - 数据寄存器暂停状态
- IRPAUSE - 指令寄存器暂停状态
- RUNTEST - 运行测试状态,执行时钟周期
文件格式术语
- TDI() - 指定输入到设备的数据
- TDO() - 指定期望从设备输出的数据
- MASK() - 指定比较掩码,确定哪些位需要验证
- TCK - 时钟周期数
- SEC - 秒,时间单位
- HZ - 赫兹,频率单位
目录
什么是SVF文件
基本概念
SVF(Serial Vector Format)是一种标准化的文件格式,用于描述JTAG(Joint Test Action Group)测试和编程操作。它是IEEE 1149.1标准的一部分,主要用于:
- 设备编程:将固件烧录到FPGA、CPLD、Flash等设备
- 边界扫描测试:检测电路板连接和器件功能
- 调试和验证:在线调试和系统验证
为什么需要SVF
在没有SVF之前,不同的编程器和测试设备使用各自的格式,导致:
- 兼容性问题
- 移植困难
- 维护成本高
SVF提供了统一的标准,使得同一个文件可以在不同的JTAG设备上使用。
JTAG基础知识
JTAG信号线
JTAG接口包含以下基本信号:
TCK (Test Clock) - 测试时钟,同步所有JTAG操作
TMS (Test Mode Select) - 模式选择,控制TAP状态机
TDI (Test Data In) - 测试数据输入
TDO (Test Data Out) - 测试数据输出
TRST (Test Reset) - 测试复位(可选)
TAP状态机
JTAG使用TAP(Test Access Port)状态机控制操作流程:
Test-Logic-Reset → Run-Test/Idle → Select-DR-Scan → Capture-DR → Shift-DR → Exit1-DR → Update-DR
→ Select-IR-Scan → Capture-IR → Shift-IR → Exit1-IR → Update-IR
JTAG链连接
多个JTAG设备可以串联形成链:
JTAG控制器 → 设备1 → 设备2 → 设备3 → 返回控制器
TDI→TDO TDI→TDO TDI→TDO
SVF文件结构
文件头部
SVF文件通常以注释开始,描述文件信息:
! Lattice Semiconductor Corp.
! Serial Vector Format (.SVF) File.
! User information:
! Source file: melbourne_swb.svf
! CREATED BY: Diamond Deployment Tool 3.14
! CREATION DATE: Mon Jul 14 19:05:55 2025
链描述
描述JTAG链中的设备:
! Chain description.
! 1 LCMXO3LF-6900C FLASH Erase,Program,Verify
! 2 LCMXO3LF-6900C FLASH Erase,Program,Verify
! End chain description
初始化部分
设置JTAG链的基本参数:
! Initialize
HDR 1 TDI(0); ! Header Data Register长度和默认值
HIR 8 TDI(FF); ! Header Instruction Register长度和默认值
TDR 0; ! Trailer Data Register长度
TIR 0; ! Trailer Instruction Register长度
ENDDR DRPAUSE; ! DR操作结束后的状态
ENDIR IRPAUSE; ! IR操作结束后的状态
STATE IDLE; ! 初始状态
SVF命令详解
基本命令类型
1. SIR (Shift Instruction Register)
向指令寄存器移入数据:
SIR 8 TDI(E0); ! 移入8位指令0xE0
2. SDR (Shift Data Register)
向数据寄存器移入/移出数据:
SDR 32 TDI(00000000) ! 移入32位数据
TDO(612BD043) ! 期望输出数据
MASK(FFFFFFFF); ! 比较掩码
3. RUNTEST
控制时钟运行:
RUNTEST IDLE 2 TCK 1.00E-003 SEC; ! 在IDLE状态运行2个时钟周期,最少1ms
4. STATE
设置TAP状态:
STATE IDLE; ! 设置为IDLE状态
高级命令
FREQUENCY
设置时钟频率:
FREQUENCY 1.00e+006 HZ; ! 设置为1MHz
HDR/HIR/TDR/TIR
设置头部和尾部数据:
HDR 1 TDI(0); ! 数据寄存器头部:1位,值为0
HIR 8 TDI(FF); ! 指令寄存器头部:8位,值为0xFF
多设备JTAG链
链配置原理
当多个设备串联时,数据需要通过整个链传输:
设备1(8位IR) → 设备2(8位IR) → 设备3(8位IR)
总IR长度 = 8 + 8 + 8 = 24位
设备选择
要操作特定设备,需要:
- 计算目标设备在链中的位置
- 设置正确的HDR/HIR/TDR/TIR值
- 发送适当长度的数据
示例:操作链中第2个设备
! 设置链参数(假设3个8位IR设备)
HIR 8 TDI(FF); ! 设备3的IR(旁路)
HDR 0; ! 设备3的DR
TIR 8 TDI(FF); ! 设备1的IR(旁路)
TDR 0; ! 设备1的DR
! 操作设备2
SIR 8 TDI(3C); ! 向设备2发送指令0x3C
SDR 32 TDI(00000000) TDO(12345678) MASK(FFFFFFFF);
🤔 常见疑问解答
疑问1:HIR、HDR、TIR、TDR这些指令是什么意思?
这些是JTAG链配置指令,用于设置头部和尾部数据:
位置关系:
TIR → [目标设备] → HIR
TDR → [目标设备] → HDR
指令含义:
- HIR = Header Instruction Register(头部指令寄存器)
- HDR = Header Data Register(头部数据寄存器)
- TIR = Trailer Instruction Register(尾部指令寄存器)
- TDR = Trailer Data Register(尾部数据寄存器)
实际作用:
当执行 SIR 8 TDI(3C)
时,实际发送的数据流是:
[FF] → [3C] → [FF]
↓ ↓ ↓
设备3 设备2 设备1
(HIR) (目标) (TIR)
可以把这些指令想象成**“包装纸”**:
原始数据: [3C]
加上包装: [FF][3C][FF]
↑ ↑ ↑
HIR 目标 TIR
疑问2:JTAG链中如何指定操作哪个设备?
关键理解:JTAG链中无法直接指定某个设备,而是通过数据位置来控制!
数据传输原理:
控制器 → 设备1 → 设备2 → 设备3 → 控制器
TDI TDI→TDO TDI→TDO TDI→TDO TDO
数据是串行传输的,每个设备按顺序接收对应位置的数据:
发送的数据:[设备3数据][设备2数据][设备1数据]
↓
设备1接收:[设备1数据] ← 最后8位
设备2接收:[设备2数据] ← 中间8位
设备3接收:[设备3数据] ← 最前8位
设备选择策略:
- 旁路非目标设备:给不需要操作的设备发送0xFF(BYPASS指令)
- 激活目标设备:给需要操作的设备发送实际指令
- 数据路由:后续的数据操作只会与激活的设备交互
实际示例:
! 要操作设备2,实际发送24位数据(3个设备×8位IR)
HIR 8 TDI(FF); ! 这8位发给设备3(旁路指令)
TIR 8 TDI(FF); ! 这8位发给设备1(旁路指令)
SIR 8 TDI(3C); ! 这8位发给设备2(实际操作指令)
! 等效于:
SIR 24 TDI(FF3CFF); ! FF给设备3,3C给设备2,FF给设备1
疑问3:IR(指令寄存器)是什么?
IR的基本概念:
IR是Instruction Register(指令寄存器),是JTAG设备内部的特殊寄存器。
IR的作用:
- 接收指令 - 告诉设备要执行什么操作
- 控制设备模式 - 决定设备进入哪种工作状态
- 选择数据路径 - 确定后续的数据操作针对哪个内部寄存器
工作原理:
JTAG控制器 → [指令码] → 设备的IR → 设备执行相应操作
常见指令示例:
- 发送
0xE0
到IR → 设备进入"读取ID"模式 - 发送
0x3C
到IR → 设备进入"读取状态"模式 - 发送
0x70
到IR → 设备进入"编程"模式 - 发送
0xFF
到IR → 设备进入"旁路"模式
IR长度的含义:
- 8位IR = 指令寄存器宽度为8位
- 可支持 2^8 = 256 种不同指令
- 每次发送指令需要8位数据
在JTAG链中的影响:
设备1(8位IR) → 设备2(8位IR) → 设备3(8位IR)
总IR长度 = 8 + 8 + 8 = 24位
要向设备2发送指令0x3C
,需要发送24位数据:
[设备3的指令8位] + [设备2的指令8位] + [设备1的指令8位]
= [0xFF] + [0x3C] + [0xFF] = 0xFF3CFF
实际应用示例
1. 设备ID检查
验证设备是否正确连接:
! 读取设备ID
SIR 8 TDI(E0); ! IDCODE指令
SDR 32 TDI(00000000)
TDO(612BD043) ! 期望的设备ID
MASK(FFFFFFFF);
2. Flash擦除
擦除设备内部Flash:
! 使能Flash操作
SIR 8 TDI(C6); ! ISC_ENABLE指令
SDR 8 TDI(00);
RUNTEST IDLE 2 TCK 1.00E-003 SEC;
! 擦除Flash
SIR 8 TDI(0E); ! ISC_ERASE指令
SDR 8 TDI(0E); ! 擦除命令
RUNTEST IDLE 2 TCK 30.0 SEC; ! 等待擦除完成
💡 实际案例:多设备Flash操作
以melbourne_swb.svf文件为例,该文件包含2个LCMXO3LF-6900C设备的Flash编程。
操作第1个设备:
! 配置JTAG链 - 操作设备1
HDR 1 TDI(0); ! 头部DR:1位,值为0
HIR 8 TDI(FF); ! 头部IR:8位,值为FF(设备2进入旁路)
TDR 0; ! 尾部DR:0位
TIR 0; ! 尾部IR:0位(设备1后面没有设备)
! 检查设备1的ID
SIR 8 TDI(E0); ! IDCODE指令
SDR 32 TDI(00000000) TDO(612BD043) MASK(FFFFFFFF);
! 使能设备1的Flash操作
SIR 8 TDI(C6); ! ISC_ENABLE指令
SDR 8 TDI(00);
RUNTEST IDLE 2 TCK 1.00E-003 SEC;
! 擦除设备1的Flash
SIR 8 TDI(0E); ! ISC_ERASE指令
SDR 8 TDI(01);
RUNTEST IDLE 2 TCK 1.00E+000 SEC;
! 编程设备1...
切换到第2个设备:
! 重新配置JTAG链 - 操作设备2
HDR 0; ! 头部DR:0位
HIR 0; ! 头部IR:0位(设备2后面没有设备)
TDR 1 TDI(0); ! 尾部DR:1位,值为0
TIR 8 TDI(FF); ! 尾部IR:8位,值为FF(设备1进入旁路)
! 检查设备2的ID
SIR 8 TDI(E0); ! IDCODE指令
SDR 32 TDI(00000000) TDO(612BD043) MASK(FFFFFFFF);
! 使能设备2的Flash操作
SIR 8 TDI(C6); ! ISC_ENABLE指令
SDR 8 TDI(00);
RUNTEST IDLE 2 TCK 1.00E-003 SEC;
! 擦除设备2的Flash
SIR 8 TDI(0E); ! ISC_ERASE指令
SDR 8 TDI(01);
RUNTEST IDLE 2 TCK 1.00E+000 SEC;
! 编程设备2...
关键理解:
- 设备切换:通过重新配置HDR/HIR/TDR/TIR参数来切换目标设备
- 旁路机制:非目标设备接收0xFF指令进入旁路模式
- 相同操作:对每个设备执行相同的Flash操作序列
- 独立编程:每个设备有独立的配置数据和验证过程
这就是为什么多设备SVF文件通常很长 - 它包含了每个设备的完整编程序列!
3. 数据编程
向设备写入数据:
! 设置地址
SIR 8 TDI(46); ! LSC_INIT_ADDRESS指令
SDR 8 TDI(04); ! 起始地址
RUNTEST IDLE 2 TCK 1.00E-003 SEC;
! 编程数据
SIR 8 TDI(70); ! LSC_PROG_INCR_NV指令
SDR 128 TDI(036000000040000000DCFFFFCDBDFFFF); ! 128位数据
RUNTEST IDLE 2 TCK 1.00E-002 SEC;
4. 状态检查
检查操作是否成功:
! 读取状态寄存器
SIR 8 TDI(3C); ! LSC_READ_STATUS指令
RUNTEST IDLE 2 TCK 1.00E-003 SEC;
SDR 32 TDI(00000000)
TDO(00000000) ! 期望状态(无错误)
MASK(00003000); ! 只检查错误位
常见问题与解决方案
1. 设备ID不匹配
问题:读取的设备ID与期望不符
解决方案:
- 检查JTAG连接
- 确认设备型号
- 检查电源和时钟
2. 编程失败
问题:数据写入失败
解决方案:
- 检查设备是否已解锁
- 确认擦除操作完成
- 验证时序参数
3. 多设备链问题
问题:无法正确操作链中特定设备
解决方案:
- 重新计算链长度
- 检查HDR/HIR/TDR/TIR设置
- 验证设备顺序
4. 时序问题
问题:操作超时或时序错误
解决方案:
- 降低时钟频率
- 增加等待时间
- 检查信号完整性
深入理解:SIR和HIR的区别
SIR (Shift Instruction Register)
SIR是实际的指令操作命令,用于:
- 向目标设备发送具体指令
- 控制设备进入特定操作模式
- 每次SIR操作都会影响设备状态
SIR 8 TDI(E0); ! 发送IDCODE指令到设备
HIR (Header Instruction Register)
HIR是链配置参数,用于:
- 定义指令寄存器的头部数据
- 在多设备链中正确路由指令
- 不是实际的操作命令,而是配置信息
HIR 8 TDI(FF); ! 设置8位头部,值为0xFF(通常是旁路指令)
关键区别
- 功能不同:SIR执行操作,HIR配置链
- 使用场景:SIR用于单个操作,HIR用于链设置
- 数据含义:SIR是具体指令,HIR通常是旁路指令(0xFF)
高级主题
1. 边界扫描测试
边界扫描是JTAG的重要应用,用于测试电路板连接:
! 加载边界扫描指令
SIR 8 TDI(1C); ! PRELOAD指令
! 设置测试向量
SDR 664 TDI(FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF...); ! 设置所有引脚为高电平
! 执行测试
SIR 8 TDI(1D); ! SAMPLE指令
SDR 664 TDI(00000000...) TDO(期望值) MASK(掩码);
2. 在线调试
SVF也可用于在线调试:
! 设置断点
SIR 8 TDI(DEBUG_CMD);
SDR 32 TDI(断点地址);
! 读取寄存器
SIR 8 TDI(REG_READ);
SDR 32 TDI(寄存器地址) TDO(期望值);
! 单步执行
SIR 8 TDI(STEP_CMD);
RUNTEST IDLE 10 TCK;
3. 安全特性
现代设备常包含安全特性:
! 检查保护状态
SIR 8 TDI(3C); ! READ_STATUS
SDR 32 TDI(00000000)
TDO(00000000)
MASK(00000020); ! 检查保护位
! 解锁设备(如果需要)
SIR 8 TDI(UNLOCK_CMD);
SDR 128 TDI(密钥数据);
实用工具和技巧
1. SVF文件验证
验证SVF文件语法的方法:
- 使用专业JTAG工具的语法检查
- 检查指令和数据长度匹配
- 验证时序参数合理性
2. 性能优化
优化SVF执行速度:
! 使用合适的频率
FREQUENCY 10.0E6 HZ; ! 10MHz,根据设备能力调整
! 减少不必要的等待
RUNTEST IDLE 1 TCK; ! 最小等待时间
! 批量操作
SIR 8 TDI(70); ! 编程指令
SDR 128 TDI(数据1);
SDR 128 TDI(数据2); ! 连续编程,无需重复发送指令
SDR 128 TDI(数据3);
3. 错误处理
添加错误检查机制:
! 操作前检查
SIR 8 TDI(3C); ! 状态检查
SDR 32 TDI(00000000) TDO(00000000) MASK(错误掩码);
! 操作
SIR 8 TDI(操作指令);
SDR 数据长度 TDI(数据);
! 操作后验证
SIR 8 TDI(3C); ! 再次状态检查
SDR 32 TDI(00000000) TDO(成功状态) MASK(状态掩码);
设备特定的SVF模式
1. FPGA编程模式
不同FPGA厂商的SVF特点:
Xilinx设备:
! Xilinx特有的配置序列
SIR 6 TDI(09); ! CFG_IN指令
SDR 配置数据长度 TDI(比特流数据);
Intel/Altera设备:
! Intel特有的配置序列
SIR 10 TDI(002); ! PROGRAM指令
SDR 1 TDI(1); ! 开始配置
Lattice设备(如您的文件):
! Lattice特有的Flash编程
SIR 8 TDI(C6); ! ISC_ENABLE
SIR 8 TDI(0E); ! ISC_ERASE
SIR 8 TDI(70); ! LSC_PROG_INCR_NV
2. 微控制器调试模式
! ARM Cortex调试
SIR 4 TDI(E); ! DEBUG指令
SDR 35 TDI(调试命令和地址);
! 读取调试寄存器
SDR 35 TDI(00000000000) TDO(期望数据);
故障排除指南
1. 常见错误代码
理解设备返回的错误状态:
! 状态位含义(以Lattice为例)
! Bit 0: BUSY - 设备忙
! Bit 1: FAIL - 操作失败
! Bit 2: FEA - 特性错误
! Bit 3: ENC - 加密错误
! Bit 4: PROT - 保护错误
2. 调试步骤
系统化的故障排除方法:
- 基础连接检查
! 最简单的连接测试
STATE RESET;
STATE IDLE;
SIR 8 TDI(FF); ! 旁路指令
SDR 1 TDI(1) TDO(1); ! 应该返回1
- 设备识别
! 读取设备ID
SIR 8 TDI(E0);
SDR 32 TDI(00000000) TDO(设备ID);
- 逐步验证
! 分步骤验证每个操作
SIR 8 TDI(指令1);
! 检查状态
SIR 8 TDI(指令2);
! 再次检查状态
总结
SVF文件是JTAG操作的标准化描述格式,掌握其结构和命令对于硬件调试和编程至关重要。通过理解JTAG基础、SVF命令和多设备链操作,您可以:
- 读懂现有的SVF文件
- 修改SVF文件以适应不同需求
- 调试JTAG相关问题
- 优化编程和测试流程
- 处理复杂的多设备系统
- 实现高级调试和测试功能
记住,实践是最好的学习方式。建议从简单的单设备操作开始,逐步掌握复杂的多设备链操作。同时,不同厂商的设备可能有特定的指令和时序要求,需要参考相应的技术文档。
进一步学习资源
- IEEE 1149.1标准文档
- 设备厂商的JTAG编程指南
- 专业JTAG工具的用户手册
- 在线JTAG社区和论坛
附录A:常用SVF指令参考
基础指令
指令 | 功能 | 示例 |
---|---|---|
SIR | 移位指令寄存器 | SIR 8 TDI(E0); |
SDR | 移位数据寄存器 | SDR 32 TDI(00000000); |
RUNTEST | 运行测试时钟 | RUNTEST IDLE 2 TCK; |
STATE | 设置TAP状态 | STATE IDLE; |
FREQUENCY | 设置时钟频率 | FREQUENCY 1.0E6 HZ; |
链配置指令
指令 | 功能 | 示例 |
---|---|---|
HDR | 头部数据寄存器 | HDR 1 TDI(0); |
HIR | 头部指令寄存器 | HIR 8 TDI(FF); |
TDR | 尾部数据寄存器 | TDR 0; |
TIR | 尾部指令寄存器 | TIR 0; |
ENDDR | DR结束状态 | ENDDR DRPAUSE; |
ENDIR | IR结束状态 | ENDIR IRPAUSE; |
附录B:常见设备指令码
Lattice LCMXO3系列
指令名称 | 指令码 | 功能 |
---|---|---|
IDCODE_PUB | 0xE0 | 读取设备ID |
PRELOAD | 0x1C | 边界扫描预加载 |
LSC_READ_STATUS | 0x3C | 读取状态寄存器 |
ISC_ENABLE | 0xC6 | 使能配置模式 |
ISC_ERASE | 0x0E | 擦除Flash |
LSC_INIT_ADDRESS | 0x46 | 初始化地址 |
LSC_PROG_INCR_NV | 0x70 | 递增编程 |
LSC_CHECK_BUSY | 0xF0 | 检查忙状态 |
BYPASS | 0xFF | 旁路指令 |
Xilinx 7系列FPGA
指令名称 | 指令码 | 功能 |
---|---|---|
IDCODE | 0x09 | 读取设备ID |
CFG_IN | 0x05 | 配置数据输入 |
CFG_OUT | 0x04 | 配置数据输出 |
JPROGRAM | 0x0B | 开始配置 |
JSTART | 0x0C | 启动配置 |
JSHUTDOWN | 0x0D | 关闭配置 |
Intel/Altera Cyclone系列
指令名称 | 指令码 | 功能 |
---|---|---|
IDCODE | 0x006 | 读取设备ID |
SAMPLE/PRELOAD | 0x005 | 边界扫描 |
EXTEST | 0x000 | 外部测试 |
BYPASS | 0x3FF | 旁路指令 |
PULSE_NCONFIG | 0x001 | 复位配置 |
CONFIG_IO | 0x00D | 配置I/O |
附录C:状态寄存器位定义
Lattice设备状态位
位31-16: 保留
位15: CFG_SPD - 配置速度
位14: CFG_MODE - 配置模式
位13: DONE - 配置完成
位12: ISC_ENABLE - ISC使能
位11: WRITE_ENABLE - 写使能
位10: READ_LOCK - 读锁定
位9: WRITE_LOCK - 写锁定
位8: PWD_ENABLE - 密码使能
位7: ENCRYPT_ENABLE - 加密使能
位6: DONE_EX - 扩展完成
位5: PWD_PROTECT - 密码保护
位4: ENCRYPT_ONLY - 仅加密
位3: BUSY - 忙状态
位2: FAIL - 失败状态
位1: FEA - 特性错误
位0: BSE - 边界扫描错误
附录D:时序参数指南
典型时序值
参数 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|
TCK频率 | 1 | 10 | 25 | MHz |
擦除时间 | 10 | 30 | 60 | 秒 |
编程时间 | 1 | 10 | 50 | 毫秒/页 |
验证时间 | 1 | 5 | 20 | 毫秒/页 |
设备特定时序
! 快速设备
FREQUENCY 25.0E6 HZ;
RUNTEST IDLE 1 TCK 1.0E-6 SEC;
! 标准设备
FREQUENCY 10.0E6 HZ;
RUNTEST IDLE 2 TCK 1.0E-3 SEC;
! 慢速设备
FREQUENCY 1.0E6 HZ;
RUNTEST IDLE 10 TCK 1.0E-2 SEC;
附录E:实用脚本示例
1. 设备检测脚本
! 通用设备检测
STATE RESET;
STATE IDLE;
! 尝试读取ID
SIR 8 TDI(E0);
SDR 32 TDI(00000000);
! 如果成功,设备存在且响应
2. 链长度检测
! 检测链中设备数量
STATE RESET;
STATE IDLE;
! 发送全1到IR
SIR 1000 TDI(FFFFFFFFFFFFFFFF...);
! 发送全0
SIR 1000 TDI(00000000000000000...);
! 计算返回的1的数量确定链长度
3. 快速编程模板
! 快速编程模板
FREQUENCY 20.0E6 HZ;
! 1. 设备识别
SIR 8 TDI(E0);
SDR 32 TDI(00000000) TDO(设备ID) MASK(FFFFFFFF);
! 2. 使能编程
SIR 8 TDI(C6);
SDR 8 TDI(00);
! 3. 擦除
SIR 8 TDI(0E);
SDR 8 TDI(0E);
RUNTEST IDLE 2 TCK 30.0 SEC;
! 4. 编程循环
SIR 8 TDI(46);
SDR 8 TDI(04);
SIR 8 TDI(70);
! 重复SDR命令进行数据编程
! 5. 验证
SIR 8 TDI(3C);
SDR 32 TDI(00000000) TDO(00000000) MASK(00003000);