OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8849|回复: 12

SWD协议无法读取IDCODE,求助?

[复制链接]

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2018-8-25
在线时间
33 小时
发表于 2018-9-10 17:43:25 | 显示全部楼层 |阅读模式
30金钱
本帖最后由 LevenC 于 2018-9-10 17:50 编辑

1.SWD GPIO初始化[mw_shl_code=c,true]void swd_gpio_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);    /* 使能GPIO时钟 */
    GPIO_InitStructure.GPIO_Pin = (SWD_PIN_SWDIO | SWD_PIN_SWCLK);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         /* 推挽输出 */
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        /* 最大输出速度为50MHz */
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    SW_SWCLK_OUT(1U);      /* SWCLK输出高电平 */
    SW_SWDIO_OUT(0U);      /* SWDIO输出低电平 */
}[/mw_shl_code]
2.连接和线路重启
[mw_shl_code=c,true]void swd_line_reset(void)
{
    static vu8  cycle = 0;

    SW_SWDIO_SET_OUT();  /* SWDIO设置为输出(推挽输出) */
    SW_SWDIO_OUT(1U);    /* SWDIO输出高电平 */

    /* 1. At least 50 clocks with SWDIOTMS HIGH */
    for(cycle = 0; cycle < 56; cycle++) {
        SW_SWCLK_CYCLE();  /* 时钟周转 */
    }

    /* 2. At least two Idle cycles*/
    dap_data_manage.idle_cycles = 8;
    cycle = dap_data_manage.idle_cycles;
    if(cycle) {
        SW_SWDIO_OUT(0U);     /* SWDIO输出低电平 */
        for(; cycle; cycle--) {
            SW_SWCLK_CYCLE();  /* 时钟周转 */
        }
    }
}[/mw_shl_code]
3.从JTAG切换到SWD操作
[mw_shl_code=c,true]void jtag_to_swd(void)
{
    static vu8  cycle = 0;

    SW_SWDIO_SET_OUT();
    SW_SWDIO_OUT(1U);

    /* 1. At least 50 clocks with SWDIOTMS HIGH */
    for(cycle = 0; cycle < 56; cycle++) {
        SW_SWCLK_CYCLE();
    }

    /* 2. JTAG-to-SWD sequence */
    swd_send_data(JTAG_TO_SWD_SEQ_LSB);  /* SWD首先发送最低有效位((u16)0xE79E) */

    /* 3. At least 50 clocks with SWDIOTMS HIGH */
    for(cycle = 0; cycle < 56; cycle++) {
        SW_SWCLK_CYCLE();
    }

    SW_SWDIO_OUT(0U);
}[/mw_shl_code]
4.连接和线路重启
5.读IDCODE
[mw_shl_code=c,true]/**
  * @brief  SWD读写协议操作实现
  * @param  request: A[3:2] RnW APnDP
  *               此处的参数为0x2,IDCODE寄存器0x00,DP为0b0,读为0b1
  *         data: DATA[31:0]
  * @retval ACK[2:0]
  */
