news 2026/4/27 3:56:18

FTDI支持jtag协议格式详细规范

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FTDI支持jtag协议格式详细规范

FTDI JTAG 数据传输格式与 SCAN 命令完整规范

📋 文档概述

  • 驱动文件:src/jtag/drivers/openjtag.c
  • 适配变体:Standard FTDI (libftdi)
  • 核心目的:定义 ftdi_write_data()/ftdi_read_data() 数据格式,规范 SCAN 命令在 IR/DR 切换中的完整使用流程
  • 文档版本:1.2(2025-01-22)

目录

  1. 整体数据流
  2. 核心命令格式
  3. SCAN 命令完整使用流程
  4. 数据传输与解析
  5. 调试与问题排查
  6. 核心要点速查

1. 整体数据流

1.1 数据流向架构

jtag_build_buffer() 构建原始数据

jtag_read_buffer() 解析接收数据

openjtag_add_scan() 编码为 OpenJTAG 协议

ftdi_write_data() 发送

ftdi_read_data() 接收

右移对齐(< 8 位)

openjtag_execute_tap_queue() 解析数据

OpenOCD 应用层
(dmi_write/dmi_read/寄存器操作)

OpenOCD JTAG 核心层

OpenJTAG 驱动层

USB TX 缓冲区 (504 字节)

FTDI USB 传输

USB RX 缓冲区 (504 字节)

1.2 缓冲区基础格式

缓冲区类型格式核心特点
TX 缓冲区[命令1][数据1][命令2][数据2]...命令+数据成对出现(单字节命令除外)
RX 缓冲区[数据1][数据2]...[数据N]仅包含数据,无命令字节

2. 核心命令格式

2.1 命令字节总览

命令类型命令码功能描述数据字节
SET_STATE0x01设置 JTAG TAP 状态机1
SCAN0x06传输 IR/DR 比特流(核心)1
SPEED0x00设置 JTAG 通信速率1
RESET (TRST)0x03硬件复位 TAP 状态机0
RESET (SRST)0x54系统复位控制0
RUNTEST0x07设置空闲周期数1
MSB 模式0x75启用高位优先传输0

2.2 SCAN 命令(0x06)- 核心指令

2.2.1 命令格式(8位)
位 7-5位 4位 3-0说明
位数编码TMS0x06固定格式,TMS控制状态退出
2.2.2 位数编码映射
编码值有效位数应用场景示例命令
01最后1位(收尾)0x16
12最后2位(收尾)0x26
23最后3位(收尾)0x96
34最后4位(收尾)0x36
45最后5位(收尾)0x56
56最后6位(收尾)0x56
67最后7位(收尾)0x66
78中间8位(继续传输)0xE6
2.2.3 TMS 位规则
  • 0:中间块,保持 SHIFT 状态,继续传输
  • 1:最后块,退出 SHIFT 状态,切换到 EXIT1
2.2.4 典型示例
场景二进制十六进制说明
DR 中间块(8位)1110 01100xE6TMS=0,继续传输
IR 最后5位0101 01100x56TMS=1,5位 IR 收尾
DR 最后1位0001 01100x16TMS=1,41位 DR 最后1位

2.3 SET_STATE 命令(0x01)

2.3.1 命令格式
位 7-4位 3-0说明
状态码0x01控制 TAP 状态机切换
2.3.2 核心状态码映射
状态名称状态码命令字节用途
TAP_RESET00x01复位状态机
TAP_IRSHIFT110xB1进入 IR 移位模式
TAP_IRUPDATE150xF1使 IR 指令生效
TAP_DRSHIFT40x41进入 DR 移位模式
TAP_DRUPDATE80x81使 DR 数据生效/触发读取

2.4 SPEED 命令(0x00)

速度编码频率 (kHz)命令字节
0480000x00
2240000x20
4120000x40
660000x60
830000x80
1015000xA0
127500xC0
143750xE0

3. SCAN 命令完整使用流程

3.1 通用准备阶段(必选)

步骤操作TX 缓冲区数据说明
1复位 TAP 状态机0x01 0x00初始化状态机
2设置通信速率0x00 0x0048MHz(可按需调整)
3启用 MSB 模式0x75高位优先传输

3.2 IR 切换 + SCAN 传输流程(定义操作类型)

目标:写入 DMI 指令(5位 IR,值为 0x04)
阶段步骤操作TX 缓冲区数据关键说明
状态准备4切换到 IRSELECT0x91 0x00进入 IR 选择阶段
5切换到 IRCAPTURE0xA1 0x00准备捕获 IR 数据
6切换到 IRSHIFT0xB1 0x00核心:进入 IR 移位模式
SCAN 传输7发送 IR 数据0x56 0x040x56=最后5位+TMS=1,0x04=DMI指令
状态收尾8切换到 IREXIT10xC1 0x00退出 IR 移位模式
9切换到 IRPAUSE0xD1 0x00暂存 IR 数据
10切换到 IRUPDATE0xF1 0x00核心:使 IR 指令生效
验证(可选)11读取 IR 返回值RX[0] = 0x04右移对齐:0x04 >> (8-5) = 0x04

