- static int32_t init_sensor(void)
- {
- if (cyhal_spi_init(&spi_obj,
- 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_RSLT_SUCCESS)
- {
- printf("[MSG] ERROR: cyhal_spi_init failed\n");
- return -1;
- }
- /* 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 the data rate to 25 Mbps */
- if (cyhal_spi_set_frequency(&spi_obj, XENSIV_BGT60TRXX_SPI_FREQUENCY) != CY_RSLT_SUCCESS)
- {
- printf("[MSG] ERROR: cyhal_spi_set_frequency failed\n");
- return -1;
- }
- #if defined (TARGET_APP_CYSBSYSKIT_DEV_01) || (TARGET_APP_KIT_BGT60TR13C_EMBEDD)
- /* Enable LDO */
- if (cyhal_gpio_init(PIN_XENSIV_BGT60TRXX_LDO_EN,
- CYHAL_GPIO_DIR_OUTPUT,
- CYHAL_GPIO_DRIVE_STRONG,
- true) != CY_RSLT_SUCCESS)
- {
- printf("[MSG] ERROR: LDO_EN cyhal_gpio_init failed\n");
- return -1;
- }
- #endif
- /* Wait LDO stable */
- (void)cyhal_system_delay_ms(5);
- if (xensiv_bgt60trxx_mtb_init(&bgt60_obj,
- &spi_obj,
- PIN_XENSIV_BGT60TRXX_SPI_CSN,
- PIN_XENSIV_BGT60TRXX_RSTN,
- register_list_micro_only, // default config with macro settings
- XENSIV_BGT60TRXX_CONF_NUM_REGS_MACRO) != CY_RSLT_SUCCESS)
- {
- printf("[MSG] ERROR: xensiv_bgt60trxx_mtb_init failed\n");
- return -1;
- }
- if (xensiv_bgt60trxx_mtb_interrupt_init(&bgt60_obj,
- NUM_SAMPLES_PER_FRAME*2,
- PIN_XENSIV_BGT60TRXX_IRQ,
- GPIO_INTERRUPT_PRIORITY,
- xensiv_bgt60trxx_interrupt_handler,
- NULL) != CY_RSLT_SUCCESS)
- {
- printf("[MSG] ERROR: xensiv_bgt60trxx_mtb_interrupt_init failed\n");
- return -1;
- }
- return 0;
- }
程序主要在main task中进行处理,其主要包括:
* 1。创建一个定时器来切换用户LED
* 2。创建处理RTOS任务
* 3。初始化传感器和led的硬件接口
* 4。初始化雷达设备
* 5。在无限循环中
* -等待来自雷达设备的中断,表明数据可用性
* -读取数据,将其转换为浮点数并通知处理任务
代码如下:
- static __NO_RETURN void main_task(void *pvParameters)
- {
- (void)pvParameters;
- uint32_t sz;
- uint16_t *data_buff = NULL;
- cy_rslt_t result;
- XENSIV_RADAR_PRESENCE_TIMESTAMP last_timestamp = 0;
- timer_handler = xTimerCreate("timer", pdMS_TO_TICKS(1000), pdTRUE, NULL, timer_callbak);
- if (timer_handler == NULL)
- {
- CY_ASSERT(0);
- }
- if (xTimerStart(timer_handler, 0) != pdPASS)
- {
- CY_ASSERT(0);
- }
- if (xTaskCreate(processing_task, PROCESSING_TASK_NAME, PROCESSING_TASK_STACK_SIZE, NULL, PROCESSING_TASK_PRIORITY, &processing_task_handler) != pdPASS)
- {
- CY_ASSERT(0);
- }
- if (init_sensor() != 0)
- {
- CY_ASSERT(0);
- }
- xensiv_bgt60trxx_device_t device_type = xensiv_bgt60trxx_get_device(&bgt60_obj.dev);
- print_welcome_message(device_type);
- if (init_leds () != 0)
- {
- CY_ASSERT(0);
- }
- mgr.subscribe(main_task_handler);
- /* Initialize the initial state of ce_app_state */
- ce_app_state.last_reported_event.state = XENSIV_RADAR_PRESENCE_STATE_ABSENCE;
- ce_app_state.last_reported_event.range_bin = 0;
- ce_app_state.last_reported_event.timestamp = 0;
- if (xensiv_bgt60trxx_start_frame(&bgt60_obj.dev, true) != XENSIV_BGT60TRXX_STATUS_OK)
- {
- CY_ASSERT(0);
- }
- for(;;)
- {
- /* Wait for the GPIO interrupt to indicate that another slice is available */
- ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
- mgr.read_from_buffer(1, &data_buff, &sz);
- /* Data preprocessing */
- uint16_t *bgt60_buffer_ptr = data_buff;
- float32_t *frame_ptr = &frame[0];
- for (int32_t sample = 0; sample < NUM_SAMPLES_PER_FRAME * 2; ++sample)
- {
- *frame_ptr++ = ((float32_t)(*bgt60_buffer_ptr++) / 4096.0F);
- }
- mgr.ack_data_read(1);
- /* calculate the average of the chirps first */
- arm_fill_f32(0, avg_chirp, NUM_SAMPLES_PER_CHIRP);
- for (int chirp = 0; chirp < NUM_CHIRPS_PER_FRAME * 2; chirp++)
- {
- arm_add_f32(avg_chirp, &frame[NUM_SAMPLES_PER_CHIRP * chirp], avg_chirp, NUM_SAMPLES_PER_CHIRP);
- }
- arm_scale_f32(avg_chirp, 1.0f / NUM_CHIRPS_PER_FRAME, avg_chirp, NUM_SAMPLES_PER_CHIRP);
- if(ce_app_state.last_reported_event.timestamp != last_timestamp)
- {
- last_timestamp = ce_app_state.last_reported_event.timestamp; // save latest timestamp
- result = radar_config_optimize(ce_app_state.last_reported_event.state);
- if(result != ESTATUS_SUCCESS)
- {
- printf("[MSG] ERROR: radar_config_optimize failed with error %" PRIi32 "\n", result);
- CY_ASSERT(0);
- }
- }
- /* Tell processing task to take over */
- xTaskNotifyGive(processing_task_handler);
- }
- }
上述main task注册在main函数中:
- /* Create the RTOS task */
- if (xTaskCreate(main_task, MAIN_TASK_NAME, MAIN_TASK_STACK_SIZE, NULL, MAIN_TASK_PRIORITY, &main_task_handler) != pdPASS)
- {
- CY_ASSERT(0);
- }
- /* Start the FreeRTOS scheduler. */
- vTaskStartScheduler();
烧录后,从远处靠近开发板,可以看到串口输出:
- current presence: 0, current setting: 10 Hz
- new setting: micro
- [INFO] macro presence 5 139112
- current presence: 0, current setting: 200 Hz
- new setting: macro
- [INFO] micro presence 5 144492
- current presence: 1, current setting: 10 Hz
- [INFO] micro presence 3 144692
- current presence: 1, current setting: 10 Hz