news 2026/4/16 11:16:14

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/12 12:32:06

中小企业AI转型:Qwen3-1.7B低门槛部署实战指南

中小企业AI转型&#xff1a;Qwen3-1.7B低门槛部署实战指南 在当前人工智能加速落地的背景下&#xff0c;越来越多中小企业开始探索如何将大模型技术融入日常运营。然而&#xff0c;高昂的算力成本、复杂的部署流程和专业人才的缺乏&#xff0c;常常成为阻碍其AI转型的主要瓶颈…

作者头像 李华
网站建设 2026/4/12 14:39:12

AI研发提效新方式:MinerU本地部署一文详解

AI研发提效新方式&#xff1a;MinerU本地部署一文详解 1. 为什么PDF提取需要AI&#xff1f;传统方法的瓶颈在哪 你有没有遇到过这种情况&#xff1a;手头有一份几十页的学术论文或技术报告PDF&#xff0c;想把内容复制到Markdown里整理笔记&#xff0c;结果一粘贴全是乱码、错…

作者头像 李华
网站建设 2026/4/16 9:36:34

百度文库文档免费获取工具:终极清理与打印优化指南

百度文库文档免费获取工具&#xff1a;终极清理与打印优化指南 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 想要免费获取百度文库的完整文档内容吗&#xff1f;这款百度文库文档获取工具通过智…

作者头像 李华
网站建设 2026/4/16 12:17:46

Packmol分子结构构建工具深度解析与实战指南

Packmol分子结构构建工具深度解析与实战指南 【免费下载链接】packmol Packmol - Initial configurations for molecular dynamics simulations 项目地址: https://gitcode.com/gh_mirrors/pa/packmol Packmol作为分子动力学模拟领域的重要前置工具&#xff0c;为复杂分…

作者头像 李华
网站建设 2026/4/12 17:40:02

通义千问3-14B避坑指南:单卡部署常见问题全解

通义千问3-14B避坑指南&#xff1a;单卡部署常见问题全解 你是不是也和我一样&#xff0c;看到“14B体量、30B性能”、“单卡可跑”、“Thinking模式逼近QwQ-32B”这些关键词就心动不已&#xff1f;但一上手却发现&#xff1a;显存爆了、加载失败、响应卡顿、Ollama启动报错……

作者头像 李华
网站建设 2026/4/16 12:21:33

手把手教你部署OCR模型:cv_resnet18_ocr-detection保姆级教程

手把手教你部署OCR模型&#xff1a;cv_resnet18_ocr-detection保姆级教程 你是不是也遇到过这样的问题&#xff1a;一堆扫描件、截图、照片里的文字&#xff0c;手动一个个敲进电脑&#xff0c;费时又容易出错&#xff1f;别急&#xff0c;今天这篇文章就是为你准备的。我会带…

作者头像 李华