3.3 DR 切换 + SCAN 传输流程(执行具体操作)

目标:写入 DMI 寄存器(地址0x10,数据0x12345678,41位 DR)
阶段步骤操作TX 缓冲区数据关键说明
状态准备12切换到 DRSELECT0x21 0x00进入 DR 选择阶段
13切换到 DRCAPTURE0x31 0x00准备捕获 DR 数据
14切换到 DRSHIFT0x41 0x00核心:进入 DR 移位模式
SCAN 传输15DR 中间块10xE6 0x10地址[7:0] = 0x10
16DR 中间块20xE6 0x00地址[15:8] = 0x00
17DR 中间块30xE6 0x00地址[23:16] = 0x00
18DR 中间块40xE6 0x21op=2(写)+地址[28:24]
19DR 中间块50xE6 0x78数据[7:0] = 0x78
20DR 中间块60xE6 0x56数据[15:8] = 0x56
21DR 中间块70xE6 0x34数据[23:16] = 0x34
22DR 中间块80xE6 0x12数据[31:24] = 0x12
23DR 最后块0x16 0x000x16=最后1位+TMS=1,exec=0
状态收尾24切换到 DREXIT10x51 0x00退出 DR 移位模式
25切换到 DRPAUSE0x61 0x00暂存 DR 数据
26切换到 DRUPDATE0x81 0x00核心:完成寄存器写入

3.4 完整 TX 缓冲区示例(IR+DR 组合操作)

// 通用准备 0x01 0x00 // TAP_RESET 0x00 0x00 // SPEED=48MHz 0x75 // MSB 模式 // IR 切换 0x91 0x00 // IRSELECT 0xA1 0x00 // IRCAPTURE 0xB1 0x00 // IRSHIFT 0x56 0x04 // SCAN: IR最后5位 + DMI指令 0xC1 0x00 // IREXIT1 0xD1 0x00 // IRPAUSE 0xF1 0x00 // IRUPDATE // DR 切换 0x21 0x00 // DRSELECT 0x31 0x00 // DRCAPTURE 0x41 0x00 // DRSHIFT 0xE6 0x10 // SCAN: DR中间块1 0xE6 0x00 // SCAN: DR中间块2 0xE6 0x00 // SCAN: DR中间块3 0xE6 0x21 // SCAN: DR中间块4 0xE6 0x78 // SCAN: DR中间块5 0xE6 0x56 // SCAN: DR中间块6 0xE6 0x34 // SCAN: DR中间块7 0xE6 0x12 // SCAN: DR中间块8 0x16 0x00 // SCAN: DR最后1位 0x51 0x00 // DREXIT1 0x61 0x00 // DRPAUSE 0x81 0x00 // DRUPDATE

4. 数据传输与解析

4.1 发送数据(TX 缓冲区)

4.1.1 核心规则
  1. 命令与数据严格成对(单字节命令除外)
  2. SCAN 命令分块规则:
    • 数据长度 >8 位:n个中间块(0xE6) + 1个最后块(按剩余位数编码)
    • 数据长度 ≤8 位:直接使用最后块编码
  3. 所有数据均为 MSB 优先传输

4.2 接收数据(RX 缓冲区)

