infineonのModusToolboxを使用し、「XENSIV™ BGT60TRxx Radar Sensor」に示す手順に従って、S2GO RADAR BGT60LTR11のテストを行います。

S2GO RADAR BGT60LTR11

S2GO RADAR BGT60LTR11は、60Ghz Radar センサーで、動作を検出できます。

  • 3.3V電源
  • 0.5m – 7mまでの距離で検出
  • 検出するとLEDが点滅
  • Infineon’s Shield2Go formatを備えた48.80 mm x 24.1 mmボード

Radar Development Kitのインストール

Infineon Developer Centerを使ってRadar Development Kitをインストールします。

  1. Infineon Developer Center Launcher」からInfineon Developer Centerをダウンロードしてインストールします。
  2. インストールしたInfineon Developer Centerの「Manage tools」タブから、 Radar Development Kitをインストールします。
  3. インストールしたRadar Development Kitを起動して、メニュー「Software」をクリックします。スクロールして「Tools」をダウンロードします。Tool「bgt60-configurator-cli」が取得できます。
  4. 次に示すjson形式の次のconfiguration file「presence_radar_settings.json」を作成します。
  5. presence_radar_settings.json

    {
        "device_config": {
            "fmcw_single_shape": {
                "rx_antennas": [1], 
                "tx_antennas": [1], 
                "tx_power_level": 31, 
                "if_gain_dB": 60, 
                "lower_frequency_Hz": 61020098000, 
                "upper_frequency_Hz": 61479902000, 
                "num_chirps_per_frame": 1, 
                "num_samples_per_chirp": 128, 
                "chirp_repetition_time_s": 7e-05, 
                "frame_repetition_time_s": 5e-3, 
                "sample_rate_Hz": 2330000
            }
        }
    }
    
  6. 取得した「bgt60-configurator-cli を使って、configuration file「presence_radar_settings.json」からregister file「presence_radar_settings.h」を作成します。
  7. bgt60-configurator-cli -c presence_radar_settings.json -o presence_radar_settings.h
    

S2GO RADAR BGT60LTR11テストアプリの作成

