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:
- Reading from the J-Link CDC UART port (COM4) via Windows PowerShell
- 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);
}
}