4.2.1 解析流程核心代码
staticintopenjtag_execute_tap_queue(void){// 1. 发送 TX 数据openjtag_buf_write(usb_tx_buf,usb_tx_buf_offs,&written);// 2. 接收 RX 数据openjtag_buf_read(usb_rx_buf,usb_tx_buf_offs,&usb_rx_buf_len);// 3. 解析 SCAN 数据(核心:右移对齐)while(res_count<openjtag_scan_result_count){len=openjtag_scan_result_buffer[res_count].bits;buffer=openjtag_scan_result_buffer[res_count].buffer;while(len>0){if(len<=8){// <8位数据:右移对齐(MSB→LSB)buffer[count]=usb_rx_buf[rx_offs]>>(8-len);len=0;}else{// ≥8位数据:直接读取buffer[count]=usb_rx_buf[rx_offs];len-=8;}rx_offs++;count++;}res_count++;}returnERROR_OK;}
4.2.2 右移对齐示例
有效位数接收字节右移量计算过程最终结果
30x1A50x1A >> 5 = 0x030x03
50xD630xD6 >> 3 = 0x1A0x1A
10x8070x80 >> 7 = 0x010x01

4.3 典型 RX 缓冲区示例(DMI 读取)

场景:读取地址0x10,返回数据0xDEADBEEF
RX 偏移内容说明
0x000x21status=0 + op=1(读操作)
0x010xEFdata[7:0] = 0xEF
0x020xBEdata[15:8] = 0xBE
0x030xADdata[23:16] = 0xAD
0x040xDEdata[31:24] = 0xDE
0x050x00exec=0(最后1位,右移后=0)

解析结果0xDEADBEEF

5. 调试与问题排查

5.1 调试技巧

5.1.1 启用 USB 通信日志
#define_DEBUG_USB_COMMS_// 输出示例:// USB WRITE: 0xB1 0xD1 0x56 0x04 0x61 0x41 0xE6 0x10// USB READ : 0x21 0xEF 0xBE 0xAD 0xDE 0x00
5.1.2 缓冲区内容打印
// 打印 TX 缓冲区LOG_DEBUG("TX Buf len=%d",usb_tx_buf_offs);for(inti=0;i<usb_tx_buf_offs;i++){LOG_DEBUG("TX[%d]=0x%02X",i,usb_tx_buf[i]);}// 打印 RX 缓冲区LOG_DEBUG("RX Buf len=%d",usb_rx_buf_len);for(inti=0;i<usb_rx_buf_len;i++){LOG_DEBUG("RX[%d]=0x%02X",i,usb_rx_buf[i]);}

5.2 常见问题排查

问题现象可能原因解决方法
SCAN 命令失效未进入 SHIFT 状态先发送 0xB1(IRSHIFT)/0x41(DRSHIFT)
接收数据错误未执行右移对齐对<8位数据执行 >> (8-len) 操作
状态机卡死TMS 位未设为1最后块必须设置 TMS=1
数据长度不符分块规则错误>8位拆分为中间块+最后块
IR 指令不生效未执行 IRUPDATE发送 0xF1 命令使 IR 指令生效

6. 核心要点速查

6.1 SCAN 命令使用三原则

  1. 状态准备:必须先切换到 IRSHIFT/DRSHIFT 状态才能传输数据
  2. 分块传输:>8位数据拆分为中间块(0xE6)+ 最后块(按位数编码)
  3. 收尾标记:最后块必须设置 TMS=1,确保退出 SHIFT 状态

6.2 数据解析核心公式

解析后数据 = RX缓冲区字节 >> (8 - 有效位数) (仅适用于<8位的最后块)

6.3 关键状态切换节点

操作类型核心状态命令作用
IR 生效0xF1 (IRUPDATE)使 IR 指令生效
DR 生效0x81 (DRUPDATE)完成 DR 写入/触发读取
进入传输0xB1/0x41进入 IR/DR 移位模式

6.4 简化记忆口诀

先复位,调速程,MSB模式要开启 IR定操作,DR传数据 SHIFT状态发SCAN,TMS=1才收尾 UPDATE指令生效,右移对齐读数据
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 3:53:16

Chatbox终极指南:从入门到精通AI桌面客户端完整教程

Chatbox终极指南&#xff1a;从入门到精通AI桌面客户端完整教程 【免费下载链接】chatbox Chatbox是一款开源的AI桌面客户端&#xff0c;它提供简单易用的界面&#xff0c;助用户高效与AI交互。可以有效提升工作效率&#xff0c;同时确保数据安全。源项目地址&#xff1a;https…

作者头像 李华
网站建设 2026/4/27 3:53:16

零基础搭建ASR系统|FunASR + speech_ngram_lm_zh-cn完整实践

零基础搭建ASR系统&#xff5c;FunASR speech_ngram_lm_zh-cn完整实践 语音识别&#xff08;ASR&#xff09;技术正在快速走进我们的日常工作与生活。无论是会议记录、视频字幕生成&#xff0c;还是智能客服、语音输入法&#xff0c;背后都离不开高效的语音转文字能力。但对很…

作者头像 李华
网站建设 2026/4/21 21:44:46

计算机毕业设计springboot宿舍报修管理系统 基于Spring Boot的高校公寓故障在线处理平台 Spring Boot驱动的学生宿舍维修服务系统

计算机毕业设计springboot宿舍报修管理系统z3tw1&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 高校宿舍是学生在校生活的核心场景&#xff0c;设施故障若得不到快速响应&#…

作者头像 李华
网站建设 2026/4/25 21:48:39

运维必备:10行shell脚本解决ssl证书更换遗漏难题

SSL证书有效期正在逐年缩短&#xff0c;今年3月15日之前购买有效期是1年&#xff0c;3月15日之后购买的有效期只有200天&#xff0c;2027年缩短到100天&#xff0c;最终2029年有效期会缩短到47天。 作为运维人员&#xff0c;如果你也像我一样&#xff0c;手里有好几百个使用htt…

作者头像 李华
网站建设 2026/4/25 14:02:18

Glyph学术研究应用:论文综述生成系统部署步骤

Glyph学术研究应用&#xff1a;论文综述生成系统部署步骤 1. 引言&#xff1a;为什么需要Glyph&#xff1f; 在学术研究中&#xff0c;面对海量文献时&#xff0c;快速掌握某一领域的研究进展是一项挑战。传统的论文阅读方式效率低、耗时长&#xff0c;而现有的文本摘要工具又…

作者头像 李华
网站建设 2026/4/25 13:16:28

终极3D格式转换:STL到STEP完整操作指南

终极3D格式转换&#xff1a;STL到STEP完整操作指南 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 在3D设计和制造领域&#xff0c;数据格式的兼容性直接影响着工作效率。STL格式因其简单易用在…

作者头像 李华