通过 SWD 接口控制 Nordic nRF52

Posted

技术标签:

【中文标题】通过 SWD 接口控制 Nordic nRF52【英文标题】:Controlling Nordic nRF52 via SWD interface 【发布时间】:2017-06-17 14:26:27 【问题描述】:

我正在尝试对 Nordic Semi MCU 进行编程/暂停/启动/擦除等。这是 nRF52 中的 ARM-Cortex M4。我正在使用芯片的 SWD 引脚,如果我将商业 J-Link 与 nrfjprog 命令行工具或他们的 Segger windows 实用程序一起使用,则可以实现这一点。

但是,我想通过第二个 MCU 的 GPIO 引脚从另一个 MCU 控制 nRF52,并通过将 3 根线连接到 nRF52 - SWCLK、SWDIO 和 GND 来编写我自己的 SWD 驱动程序。

这些线现在由主机驱动,我正在使用 SWD 的 ARM 参考手册。对于我想要实现的目标,该协议相对简单。以下PDF有一些细节:http://hackipedia.org/Hardware/CPU/ARM/pdf,%20Cortex/IHI0031A_ARM_debug_interface_v5.pdf和https://www.silabs.com/Support%20Documents/TechnicalDocs/AN0062.pdf

我设法发送了初始数据包标头(START、APnDP、Read、Addr、Stop、Parity 等)。然而,在那之后,SWDIO 就再也没有转过身来。我的主机 MCU 浮动 SWDIO 并准备好接收输入。但是,nRF52 似乎永远不会通过 ACK 开始驱动 SWDIO 线。

我想这一定是因为 NRF52 从来没有看到数据包头或者不喜欢我发送的东西,但我不知道是什么。有没有人经历过这种情况或有任何线索为什么会发生这种情况?顺便说一下,SWDCLK 转换发生在 100 kHZ。 (时钟周期为 10 us)。

任何帮助表示赞赏。

【问题讨论】:

您是否在初始数据包之前发出了 SWD 唤醒序列(SWDIO=1 的 50 个 SWCLK 周期)? 谢谢@Nipo。我发现了这个问题。我必须先发送 JTAG-to-SWD 字符串,然后再读取 DP ID 寄存器。 【参考方案1】:

对于其他来这里的人来说,我的诀窍是执行以下操作:

发送 50+ 个 SWDIO 为高的时钟 发送 JTAG 到 SWD 开关模式 读取 DP ID 寄存器 之后我就可以得到北欧的回应了。

【讨论】:

以上是关于通过 SWD 接口控制 Nordic nRF52的主要内容,如果未能解决你的问题,请参考以下文章

NORDIC内核ARM蓝牙芯片NRF51802/NRF51822

一款低功耗,低成本NORDIC NRF51802

Nordic nRF51/nRF52硬件开发流程说明

Nordic Semiconductor nRF52832 蓝牙智能多协议单芯片解决方案荣获《中国电子商情》编辑选择奖

Thread组网一:Nordic nRF21540-EK烧写hex文件进行ping测试

NRF52833蓝牙5.1可用于105℃环境温度的Nordic蓝牙5.1 SoC能实现更广泛的并发多协议低功耗蓝牙mesh和Thread应用