aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/nRF5_SDK_15.0.0_a53641a/examples/peripheral/radio_test/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/nRF5_SDK_15.0.0_a53641a/examples/peripheral/radio_test/main.c')
-rw-r--r--thirdparty/nRF5_SDK_15.0.0_a53641a/examples/peripheral/radio_test/main.c502
1 files changed, 502 insertions, 0 deletions
diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/examples/peripheral/radio_test/main.c b/thirdparty/nRF5_SDK_15.0.0_a53641a/examples/peripheral/radio_test/main.c
new file mode 100644
index 0000000..c449ce6
--- /dev/null
+++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/examples/peripheral/radio_test/main.c
@@ -0,0 +1,502 @@
+/**
+ * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ * Semiconductor ASA integrated circuit in a product or a software update for
+ * such product, must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ * Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ * engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+*
+* @defgroup nrf_radio_test_example_main main.c
+* @{
+* @ingroup nrf_radio_test_example
+* @brief Radio Test Example Application main file.
+*
+* This file contains the source code for a sample application using the NRF_RADIO, and is controlled through the serial port.
+*
+*/
+
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include "bsp.h"
+#include "nrf.h"
+#include "radio_test.h"
+#include "app_uart.h"
+#include "app_error.h"
+#include "nordic_common.h"
+
+static uint8_t mode_ = RADIO_MODE_MODE_Nrf_2Mbit;
+static uint8_t txpower_ = RADIO_TXPOWER_TXPOWER_0dBm;
+static int channel_start_ = 0;
+static int channel_end_ = 80;
+static int delayms_ = 10;
+
+static bool sweep = false;
+
+typedef enum
+{
+ RADIO_TEST_NOP, /**< No test running. */
+ RADIO_TEST_TXCC, /**< TX constant carrier. */
+ RADIO_TEST_TXMC, /**< TX modulated carrier. */
+ RADIO_TEST_TXSWEEP, /**< TX sweep. */
+ RADIO_TEST_RXC, /**< RX constant carrier. */
+ RADIO_TEST_RXSWEEP, /**< RX sweep. */
+} radio_tests_t;
+
+
+#define BELL 7 // Bell
+
+#define UART_TX_BUF_SIZE 512 /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE 1 /**< UART RX buffer size. */
+
+void uart_error_handle(app_uart_evt_t * p_event)
+{
+ if (p_event->evt_type == APP_UART_COMMUNICATION_ERROR)
+ {
+ APP_ERROR_HANDLER(p_event->data.error_communication);
+ }
+ else if (p_event->evt_type == APP_UART_FIFO_ERROR)
+ {
+ APP_ERROR_HANDLER(p_event->data.error_code);
+ }
+}
+
+/** @brief Function for configuring all peripherals used in this example.
+*/
+static void init(void)
+{
+ NRF_RNG->TASKS_START = 1;
+
+ // Start 16 MHz crystal oscillator
+ NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
+ NRF_CLOCK->TASKS_HFCLKSTART = 1;
+
+ // Wait for the external oscillator to start up
+ while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0)
+ {
+ // Do nothing.
+ }
+}
+
+
+/** @brief Function for outputting usage info to the serial port.
+*/
+static void help(void)
+{
+ printf("Usage:\r\n");
+ printf("a: Enter start channel for sweep/channel for constant carrier\r\n");
+ printf("b: Enter end channel for sweep\r\n");
+ printf("c: Start TX carrier\r\n");
+ printf("d: Enter time on each channel (1ms-99ms)\r\n");
+ printf("e: Cancel sweep/carrier\r\n");
+ printf("m: Enter data rate\r\n");
+ printf("o: Start modulated TX carrier\r\n");
+ printf("p: Enter output power\r\n");
+ printf("s: Print current delay, channels and so on\r\n");
+ printf("r: Start RX sweep\r\n");
+ printf("t: Start TX sweep\r\n");
+ printf("x: Start RX carrier\r\n");
+}
+
+
+/** @brief Function for reading the data rate.
+*/
+void get_datarate(void)
+{
+ uint8_t c;
+
+#ifndef NRF52840_XXAA
+ printf("Enter data rate ('0'=250 Kbit/s, '1'=1 Mbit/s and '2'=2 Mbit/s):\r\n");
+#else
+ printf("Enter data rate ('1'=1 Mbit/s and '2'=2 Mbit/s):\r\n");
+#endif //NRF52840_XXAA
+ while (true)
+ {
+ scanf("%c",&c);
+ if ((c >= '0') && (c <= '2'))
+ {
+ printf("%c\r\n",c);
+ break;
+ }
+ else
+ {
+ printf("%c\r\n",BELL);
+ }
+ }
+
+ if (c == '1')
+ {
+ mode_ = RADIO_MODE_MODE_Nrf_1Mbit;
+ }
+#ifndef NRF52840_XXAA
+ else if (c == '0')
+ {
+ mode_ = RADIO_MODE_MODE_Nrf_250Kbit;
+ }
+#endif //NRF52840_XXAA
+ else
+ {
+ mode_ = RADIO_MODE_MODE_Nrf_2Mbit;
+ }
+ printf("\r\n");
+}
+
+
+/** @brief Function for reading the output power.
+*/
+void get_power(void)
+{
+ uint8_t c;
+
+ printf("Enter output power ('0'=+4 dBm, '1'=0 dBm,...,'7'=-30 dBm):\r\n");
+ while (true)
+ {
+ scanf("%c",&c);
+ if ((c >= '0') && (c <= '7'))
+ {
+ UNUSED_VARIABLE(app_uart_put(c));
+ break;
+ }
+ else
+ {
+ UNUSED_VARIABLE(app_uart_put(BELL));
+ }
+ }
+
+ switch (c)
+ {
+ case '0':
+ txpower_ = RADIO_TXPOWER_TXPOWER_Pos4dBm;
+ break;
+
+ case '1':
+ txpower_ = RADIO_TXPOWER_TXPOWER_0dBm;
+ break;
+
+ case '2':
+ txpower_ = RADIO_TXPOWER_TXPOWER_Neg4dBm;
+ break;
+
+ case '3':
+ txpower_ = RADIO_TXPOWER_TXPOWER_Neg8dBm;
+ break;
+
+ case '4':
+ txpower_ = RADIO_TXPOWER_TXPOWER_Neg12dBm;
+ break;
+
+ case '5':
+ txpower_ = RADIO_TXPOWER_TXPOWER_Neg16dBm;
+ break;
+
+ case '6':
+ txpower_ = RADIO_TXPOWER_TXPOWER_Neg20dBm;
+ break;
+
+ case '7':
+ // fall through
+
+ default:
+ txpower_ = RADIO_TXPOWER_TXPOWER_Neg30dBm;
+ break;
+ }
+ printf("\r\n");
+}
+
+
+/** @brief Function for printing parameters to the serial port.
+*/
+void print_parameters(void)
+{
+ printf("Parameters:\r\n");
+ switch (mode_)
+ {
+#ifndef NRF52840_XXAA
+ case RADIO_MODE_MODE_Nrf_250Kbit:
+ printf("Data rate...........: 250 Kbit/s\r\n");
+ break;
+#endif //NRF52840_XXAA
+
+ case RADIO_MODE_MODE_Nrf_1Mbit:
+ printf("Data rate...........: 1 Mbit/s\r\n");
+ break;
+
+ case RADIO_MODE_MODE_Nrf_2Mbit:
+ printf("Data rate...........: 2 Mbit/s\r\n");
+ break;
+ }
+
+ switch (txpower_)
+ {
+ case RADIO_TXPOWER_TXPOWER_Pos4dBm:
+ printf("TX Power............: +4 dBm\r\n");
+ break;
+
+ case RADIO_TXPOWER_TXPOWER_0dBm:
+ printf("TX Power............: 0 dBm\r\n");
+ break;
+
+ case RADIO_TXPOWER_TXPOWER_Neg4dBm:
+ printf("TX Power............: -4 dBm\r\n");
+ break;
+
+ case RADIO_TXPOWER_TXPOWER_Neg8dBm:
+ printf("TX Power............: -8 dBm\r\n");
+ break;
+
+ case RADIO_TXPOWER_TXPOWER_Neg12dBm:
+ printf("TX Power............: -12 dBm\r\n");
+ break;
+
+ case RADIO_TXPOWER_TXPOWER_Neg16dBm:
+ printf("TX Power............: -16 dBm\r\n");
+ break;
+
+ case RADIO_TXPOWER_TXPOWER_Neg20dBm:
+ printf("TX Power............: -20 dBm\r\n");
+ break;
+
+ case RADIO_TXPOWER_TXPOWER_Neg30dBm:
+ printf("TX Power............: -30 dBm\r\n");
+ break;
+
+ default:
+ // No implementation needed.
+ break;
+
+ }
+ printf("(Start) Channel.....: %d\r\n",channel_start_);
+ printf("End Channel.........: %d\r\n",channel_end_);
+ printf("Time on each channel: %d\r\n",delayms_);
+ printf(" ms\r\n");
+}
+
+
+/** @brief Function for main application entry.
+ */
+int main(void)
+{
+ uint32_t err_code;
+ radio_tests_t test = RADIO_TEST_NOP;
+ radio_tests_t cur_test = RADIO_TEST_NOP;
+
+ init();
+ const app_uart_comm_params_t comm_params =
+ {
+ RX_PIN_NUMBER,
+ TX_PIN_NUMBER,
+ RTS_PIN_NUMBER,
+ CTS_PIN_NUMBER,
+ APP_UART_FLOW_CONTROL_DISABLED,
+ false,
+ UART_BAUDRATE_BAUDRATE_Baud115200
+ };
+
+ APP_UART_FIFO_INIT(&comm_params,
+ UART_RX_BUF_SIZE,
+ UART_TX_BUF_SIZE,
+ uart_error_handle,
+ APP_IRQ_PRIORITY_LOWEST,
+ err_code);
+
+ APP_ERROR_CHECK(err_code);
+ printf("RF Test\r\n");
+ NVIC_EnableIRQ(TIMER0_IRQn);
+ __enable_irq();
+ while (true)
+ {
+ uint8_t control;
+ scanf("%c",&control);
+ switch (control)
+ {
+ case 'a':
+ while (true)
+ {
+ printf("Enter start channel (two decimal digits, 00 to 80):\r\n");
+ scanf("%d",&channel_start_);
+ if ((channel_start_ <= 80)&&(channel_start_ >= 0))
+ {
+ printf("%d\r\n", channel_start_);
+ break;
+ }
+
+ printf("Channel must be between 0 and 80\r\n");
+ }
+ test = cur_test;
+ break;
+
+ case 'b':
+ while (true)
+ {
+ printf("Enter end channel (two decimal digits, 00 to 80):\r\n");
+ scanf("%d",&channel_end_);
+ if ((channel_end_ <= 80)&&(channel_start_ >= 0))
+ {
+ printf("%d\r\n", channel_end_);
+ break;
+ }
+ printf("Channel must be between 0 and 80\r\n");
+ }
+ test = cur_test;
+ break;
+
+ case 'c':
+ test = RADIO_TEST_TXCC;
+ break;
+
+ case 'd':
+ while (true)
+ {
+ printf("Enter delay in ms (two decimal digits, 01 to 99):\r\n");
+ scanf("%d",&delayms_);
+ if ((delayms_ > 0) && (delayms_ < 100))
+ {
+ printf("%d\r\n", delayms_);
+ break;
+ }
+ printf("Delay must be between 1 and 99\r\n");
+ }
+ test = cur_test;
+ break;
+
+ case 'e':
+ radio_sweep_end();
+ cur_test = RADIO_TEST_NOP;
+ break;
+
+ case 'm':
+ get_datarate();
+ test = cur_test;
+ break;
+
+ case 'o':
+ test = RADIO_TEST_TXMC;
+ printf("TX modulated carrier\r\n");
+ break;
+
+ case 'p':
+ get_power();
+ test = cur_test;
+ break;
+
+ case 'r':
+ test = RADIO_TEST_RXSWEEP;
+ printf("RX Sweep\r\n");
+ break;
+
+ case 's':
+ print_parameters();
+ break;
+
+ case 't':
+ test = RADIO_TEST_TXSWEEP;
+ printf("TX Sweep\r\n");
+ break;
+
+ case 'x':
+ test = RADIO_TEST_RXC;
+ printf("RX constant carrier\r\n");
+ break;
+
+ case 'h':
+ help();
+ break;
+
+ default:
+ // No implementation needed
+ break;
+ }
+
+ switch (test)
+ {
+ case RADIO_TEST_TXCC:
+ if (sweep)
+ {
+ radio_sweep_end();
+ sweep = false;
+ }
+ radio_tx_carrier(txpower_, mode_, channel_start_);
+ cur_test = test;
+ test = RADIO_TEST_NOP;
+ break;
+
+ case RADIO_TEST_TXMC:
+ if (sweep)
+ {
+ radio_sweep_end();
+ sweep = false;
+ }
+ radio_modulated_tx_carrier(txpower_, mode_, channel_start_);
+ cur_test = test;
+ test = RADIO_TEST_NOP;
+ break;
+
+ case RADIO_TEST_TXSWEEP:
+ radio_tx_sweep_start(txpower_, mode_, channel_start_, channel_end_, delayms_);
+ sweep = true;
+ cur_test = test;
+ test = RADIO_TEST_NOP;
+ break;
+
+ case RADIO_TEST_RXC:
+ if (sweep)
+ {
+ radio_sweep_end();
+ sweep = false;
+ }
+ radio_rx_carrier(mode_, channel_start_);
+ cur_test = test;
+ test = RADIO_TEST_NOP;
+ break;
+
+ case RADIO_TEST_RXSWEEP:
+ radio_rx_sweep_start(mode_, channel_start_, channel_end_, delayms_);
+ sweep = true;
+ cur_test = test;
+ test = RADIO_TEST_NOP;
+ break;
+
+ case RADIO_TEST_NOP:
+ // Fall through.
+ default:
+ // No implementation needed.
+ break;
+ }
+ }
+}
+
+/** @} */