libero ProASIC3 A3P250 JTAG-DirectC 源码分析一
1、JTAG 接口 描述

2、 read idcode
void dp_read_idcode(void) {opcode = IDCODE;IRSCAN_in();goto_jtag_state(JTAG_RUN_TEST_IDLE,0u);DRSCAN_out(IDCODE_LENGTH, (DPUCHAR*)DPNULL, global_buf1);device_ID = (DPULONG)global_buf1[0] | (DPULONG)global_buf1[1] << 8u | (DPULONG)global_buf1[2] << 16u | (DPULONG)global_buf1[3] << 24u;device_rev = (DPUCHAR) (device_ID >> 28);#ifdef ENABLE_DISPLAYdp_display_text("\r\nActID = ");dp_display_value(device_ID,HEX);#endifreturn; }
- 指令 IDCODE = 0x0Fu
- IRSCAN_in()→ goto_jtag_state(JTAG_SHIFT_IR,0u); 该函数 是 将“JTAG 16种状态” 变成 JTAG_SHIFT_IR 状态;
- dp_shift_in(0u, OPCODE_BIT_LENGTH, &opcode, 1u); 函数 将 指令 ‘IDCODE = 0x0Fu’ 共计 8bit 发送出去,通过 TDI 引脚!
-
goto_jtag_state(JTAG_PAUSE_IR,0u); 将 将“JTAG 16种状态” 变成 JTAG_PAUSE_IR 状态;
-
goto_jtag_state(JTAG_RUN_TEST_IDLE,0u); 转换到 JTAG_RUN_TEST_IDLE 状态!
-
goto_jtag_state(JTAG_SHIFT_DR,0u); 转换到 JTAG_SHIFT_DR 状态!
- 保存 TDO 输出的数据 ,共计 32bit ,存到 global_buf1 数组中,共计4个字节!
-
goto_jtag_state(JTAG_PAUSE_DR,0u); 转换到 JTAG_PAUSE_DR 状态!
- 结束!
JTAG 16种 状态图:
