Compare commits
4 Commits
39cf6068f7
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
| ab74582568 | |||
| b75c99b125 | |||
| 763abb0fcc | |||
| 80d7086d09 |
@@ -50,6 +50,8 @@ extern int imu_read_direct(void);
|
|||||||
extern int imu_read_temperature_x100(uint16_t *temp_x100, float *temp_c);
|
extern int imu_read_temperature_x100(uint16_t *temp_x100, float *temp_c);
|
||||||
extern int imu_fifo_capture_start(void);
|
extern int imu_fifo_capture_start(void);
|
||||||
extern int imu_fifo_capture_stop_and_send_rim(void);
|
extern int imu_fifo_capture_stop_and_send_rim(void);
|
||||||
|
extern int imu_fifo_capture_wait_samples_and_send_rim(uint16_t target_samples, uint32_t timeout_ms);
|
||||||
|
extern void imu_fifo_capture_disable(void);
|
||||||
extern void battery_timer_stop(void);
|
extern void battery_timer_stop(void);
|
||||||
extern void main_timer_start(void);
|
extern void main_timer_start(void);
|
||||||
extern void hw_i2c_init_once(void);
|
extern void hw_i2c_init_once(void);
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ static const CmdEntry m_cmd_table[] = {
|
|||||||
{ "msn?", true, Cmd_msn },
|
{ "msn?", true, Cmd_msn },
|
||||||
{ "mst?", true, Cmd_mst },
|
{ "mst?", true, Cmd_mst },
|
||||||
{ "msp?", true, Cmd_msp },
|
{ "msp?", true, Cmd_msp },
|
||||||
|
{ "mim?", true, Cmd_mim },
|
||||||
|
|
||||||
/* D. Piezo ultrasound */
|
/* D. Piezo ultrasound */
|
||||||
{ "mpa?", true, Cmd_mpa },
|
{ "mpa?", true, Cmd_mpa },
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
#include "dr_piezo.h"
|
#include "dr_piezo.h"
|
||||||
#include "dr_adc121s051.h"
|
#include "dr_adc121s051.h"
|
||||||
#include "led_control.h"
|
#include "led_control.h"
|
||||||
|
#include "../../measurement/piezo/piezo_config.h"
|
||||||
|
|
||||||
static void mtb_send_rim_after_piezo(void)
|
static void mtb_send_rim_after_piezo(void)
|
||||||
{
|
{
|
||||||
@@ -64,48 +65,48 @@ static uint8_t clamp_piezo_freq_option(uint16_t raw_freq)
|
|||||||
|
|
||||||
static uint8_t clamp_piezo_cycles(uint16_t cycles)
|
static uint8_t clamp_piezo_cycles(uint16_t cycles)
|
||||||
{
|
{
|
||||||
if (cycles < 3)
|
if (cycles < PIEZO_CONFIG_CYCLES_MIN)
|
||||||
{
|
{
|
||||||
return 3;
|
return (uint8_t)PIEZO_CONFIG_CYCLES_MIN;
|
||||||
}
|
}
|
||||||
if (cycles > 7)
|
if (cycles > PIEZO_CONFIG_CYCLES_MAX)
|
||||||
{
|
{
|
||||||
return 7;
|
return (uint8_t)PIEZO_CONFIG_CYCLES_MAX;
|
||||||
}
|
}
|
||||||
return (uint8_t)cycles;
|
return (uint8_t)cycles;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t clamp_piezo_averaging(uint16_t averaging)
|
static uint16_t clamp_piezo_averaging(uint16_t averaging)
|
||||||
{
|
{
|
||||||
if (averaging < 1)
|
if (averaging < PIEZO_CONFIG_AVERAGING_MIN)
|
||||||
{
|
{
|
||||||
return 1;
|
return PIEZO_CONFIG_AVERAGING_MIN;
|
||||||
}
|
}
|
||||||
if (averaging > 10)
|
if (averaging > PIEZO_CONFIG_AVERAGING_MAX)
|
||||||
{
|
{
|
||||||
return 10;
|
return PIEZO_CONFIG_AVERAGING_MAX;
|
||||||
}
|
}
|
||||||
return averaging;
|
return averaging;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t clamp_piezo_delay_us(uint16_t delay_us)
|
static uint16_t clamp_piezo_delay_us(uint16_t delay_us)
|
||||||
{
|
{
|
||||||
if (delay_us > 50)
|
if (delay_us > PIEZO_CONFIG_DELAY_US_MAX)
|
||||||
{
|
{
|
||||||
return 50;
|
return PIEZO_CONFIG_DELAY_US_MAX;
|
||||||
}
|
}
|
||||||
return delay_us;
|
return delay_us;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t clamp_piezo_num_samples(uint16_t num_samples)
|
static uint16_t clamp_piezo_num_samples(uint16_t num_samples)
|
||||||
{
|
{
|
||||||
if (num_samples < 80)
|
if (num_samples < PIEZO_CONFIG_NUM_SAMPLES_MIN)
|
||||||
{
|
{
|
||||||
return 80;
|
return PIEZO_CONFIG_NUM_SAMPLES_MIN;
|
||||||
}
|
}
|
||||||
if (num_samples > 119)
|
if (num_samples > PIEZO_CONFIG_NUM_SAMPLES_MAX)
|
||||||
{
|
{
|
||||||
return 119;
|
return PIEZO_CONFIG_NUM_SAMPLES_MAX;
|
||||||
}
|
}
|
||||||
return num_samples;
|
return num_samples;
|
||||||
}
|
}
|
||||||
@@ -164,8 +165,8 @@ int Cmd_mpb(const ParsedCmd *cmd)
|
|||||||
*============================================================================*/
|
*============================================================================*/
|
||||||
int Cmd_mpc(const ParsedCmd *cmd)
|
int Cmd_mpc(const ParsedCmd *cmd)
|
||||||
{
|
{
|
||||||
uint16_t cycles = 5;
|
uint16_t cycles = DR_PIEZO_DEFAULT_CYCLES;
|
||||||
uint16_t freq_option = 1;
|
uint16_t freq_option = PIEZO_CONFIG_FREQ_OPTION_DEFAULT;
|
||||||
uint16_t piezo_ch = 0;
|
uint16_t piezo_ch = 0;
|
||||||
|
|
||||||
(void)dr_get_u16(cmd, 0, &cycles);
|
(void)dr_get_u16(cmd, 0, &cycles);
|
||||||
@@ -177,7 +178,7 @@ int Cmd_mpc(const ParsedCmd *cmd)
|
|||||||
piezo_ch = 0;
|
piezo_ch = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cycles < 3 || cycles > 7)
|
if (cycles < PIEZO_CONFIG_CYCLES_MIN || cycles > PIEZO_CONFIG_CYCLES_MAX)
|
||||||
{
|
{
|
||||||
dr_ble_return_1("rpc:", 2);
|
dr_ble_return_1("rpc:", 2);
|
||||||
return 1;
|
return 1;
|
||||||
@@ -224,7 +225,7 @@ int Cmd_mec(const ParsedCmd *cmd)
|
|||||||
uint16_t freq_option = 0;
|
uint16_t freq_option = 0;
|
||||||
uint16_t delay_us = 20;
|
uint16_t delay_us = 20;
|
||||||
uint16_t num_samples = 140;
|
uint16_t num_samples = 140;
|
||||||
uint16_t cycles = 5;
|
uint16_t cycles = DR_PIEZO_DEFAULT_CYCLES;
|
||||||
uint16_t averaging = 1;
|
uint16_t averaging = 1;
|
||||||
uint16_t piezo_ch = 0;
|
uint16_t piezo_ch = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -4,11 +4,13 @@
|
|||||||
* msn? -> rsn: battery ADC measurement
|
* msn? -> rsn: battery ADC measurement
|
||||||
* mst? -> rso: IMU die temperature reading
|
* mst? -> rso: IMU die temperature reading
|
||||||
* msp? -> rsp: IMU 6-axis single read
|
* msp? -> rsp: IMU 6-axis single read
|
||||||
|
* mim? -> rim: IMU FIFO 15-sample read
|
||||||
* all_sensors() bulk-measurement helper used by the mbb? handler
|
* all_sensors() bulk-measurement helper used by the mbb? handler
|
||||||
*============================================================================*/
|
*============================================================================*/
|
||||||
|
|
||||||
#include "cmd_common.h"
|
#include "cmd_common.h"
|
||||||
#include "cmd_sensor.h"
|
#include "cmd_sensor.h"
|
||||||
|
#include "app_raw.h"
|
||||||
|
|
||||||
/*==============================================================================
|
/*==============================================================================
|
||||||
* msn? -> rsn: Battery level ADC measurement
|
* msn? -> rsn: Battery level ADC measurement
|
||||||
@@ -47,6 +49,7 @@ int Cmd_mst(const ParsedCmd *cmd)
|
|||||||
|
|
||||||
/*==============================================================================
|
/*==============================================================================
|
||||||
* msp? -> rsp: IMU 6-axis single read
|
* msp? -> rsp: IMU 6-axis single read
|
||||||
|
* mim? -> rim: IMU FIFO 15-sample read
|
||||||
*
|
*
|
||||||
* Request: [TAG 4B "msp?"] [CRC 2B]
|
* Request: [TAG 4B "msp?"] [CRC 2B]
|
||||||
* Response: rsp: + accel(xyz) + gyro(xyz) (transmitted inside imu_read_direct)
|
* Response: rsp: + accel(xyz) + gyro(xyz) (transmitted inside imu_read_direct)
|
||||||
@@ -56,11 +59,49 @@ int Cmd_mst(const ParsedCmd *cmd)
|
|||||||
int Cmd_msp(const ParsedCmd *cmd)
|
int Cmd_msp(const ParsedCmd *cmd)
|
||||||
{
|
{
|
||||||
(void)cmd;
|
(void)cmd;
|
||||||
|
|
||||||
|
if (imu_fifo_capture_is_active())
|
||||||
|
{
|
||||||
|
return 1; // already owned by mtb?/mim?, ignore duplicate request
|
||||||
|
}
|
||||||
|
|
||||||
hw_i2c_init_once();
|
hw_i2c_init_once();
|
||||||
imu_read_direct();
|
imu_read_direct();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*==============================================================================
|
||||||
|
* mim? -> rim: IMU FIFO-only capture
|
||||||
|
*
|
||||||
|
* Request: [TAG 4B "mim?"] [CRC 2B]
|
||||||
|
* Response: rim: [total_sample_count u16 BE]
|
||||||
|
* [samples: 12B each ax,ay,az,gx,gy,gz ...]
|
||||||
|
*
|
||||||
|
* Uses the same FIFO/rim path as mtb? but without piezo reb:/raa: packets.
|
||||||
|
* At 50 Hz, 15 samples are about 300 ms; timeout leaves margin for startup.
|
||||||
|
*============================================================================*/
|
||||||
|
int Cmd_mim(const ParsedCmd *cmd)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
(void)cmd;
|
||||||
|
|
||||||
|
if (imu_fifo_capture_is_active())
|
||||||
|
{
|
||||||
|
return 1; // already owned by mtb?/mim?, ignore duplicate request
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = imu_fifo_capture_start();
|
||||||
|
if (rc != 0)
|
||||||
|
{
|
||||||
|
(void)imu_fifo_capture_stop_and_send_rim();
|
||||||
|
imu_fifo_capture_disable();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
(void)imu_fifo_capture_wait_samples_and_send_rim(15, 500);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*==============================================================================
|
/*==============================================================================
|
||||||
* all_sensors() - Bulk-measurement helper for the mbb? handler
|
* all_sensors() - Bulk-measurement helper for the mbb? handler
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
int Cmd_msn(const ParsedCmd *cmd); /* msn? -> rsn: battery ADC measurement */
|
int Cmd_msn(const ParsedCmd *cmd); /* msn? -> rsn: battery ADC measurement */
|
||||||
int Cmd_mst(const ParsedCmd *cmd); /* mst? -> rso: IMU die temperature */
|
int Cmd_mst(const ParsedCmd *cmd); /* mst? -> rso: IMU die temperature */
|
||||||
int Cmd_msp(const ParsedCmd *cmd); /* msp? -> rsp: IMU 6-axis single read */
|
int Cmd_msp(const ParsedCmd *cmd); /* msp? -> rsp: IMU 6-axis single read */
|
||||||
|
int Cmd_mim(const ParsedCmd *cmd); /* mim? -> rim: IMU FIFO 15 samples */
|
||||||
/* Helper for the mbb? handler: sequentially measures battery / IMU / temperature, then emits a single rbb: response.
|
/* Helper for the mbb? handler: sequentially measures battery / IMU / temperature, then emits a single rbb: response.
|
||||||
* Called from Cmd_mbb() in cmd_piezo.c. */
|
* Called from Cmd_mbb() in cmd_piezo.c. */
|
||||||
void all_sensors(void);
|
void all_sensors(void);
|
||||||
|
|||||||
+66
@@ -0,0 +1,66 @@
|
|||||||
|
@echo off
|
||||||
|
chcp 437
|
||||||
|
setlocal EnableExtensions
|
||||||
|
|
||||||
|
cd /d "%~dp0"
|
||||||
|
|
||||||
|
set "APP_HEX=medithings_bladder_patch_0001.hex"
|
||||||
|
set "BOOT_HEX=medithings_bladder_patch_bootloader.hex"
|
||||||
|
set "OUT_APP_ZIP=medithings_bladder_patch_dfu.zip"
|
||||||
|
set "OUT_BOOT_ZIP=medithings_bladder_patch_bootloader_dfu.zip"
|
||||||
|
|
||||||
|
REM Bootloader DFU requires a version greater than the currently installed bootloader_version.
|
||||||
|
REM cpd/cpd_eraseALL currently install bootloader-version 1, so use 2 for this update.
|
||||||
|
set "APP_VERSION=1"
|
||||||
|
set "BOOTLOADER_VERSION=2"
|
||||||
|
set "HW_VERSION=52"
|
||||||
|
set "SD_REQ=0x0100"
|
||||||
|
set "SD_ID=0x0100"
|
||||||
|
|
||||||
|
echo [1/4] Copying application HEX...
|
||||||
|
copy /Y "..\pca10056\s140\arm5_no_packs\_build\nrf52840_xxaa.hex" "%APP_HEX%"
|
||||||
|
if errorlevel 1 goto fail
|
||||||
|
|
||||||
|
echo [2/4] Copying bootloader HEX...
|
||||||
|
copy /Y "..\..\..\dfu\secure_bootloader\pca10056_s140_ble\arm5_no_packs\_build\nrf52840_xxaa_s140.hex" "%BOOT_HEX%"
|
||||||
|
if errorlevel 1 goto fail
|
||||||
|
|
||||||
|
echo [3/4] Generating application DFU package...
|
||||||
|
nrfutil pkg generate ^
|
||||||
|
--application "%APP_HEX%" ^
|
||||||
|
--application-version %APP_VERSION% ^
|
||||||
|
--hw-version %HW_VERSION% ^
|
||||||
|
--sd-req %SD_REQ% ^
|
||||||
|
--sd-id %SD_ID% ^
|
||||||
|
--key-file private.key ^
|
||||||
|
"%OUT_APP_ZIP%"
|
||||||
|
if errorlevel 1 goto fail
|
||||||
|
|
||||||
|
echo [4/4] Generating bootloader DFU package...
|
||||||
|
nrfutil pkg generate ^
|
||||||
|
--bootloader "%BOOT_HEX%" ^
|
||||||
|
--bootloader-version %BOOTLOADER_VERSION% ^
|
||||||
|
--hw-version %HW_VERSION% ^
|
||||||
|
--sd-req %SD_REQ% ^
|
||||||
|
--key-file private.key ^
|
||||||
|
"%OUT_BOOT_ZIP%"
|
||||||
|
if errorlevel 1 goto fail
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Done:
|
||||||
|
echo %OUT_APP_ZIP%
|
||||||
|
echo %OUT_BOOT_ZIP%
|
||||||
|
echo Bootloader version: %BOOTLOADER_VERSION%
|
||||||
|
echo.
|
||||||
|
echo Update order for both app and bootloader changes:
|
||||||
|
echo 1. Send %OUT_BOOT_ZIP%
|
||||||
|
echo 2. Power on again if the device powers off
|
||||||
|
echo 3. Send %OUT_APP_ZIP%
|
||||||
|
pause
|
||||||
|
exit /b 0
|
||||||
|
|
||||||
|
:fail
|
||||||
|
echo.
|
||||||
|
echo ERROR: Failed to generate DFU package(s).
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
@@ -40,6 +40,7 @@
|
|||||||
#include "nrf_pwr_mgmt.h"
|
#include "nrf_pwr_mgmt.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "debug_print.h"
|
#include "debug_print.h"
|
||||||
|
#include "../../measurement/piezo/piezo_config.h"
|
||||||
|
|
||||||
|
|
||||||
/* FDS record identifiers */
|
/* FDS record identifiers */
|
||||||
@@ -107,11 +108,11 @@ void fds_default_value_set(void)
|
|||||||
m_config.life_cycle = 0;
|
m_config.life_cycle = 0;
|
||||||
|
|
||||||
/* Piezo measurement parameter defaults */
|
/* Piezo measurement parameter defaults */
|
||||||
m_config.piezo_freq_option = 1; /* 2.1 MHz */
|
m_config.piezo_freq_option = PIEZO_CONFIG_FREQ_OPTION_DEFAULT; /* 2.1 MHz */
|
||||||
m_config.piezo_delay_us = 10; /* 10 us after burst */
|
m_config.piezo_delay_us = PIEZO_CONFIG_DELAY_US_DEFAULT; /* 10 us after burst */
|
||||||
m_config.piezo_num_samples = 100; /* 100 samples */
|
m_config.piezo_num_samples = PIEZO_CONFIG_NUM_SAMPLES_DEFAULT; /* 100 samples */
|
||||||
m_config.piezo_cycles = 3; /* 7 cycles */
|
m_config.piezo_cycles = PIEZO_CONFIG_CYCLES_DEFAULT; /* 3 cycles */
|
||||||
m_config.piezo_averaging = 3; /* 3x averaging */
|
m_config.piezo_averaging = PIEZO_CONFIG_AVERAGING_DEFAULT; /* 3x averaging */
|
||||||
|
|
||||||
/* Factory provisioning — default: not provisioned */
|
/* Factory provisioning — default: not provisioned */
|
||||||
m_config.factory_provisioned = 0;
|
m_config.factory_provisioned = 0;
|
||||||
|
|||||||
@@ -51,9 +51,12 @@
|
|||||||
* - VBTFW0119 260615 jhChun
|
* - VBTFW0119 260615 jhChun
|
||||||
* : Replaced all TMP235 temperature paths with IMU register direct-read temperature and removed legacy TMP235 build references.
|
* : Replaced all TMP235 temperature paths with IMU register direct-read temperature and removed legacy TMP235 build references.
|
||||||
* : Unify both IMU direct-read and FIFO outputs as raw data in datasheet axis convention.
|
* : Unify both IMU direct-read and FIFO outputs as raw data in datasheet axis convention.
|
||||||
|
* : Added mim? command (rim:, IMU FIFO-only 15 samples at 50 Hz).
|
||||||
* - VBTFW0120 260615 jhChun : Add EMC mitigation logic for BLE link stability: extended supervision timeout and dynamic TX power control based on RSSI, RSSI silence, HVN latency, and TX queue congestion.
|
* - VBTFW0120 260615 jhChun : Add EMC mitigation logic for BLE link stability: extended supervision timeout and dynamic TX power control based on RSSI, RSSI silence, HVN latency, and TX queue congestion.
|
||||||
|
* - VBTFW0121 260703 jhChun : Add mim? cammand.
|
||||||
|
* - VBTFW0122 260708 jhChun : Prevent IMU FIFO reentry and add MCLK ready timeout.
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
#define FIRMWARE_VERSION "VBTFW0120"
|
#define FIRMWARE_VERSION "VBTFW0122"
|
||||||
|
|
||||||
/*==============================================================================
|
/*==============================================================================
|
||||||
* Data Length Constants
|
* Data Length Constants
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "nrf_gpio.h"
|
#include "nrf_gpio.h"
|
||||||
|
#include "../piezo/piezo_config.h"
|
||||||
|
|
||||||
/*==============================================================================
|
/*==============================================================================
|
||||||
* PIN CONFIGURATION
|
* PIN CONFIGURATION
|
||||||
@@ -73,8 +74,8 @@
|
|||||||
*============================================================================*/
|
*============================================================================*/
|
||||||
#define DR_ADC_SCLK_MHZ 8.6f /**< SPI bit-bang SCLK frequency */
|
#define DR_ADC_SCLK_MHZ 8.6f /**< SPI bit-bang SCLK frequency */
|
||||||
#define DR_ADC_CLOCKS_PER_SAMPLE 16 /**< ADC121S051: 16 SCLK per sample */
|
#define DR_ADC_CLOCKS_PER_SAMPLE 16 /**< ADC121S051: 16 SCLK per sample */
|
||||||
#define DR_ADC_ECHO_SAMPLES_MAX 119 /**< Maximum samples */
|
#define DR_ADC_ECHO_SAMPLES_MAX PIEZO_CONFIG_NUM_SAMPLES_MAX /**< Maximum samples */
|
||||||
#define DR_ADC_ECHO_SAMPLES_DEFAULT 100 /**< Default samples */
|
#define DR_ADC_ECHO_SAMPLES_DEFAULT PIEZO_CONFIG_NUM_SAMPLES_DEFAULT /**< Default samples */
|
||||||
#define DR_ADC_SAMPLE_INTERVAL_US 1.86f /**< 16 / 8.6MHz = 1.86us per sample */
|
#define DR_ADC_SAMPLE_INTERVAL_US 1.86f /**< 16 / 8.6MHz = 1.86us per sample */
|
||||||
#define DR_ADC_SOUND_SPEED_MM_US 1.54f /**< Sound speed in tissue (mm/us) */
|
#define DR_ADC_SOUND_SPEED_MM_US 1.54f /**< Sound speed in tissue (mm/us) */
|
||||||
|
|
||||||
|
|||||||
+15
@@ -101,6 +101,7 @@ int inv_imu_switch_on_mclk(struct inv_imu_device *s)
|
|||||||
int status = 0;
|
int status = 0;
|
||||||
uint8_t data;
|
uint8_t data;
|
||||||
struct inv_imu_transport *t = (struct inv_imu_transport *)s;
|
struct inv_imu_transport *t = (struct inv_imu_transport *)s;
|
||||||
|
uint64_t start;
|
||||||
|
|
||||||
/* set IDLE bit only if it is not set yet */
|
/* set IDLE bit only if it is not set yet */
|
||||||
if (t->need_mclk_cnt == 0) {
|
if (t->need_mclk_cnt == 0) {
|
||||||
@@ -112,9 +113,23 @@ int inv_imu_switch_on_mclk(struct inv_imu_device *s)
|
|||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
|
start = inv_imu_get_time_us();
|
||||||
|
|
||||||
/* Check if MCLK is ready */
|
/* Check if MCLK is ready */
|
||||||
do {
|
do {
|
||||||
status = inv_imu_read_reg(s, MCLK_RDY, 1, &data);
|
status = inv_imu_read_reg(s, MCLK_RDY, 1, &data);
|
||||||
|
|
||||||
|
/* Bound the MCLK wait so a bad IMU/I2C state cannot hang the main loop. */
|
||||||
|
if ((inv_imu_get_time_us() - start) >= 50000U)
|
||||||
|
{
|
||||||
|
status = 0;
|
||||||
|
if (inv_imu_read_reg(s, PWR_MGMT0, 1, &data) == 0)
|
||||||
|
{
|
||||||
|
data &= ~PWR_MGMT0_IDLE_MASK;
|
||||||
|
(void)inv_imu_write_reg(s, PWR_MGMT0, 1, &data);
|
||||||
|
}
|
||||||
|
return INV_ERROR_TIMEOUT;
|
||||||
|
}
|
||||||
} while ((status != 0) || !(data & MCLK_RDY_MCLK_RDY_MASK));
|
} while ((status != 0) || !(data & MCLK_RDY_MCLK_RDY_MASK));
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
|||||||
@@ -986,3 +986,48 @@ int imu_fifo_capture_stop_and_send_rim(void)
|
|||||||
imu_fifo_send_rim_packets(packet_count);
|
imu_fifo_send_rim_packets(packet_count);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int imu_fifo_capture_wait_samples_and_send_rim(uint16_t target_samples, uint32_t timeout_ms)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
uint8_t count_raw[2] = {0};
|
||||||
|
uint16_t packet_count = 0;
|
||||||
|
uint32_t waited_ms = 0;
|
||||||
|
const uint32_t poll_ms = 10U;
|
||||||
|
|
||||||
|
if (target_samples == 0U)
|
||||||
|
{
|
||||||
|
return imu_fifo_capture_stop_and_send_rim();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!s_fifo_capture_active)
|
||||||
|
{
|
||||||
|
imu_fifo_send_rim_packets(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (waited_ms <= timeout_ms)
|
||||||
|
{
|
||||||
|
rc = inv_imu_read_reg(&icm_driver, FIFO_COUNTH, 2, count_raw);
|
||||||
|
if (rc != 0)
|
||||||
|
{
|
||||||
|
DBG_PRINTF("[IMU FIFO] count read fail %d\r\n", rc);
|
||||||
|
imu_fifo_send_rim_packets(0);
|
||||||
|
imu_fifo_power_off();
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
packet_count = (uint16_t)count_raw[0] | ((uint16_t)count_raw[1] << 8);
|
||||||
|
if (packet_count > target_samples)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
dr_sd_delay_ms(poll_ms);
|
||||||
|
waited_ms += poll_ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = imu_fifo_capture_stop_and_send_rim();
|
||||||
|
imu_fifo_capture_disable();
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|||||||
@@ -122,6 +122,13 @@ int imu_fifo_capture_start(void);
|
|||||||
*/
|
*/
|
||||||
int imu_fifo_capture_stop_and_send_rim(void);
|
int imu_fifo_capture_stop_and_send_rim(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Wait until at least target_samples FIFO records are available, then drain
|
||||||
|
* FIFO and send rim: packets.
|
||||||
|
* \return 0=success, negative=error
|
||||||
|
*/
|
||||||
|
int imu_fifo_capture_wait_samples_and_send_rim(uint16_t target_samples, uint32_t timeout_ms);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Stop IMU FIFO capture without sending rim: packets.
|
* \brief Stop IMU FIFO capture without sending rim: packets.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "nrf_gpio.h"
|
#include "nrf_gpio.h"
|
||||||
|
#include "piezo_config.h"
|
||||||
|
|
||||||
/*==============================================================================
|
/*==============================================================================
|
||||||
* Power control pin (+/-20V DC/DC converter)
|
* Power control pin (+/-20V DC/DC converter)
|
||||||
@@ -64,9 +65,9 @@
|
|||||||
* Configuration
|
* Configuration
|
||||||
*============================================================================*/
|
*============================================================================*/
|
||||||
#define DR_PIEZO_FREQ_HZ 2100000 /**< Target frequency (set PIEZO_FREQ_MHZ in .c) */
|
#define DR_PIEZO_FREQ_HZ 2100000 /**< Target frequency (set PIEZO_FREQ_MHZ in .c) */
|
||||||
#define DR_PIEZO_DEFAULT_CYCLES 5 /**< Default burst cycles */
|
#define DR_PIEZO_DEFAULT_CYCLES PIEZO_CONFIG_CYCLES_DEFAULT /**< Default burst cycles */
|
||||||
#define DR_PIEZO_MIN_CYCLES 3
|
#define DR_PIEZO_MIN_CYCLES PIEZO_CONFIG_CYCLES_MIN
|
||||||
#define DR_PIEZO_MAX_CYCLES 7
|
#define DR_PIEZO_MAX_CYCLES PIEZO_CONFIG_CYCLES_MAX
|
||||||
#define DR_PIEZO_MUX_SETTLING_US 1300 /**< MUX settling delay (us) */
|
#define DR_PIEZO_MUX_SETTLING_US 1300 /**< MUX settling delay (us) */
|
||||||
|
|
||||||
/*==============================================================================
|
/*==============================================================================
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
/*==============================================================================
|
||||||
|
* piezo_config.h - Shared piezo measurement parameter limits/defaults
|
||||||
|
*============================================================================*/
|
||||||
|
#ifndef PIEZO_CONFIG_H
|
||||||
|
#define PIEZO_CONFIG_H
|
||||||
|
|
||||||
|
/* Frequency option protocol:
|
||||||
|
* 0=1.8MHz, 1=2.1MHz, 2=2.0MHz, 3=1.7MHz, 4=2.2MHz, 9=1.9MHz
|
||||||
|
*/
|
||||||
|
#define PIEZO_CONFIG_FREQ_OPTION_DEFAULT 1U
|
||||||
|
|
||||||
|
#define PIEZO_CONFIG_CYCLES_MIN 3U
|
||||||
|
#define PIEZO_CONFIG_CYCLES_MAX 7U
|
||||||
|
#define PIEZO_CONFIG_CYCLES_DEFAULT 7U
|
||||||
|
|
||||||
|
#define PIEZO_CONFIG_AVERAGING_MIN 1U
|
||||||
|
#define PIEZO_CONFIG_AVERAGING_MAX 10U
|
||||||
|
#define PIEZO_CONFIG_AVERAGING_DEFAULT 10U
|
||||||
|
|
||||||
|
#define PIEZO_CONFIG_DELAY_US_MIN 0U
|
||||||
|
#define PIEZO_CONFIG_DELAY_US_MAX 50U
|
||||||
|
#define PIEZO_CONFIG_DELAY_US_DEFAULT 10U
|
||||||
|
|
||||||
|
#define PIEZO_CONFIG_NUM_SAMPLES_MIN 80U
|
||||||
|
#define PIEZO_CONFIG_NUM_SAMPLES_MAX 118U
|
||||||
|
#define PIEZO_CONFIG_NUM_SAMPLES_DEFAULT 100U
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* PIEZO_CONFIG_H */
|
||||||
Reference in New Issue
Block a user