u8 swd_read_write_operation(u32 request, u32 *data)
{
    static vu8  num = 0;    /* 用于调转时钟周期数循环 */
    static vu32 ack = 0, bit = 0, parity = 0;

    SW_SWDIO_SET_OUT();      /* SWDIO设置为输出(推挽输出) */
    /* 主机(Host) Packet Request - 主机进行包请求 */
    SW_WRITE_BIT(1U);           /* Start Bit */
    bit = (request >> 0U) & 1U;
    SW_WRITE_BIT(bit);           /* APnDP Bit */
    parity += bit;
    bit = (request >> 1U) & 1U;
    SW_WRITE_BIT(bit);           /* RnW Bit */
    parity += bit;
    bit = (request >> 2U) & 1U;
    SW_WRITE_BIT(bit);           /* A2 Bit */
    parity += bit;
    bit = (request >> 3U) & 1U;
    SW_WRITE_BIT(bit);           /* A3 Bit */
    parity += bit;
    SW_WRITE_BIT(parity  & 1U);  /* Parity Bit */
    SW_WRITE_BIT(0U);            /* Stop Bit */
    SW_WRITE_BIT(1U);            /* Park Bit */

    SW_SWDIO_SET_INT();       /* SWDIO设置为输入(浮空输入) */
    for(num = dap_data_manage.turnaround; num; num--) {
        SW_SWCLK_CYCLE();    /* 主机请求与目标机回应之间有调转周期 */
    }
    /* 目标机(Target) Acknowledge response - ACK回应 */
    SW_READ_BIT(bit);
    ack  = bit << 0U;
    SW_READ_BIT(bit);
    ack |= bit << 1U;
    SW_READ_BIT(bit);
    ack |= bit << 2U;
    printf("Target ACK:0x%X\r\n", ack);
    /* ACK回应后的数据处理,未写 */
    return ack;
}[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3708
金钱
3708
注册时间
2011-5-23
在线时间
2010 小时
发表于 2018-9-10 18:23:14 | 显示全部楼层
1. Saleae 逻辑分析仪可以分析SWD协议
2. 跟一下CMSIS-DAP项目

比如
https://github.com/ARMmbed/DAPLink
https://github.com/x893/CMSIS-DAP.git
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4105
金钱
4105
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-10 22:54:19 | 显示全部楼层
Mask 一下
正在找协议
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2018-8-25
在线时间
33 小时
 楼主| 发表于 2018-9-11 13:16:10 | 显示全部楼层
本帖最后由 LevenC 于 2018-9-11 13:18 编辑
edmund1234 发表于 2018-9-10 22:54
Mask 一下
正在找协议

协议我可以传上来。
名称: debug_interface_v5_2_architecture_specification_IHI0031E.pdf
大小: 2357114 字节 (2301 KiB)
SHA256: ED3ED30ECBD8382D849079C3C133C4832EB35D182927B630126E56BB186FD7B0

debug_interface_v5_2_architecture_specification_IHI0031E.pdf

2.25 MB, 下载次数: 121

Arm® Debug Interface Architecture Specification

回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4105
金钱
4105
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-11 13:36:06 | 显示全部楼层
LevenC 发表于 2018-9-11 13:16
协议我可以传上来。
名称: debug_interface_v5_2_architecture_specification_IHI0031E.pdf
大小: 2357 ...

谢了
回复

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2018-9-11 18:28:14 | 显示全部楼层
源程序有错,网上抄别人的就是这样子,自己改下吧
1-1
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2018-8-25
在线时间
33 小时
 楼主| 发表于 2018-9-11 21:43:17 来自手机 | 显示全部楼层
mygod 发表于 2018-9-11 18:28
源程序有错,网上抄别人的就是这样子,自己改下吧

还望兄台不吝赐教,指点指点,小弟感激不尽……
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2018-8-25
在线时间
33 小时
 楼主| 发表于 2018-9-11 21:50:17 | 显示全部楼层
aozima 发表于 2018-9-10 18:23
1. Saleae 逻辑分析仪可以分析SWD协议
2. 跟一下CMSIS-DAP项目

非常感谢,我有参考CMSIS-DAP,借鉴了她的代码和逻辑设计。
回复

使用道具 举报

0

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-18
在线时间
21 小时
发表于 2020-4-22 11:08:02 | 显示全部楼层
楼主这个问题解决了吗?你当时读的是DP_ID?返回ACK值是什么?
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2016-1-18
在线时间
26 小时
发表于 2020-5-3 00:36:28 | 显示全部楼层
解决了没~
我也读不到IDCODE,没有ACK,但是用stlink连接是好的
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2021-11-4
在线时间
4 小时
发表于 2021-11-18 10:46:49 | 显示全部楼层
让睫毛载来爱 发表于 2020-5-3 00:36
解决了没~
我也读不到IDCODE,没有ACK,但是用stlink连接是好的

用逻辑分析仪先抓取SCLK和SDIO的波形,分析一下就可以啦。
简单说一下,
1.上电后,SCLK要发送低电平,SDIO发送高电平。
2.SCLK+SDIO发送LINERESET
3.设置 JTAG->SWD
4.发送LINERESET,注意发送完毕后,需要发送2个Idle信号
5.在发送IDCODE,这样就会有ACK OK的回复,然后就可以读出32bit的数据了
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2021-11-4
在线时间
4 小时
发表于 2021-11-18 10:54:42 | 显示全部楼层
leon0818 发表于 2021-11-18 10:46
用逻辑分析仪先抓取SCLK和SDIO的波形,分析一下就可以啦。
简单说一下,
1.上电后,SCLK要发送低电平, ...

上电读IDCODE.png
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2022-5-16
在线时间
1 小时
发表于 2022-5-16 19:35:00 | 显示全部楼层

大佬问一下,在读ACK跟DPID的时候需要将GPIO的管教模式切换麻  如推挽输出->上拉输入
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 04:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表