DWM3001C UWB Signal Propagation Detection — Cannot Receive Firmware Output on PC

I am using the DWM3001CDK development kit (which has a DWM3001C module built in) and I want to use it for UWB signal propagation detection — not ranging, not anchor-tag distance measurement, but detecting motion signatures from reflected UWB signals.

Before doing any of that, I first want to verify basic connectivity — simply getting the module to send a string like “HELLO FROM UWB” to my PC software to confirm the connection is working.

I successfully built and flashed firmware using SEGGER Embedded Studio V8.28, but I cannot receive any output from the module. I have tried:

  1. Reading from the J-Link CDC UART port (COM4) via Windows PowerShell
  2. Reading via SEGGER RTT Viewer

In both cases nothing is received. I also tried sending simulated DATA frames every 100ms (no real UWB involved) and still nothing arrives on the PC side.

I am not sure if the problem is:

  • Wrong UART GPIO pin mapping for the DWM3001CDK board
  • A firmware/code error
  • Or a misunderstanding of how data flows from the nRF52833 to the PC via J-Link CDC

Has anyone successfully sent UART or RTT output from a DWM3001CDK to a PC? What are the correct TX/RX pin numbers for the J-Link CDC UART interface on this board?

My code:
/**

  • main_hello_uart.c
  • Sends “HELLO FROM UWB” then simulated DATA frames via UART
  • Change UART_TX_PIN and UART_RX_PIN to your board’s correct pins
    */

#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include “nrf.h”
#include “nrf_delay.h”

#define UART_TX_PIN 6 /* ← CHANGE THIS to correct pin /
#define UART_RX_PIN 8 /
← CHANGE THIS to correct pin */

#define LABEL_STANDING 1
#define LABEL_SITTING 2
#define LABEL_BENDING 3
#define LABEL_LYING 4
#define LABEL_FALLING 5
#define STREAM_PERIOD_MS 100

static uint32_t m_timestamp_ms = 0;
static float m_range_m = 1.5f;
static float m_energy = 0.05f;
static float m_prev_range = 1.5f;
static uint8_t m_label = LABEL_STANDING;
static uint32_t sim_step = 0;

static void uart_init(void)
{
NRF_GPIO->PIN_CNF[UART_TX_PIN] =
(GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos) |
(GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)|
(GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
(GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)|
(GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);

NRF_GPIO->PIN_CNF[UART_RX_PIN] =
    (GPIO_PIN_CNF_DIR_Input      << GPIO_PIN_CNF_DIR_Pos)  |
    (GPIO_PIN_CNF_INPUT_Connect  << GPIO_PIN_CNF_INPUT_Pos)|
    (GPIO_PIN_CNF_PULL_Disabled  << GPIO_PIN_CNF_PULL_Pos) |
    (GPIO_PIN_CNF_DRIVE_S0S1     << GPIO_PIN_CNF_DRIVE_Pos)|
    (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);

NRF_UART0->PSELTXD  = UART_TX_PIN;
NRF_UART0->PSELRXD  = UART_RX_PIN;
NRF_UART0->PSELCTS  = 0xFFFFFFFF;
NRF_UART0->PSELRTS  = 0xFFFFFFFF;
NRF_UART0->BAUDRATE = 0x01D7E000;  /* 115200 baud */
NRF_UART0->CONFIG   = 0;
NRF_UART0->ENABLE   = 4;
NRF_UART0->TASKS_STARTTX = 1;
NRF_UART0->TASKS_STARTRX = 1;

}

static void uart_put(uint8_t byte)
{
NRF_UART0->TXD = byte;
while (NRF_UART0->EVENTS_TXDRDY == 0);
NRF_UART0->EVENTS_TXDRDY = 0;
}

static void uart_print(const char *str)
{
while (*str) { uart_put((uint8_t)(*str)); str++; }
}

static void sim_next_frame(void)
{
sim_step++;
if (sim_step % 200 == 0)
{
m_range_m = 0.4f; m_energy = 0.75f; m_label = LABEL_FALLING;
}
else
{
m_range_m = (sim_step % 100) < 50
? 1.0f + (float)(sim_step % 50) * 0.036f
: 2.8f - (float)(sim_step % 50) * 0.036f;
m_energy = 0.03f + 0.04f * (float)(sim_step % 5);
float d = m_range_m - m_prev_range;
float a = d < 0 ? -d : d;
if (a > 0.08f && m_energy > 0.10f) m_label = LABEL_BENDING;
else if (m_range_m > 2.0f && m_energy < 0.08f) m_label = LABEL_LYING;
else if (m_energy < 0.06f) m_label = LABEL_SITTING;
else m_label = LABEL_STANDING;
}
m_prev_range = m_range_m;
m_timestamp_ms += STREAM_PERIOD_MS;
}

static void send_data_frame(void)
{
char buf[128];
int32_t ri = (int32_t)m_range_m;
int32_t rf = (int32_t)((m_range_m - ri) * 10000.0f);
if (rf < 0) rf = -rf;
int32_t ei = (int32_t)m_energy;
int32_t ef = (int32_t)((m_energy - ei) * 1000000.0f);
if (ef < 0) ef = -ef;
int len = snprintf(buf, sizeof(buf),
“DATA,%lu,%ld.%04ld,%ld.%06ld,0,%u\r\n”,
(unsigned long)m_timestamp_ms,
(long)ri, (long)rf, (long)ei, (long)ef,
(unsigned)m_label);
if (len > 0 && len < (int)sizeof(buf)) uart_print(buf);
}

int main(void)
{
uart_init();
nrf_delay_ms(500);
uart_print(“HELLO FROM UWB\r\n”);
nrf_delay_ms(200);
while (true)
{
sim_next_frame();
send_data_frame();
nrf_delay_ms(STREAM_PERIOD_MS);
}
}

As your question is not about UWB and just running general code on the nRF52, I would recommend posting on Nordic’s forum: https://devzone.nordicsemi.com/

If you are looking to use UWB in a radar mode, note that this chipset does not allow for simultaneous TX and RX.

What firmware sdk are you using?

QANI doesn’t have usb uart support
DW3 does,

For cdk you flash on one port and run on the other

I use the segger ozone debugger and get rtt output without trouble