次の手順でModusToolboxを使ってS2GO RADAR BGT60LTR11テストアプリ「BGT60LTR11_Test」を作成します。

  1. Quick PanelからNew Applicationを選択して、Project Creatorを起動します。
  2. Project Creator で「PSoC™ 6 BSPs 」より「PSoC 62S2-43012 」を選択し、「Next」ボタンをクリックします。
  3. 次のようにサンプルコード「Getting Started」から「Empty PSoC6 App」を選択して、Application Nameに「OLEDTest」を設定して 「Create」ボタンをクリックします。
  4. Quick PanelからLibrary Managerを選択して、表示されたダイアログの「Add Library」ボタンをクリックし、表示されたダイアログの「Peripheral」から「sensor-xensiv-bgt60trxx」をチェックして、「OK」ボタンをクリックします。
  5. 作成された「main.c」を次に示すコードに変更し、同じディレクトリに上記で作成した「presence_radar_settings.h」をコピーします。
  6. main.c

    #include <inttypes.h>
    #include "cyhal.h"
    #include "cybsp.h"
    #include "cy_retarget_io.h"
    #include "xensiv_bgt60trxx_mtb.h"
    #define XENSIV_BGT60TRXX_CONF_IMPL
    #include "presence_radar_settings.h"
    /*******************************************************************************
    * Macros
    *******************************************************************************/
    /* sensor SPI interface */
    #define PIN_XENSIV_BGT60TRXX_SPI_SCLK       CYBSP_SPI_CLK
    #define PIN_XENSIV_BGT60TRXX_SPI_MOSI       CYBSP_SPI_MOSI
    #define PIN_XENSIV_BGT60TRXX_SPI_MISO       CYBSP_SPI_MISO
    #define PIN_XENSIV_BGT60TRXX_SPI_CSN        CYBSP_SPI_CS
    /* sensor interrupt output pin */
    //******#define PIN_XENSIV_BGT60TRXX_IRQ            CYBSP_GPIO10
    #define PIN_XENSIV_BGT60TRXX_IRQ           CYBSP_J2_10
    /* sensor HW reset pin */
    //******#define PIN_XENSIV_BGT60TRXX_RSTN           CYBSP_GPIO11
    #define PIN_XENSIV_BGT60TRXX_RSTN           CYBSP_SPI_CS
    /* enable 1V8 LDO on radar wingboard*/
    //*****#define PIN_XENSIV_BGT60TRXX_LDO_EN         CYBSP_GPIO5
    #define PIN_XENSIV_BGT60TRXX_LDO_EN         CYBSP_POT
    #define XENSIV_BGT60TRXX_SPI_FREQUENCY      (25000000UL)
    #define NUM_SAMPLES_PER_FRAME               (XENSIV_BGT60TRXX_CONF_NUM_RX_ANTENNAS *\
                                                 XENSIV_BGT60TRXX_CONF_NUM_CHIRPS_PER_FRAME *\
                                                 XENSIV_BGT60TRXX_CONF_NUM_SAMPLES_PER_CHIRP)
    /*******************************************************************************
    * Global variables
    *******************************************************************************/
    static cyhal_spi_t cyhal_spi;
    static xensiv_bgt60trxx_mtb_t sensor;
    static volatile bool data_available = false;
    /* Allocate enough memory for the radar dara frame. */
    static uint16_t samples[NUM_SAMPLES_PER_FRAME];
    /* Interrupt handler to react on sensor indicating the availability of new data */
    #if defined(CYHAL_API_VERSION) && (CYHAL_API_VERSION >= 2)
    void xensiv_bgt60trxx_mtb_interrupt_handler(void *args, cyhal_gpio_event_t event)
    #else
    void xensiv_bgt60trxx_mtb_interrupt_handler(void *args, cyhal_gpio_irq_event_t event)
    #endif
    {
        CY_UNUSED_PARAMETER(args);
        CY_UNUSED_PARAMETER(event);
        data_available = true;
    }
    int main(void)
    {
        cy_rslt_t result = CY_RSLT_SUCCESS;
        /* Initialize the device and board peripherals. */
        result = cybsp_init();
        CY_ASSERT(result == CY_RSLT_SUCCESS);
        __enable_irq();
        /* Initialize retarget-io to use the debug UART port. */
        result = cy_retarget_io_init(CYBSP_DEBUG_UART_TX, CYBSP_DEBUG_UART_RX, CY_RETARGET_IO_BAUDRATE);
        CY_ASSERT(result == CY_RSLT_SUCCESS);
        printf("XENSIV BGT60TRxx Example\r\n");
        /* Initialize the SPI interface to BGT60. */
        result = cyhal_spi_init(&cyhal_spi,
                                PIN_XENSIV_BGT60TRXX_SPI_MOSI,
                                PIN_XENSIV_BGT60TRXX_SPI_MISO,
                                PIN_XENSIV_BGT60TRXX_SPI_SCLK,
                                NC,
                                NULL,
                                8,
                                CYHAL_SPI_MODE_00_MSB,
                                false);
        CY_ASSERT(result == CY_RSLT_SUCCESS);
        /* Reduce drive strength to improve EMI */
        Cy_GPIO_SetSlewRate(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_MOSI),
                            CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_MOSI), CY_GPIO_SLEW_FAST);
        Cy_GPIO_SetDriveSel(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_MOSI),
                            CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_MOSI), CY_GPIO_DRIVE_1_8);
        Cy_GPIO_SetSlewRate(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_SCLK),
                            CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_SCLK), CY_GPIO_SLEW_FAST);
        Cy_GPIO_SetDriveSel(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_SCLK),
                            CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_SCLK), CY_GPIO_DRIVE_1_8);
        /* Set SPI data rate to communicate with sensor */
        result = cyhal_spi_set_frequency(&cyhal_spi, XENSIV_BGT60TRXX_SPI_FREQUENCY);
        CY_ASSERT(result == CY_RSLT_SUCCESS);
        /* Enable the LDO. */
        result = cyhal_gpio_init(PIN_XENSIV_BGT60TRXX_LDO_EN,
                                 CYHAL_GPIO_DIR_OUTPUT,
                                 CYHAL_GPIO_DRIVE_STRONG,
                                 true);
        CY_ASSERT(result == CY_RSLT_SUCCESS);
        /* Wait LDO stable */
        (void)cyhal_system_delay_ms(5);
        result = xensiv_bgt60trxx_mtb_init(&sensor,
                                           &cyhal_spi,
                                           PIN_XENSIV_BGT60TRXX_SPI_CSN,
                                           PIN_XENSIV_BGT60TRXX_RSTN,
                                           register_list,
                                           XENSIV_BGT60TRXX_CONF_NUM_REGS);
        CY_ASSERT(result == CY_RSLT_SUCCESS);
        /* The sensor will generate an interrupt once the sensor FIFO level is
           NUM_SAMPLES_PER_FRAME */
        result = xensiv_bgt60trxx_mtb_interrupt_init(&sensor,
                                                     NUM_SAMPLES_PER_FRAME,
                                                     PIN_XENSIV_BGT60TRXX_IRQ,
                                                     CYHAL_ISR_PRIORITY_DEFAULT,
                                                     xensiv_bgt60trxx_mtb_interrupt_handler,
                                                     NULL);
        CY_ASSERT(result == CY_RSLT_SUCCESS);
        /* Enable sensor data test mode. The data received on antenna RX1 will be overwritten by 
           a deterministic sequence of data generated by the test pattern generator */
        if (xensiv_bgt60trxx_enable_data_test_mode(&sensor.dev, true) != XENSIV_BGT60TRXX_STATUS_OK)
        {
            CY_ASSERT(0);
        }
        if (xensiv_bgt60trxx_start_frame(&sensor.dev, true) != XENSIV_BGT60TRXX_STATUS_OK)
        {
            CY_ASSERT(0);
        }
        uint32_t frame_idx = 0;
        uint16_t test_word = XENSIV_BGT60TRXX_INITIAL_TEST_WORD;
        for(;;)
        {
            /* Wait for the radar device to indicate the availability of the data to fetch. */
            while (data_available == false);
            data_available = false;
            if (xensiv_bgt60trxx_get_fifo_data(&sensor.dev, samples,
                                               NUM_SAMPLES_PER_FRAME) == XENSIV_BGT60TRXX_STATUS_OK)
            {
                /* Check received data */
                for (int32_t sample_idx = 0; sample_idx < NUM_SAMPLES_PER_FRAME; ++sample_idx)
                {
                        if (test_word != samples[sample_idx])
                        {
                            printf("Frame %" PRIu32 " error detected. "
                                   "Expected: %" PRIu16 ". "
                                   "Received: %" PRIu16 "\n",
                                   frame_idx, test_word, samples[sample_idx]);
                            CY_ASSERT(0);
                        }
                        // Generate next test_word
                        test_word = xensiv_bgt60trxx_get_next_test_word(test_word);
                }
            }
            printf("Frame %" PRIu32 " received correctly\n", frame_idx);
            frame_idx++;
        }
    }
    

PSoC 62S2 Wi-Fi BTパイオニアキットとS2GO RADAR BGT60LTR11の接続

S2GO RADAR BGT60LTR11テストアプリの実行

次の手順で作成したS2GO RADAR BGT60LTR11テストアプリ「BGT60LTR11_Test」をビルドし、PSoC 62S2 Wi-Fi BTパイオニアキットで実行します。

  1. シリアル端末(Tera Term)を使って、PSoC 62S2 Wi-Fi BTパイオニアキットに接続したCOMポートに、転送速度「115200」で接続します。