diff --git a/os/ex/ST/lis3dsh.c b/os/ex/ST/lis3dsh.c index 880cf391e..517b325e5 100644 --- a/os/ex/ST/lis3dsh.c +++ b/os/ex/ST/lis3dsh.c @@ -466,6 +466,24 @@ static msg_t reset_sensivity(void *ip) { return MSG_OK; } +static msg_t get_temperature(void *ip, int8_t* tempp) { +#if LIS3DSH_USE_SPI + osalDbgAssert((((LIS3DSHDriver *)ip)->config->spip->state == SPI_READY), + "read_raw(), channel not ready"); +#if LIS3DSH_SHARED_SPI + spiAcquireBus(((LIS3DSHDriver *)ip)->config->spip); + spiStart(((LIS3DSHDriver *)ip)->config->spip, + ((LIS3DSHDriver *)ip)->config->spicfg); +#endif /* LIS3DSH_SHARED_SPI */ + *tempp = lis3dshSPIReadRegister(((LIS3DSHDriver *)ip)->config->spip, + LIS3DSH_AD_OUT_T); +#if LIS3DSH_SHARED_SPI + spiReleaseBus(((LIS3DSHDriver *)ip)->config->spip); +#endif /* LIS3DSH_SHARED_SPI */ +#endif /* LIS3DSH_USE_SPI */ + return MSG_OK; +} + static const struct BaseSensorVMT vmt_basesensor = { get_axes_number, read_raw, read_cooked }; @@ -477,7 +495,8 @@ static const struct BaseAccelerometerVMT vmt_baseaccelerometer = { static const struct LIS3DSHVMT vmt_lis3dsh = { get_axes_number, read_raw, read_cooked, - set_bias, reset_bias, set_sensivity, reset_sensivity + set_bias, reset_bias, set_sensivity, reset_sensivity, + get_temperature }; /*===========================================================================*/ diff --git a/os/ex/ST/lis3dsh.h b/os/ex/ST/lis3dsh.h index 7d1002f87..1f0ebcd17 100644 --- a/os/ex/ST/lis3dsh.h +++ b/os/ex/ST/lis3dsh.h @@ -241,7 +241,9 @@ typedef struct LIS3DSHDriver LIS3DSHDriver; * @brief @p LIS3DSH specific methods. */ #define _lis3dsh_methods \ - _base_accelerometer_methods + _base_accelerometer_methods \ + /* Retrieve the temperature of L3GD20 chip.*/ \ + msg_t (*get_temperature)(void *instance, int8_t* temperature); /** * @extends BaseAccelerometerVMT @@ -291,16 +293,17 @@ struct LIS3DSHDriver { /** * @brief Get current MEMS temperature. * @detail This information is very useful especially for high accuracy IMU + * @note Value is raw since there is a lack of information in datasheet. * * @param[in] ip pointer to a @p BaseAccelerometer class. - * @param[out] temp the MEMS temperature as single precision floating. + * @param[out] temp the MEMS temperature as raw data. * * @return The operation status. * @retval MSG_OK if the function succeeded. * @retval MSG_RESET if one or more errors occurred. * @api */ -#define accelerometerGetTemp(ip, tpp) \ +#define accelerometerGetTemp(ip, tpp) \ (ip)->vmt_lis3dsh->get_temperature(ip, tpp) /*===========================================================================*/ diff --git a/testhal/STM32/STM32F4xx/SPI-L3GD20/main.c b/testhal/STM32/STM32F4xx/SPI-L3GD20/main.c index fb4edfb21..e6e732898 100644 --- a/testhal/STM32/STM32F4xx/SPI-L3GD20/main.c +++ b/testhal/STM32/STM32F4xx/SPI-L3GD20/main.c @@ -113,12 +113,13 @@ int main(void) { */ l3gd20Start(&L3GD20D1, &l3gd20cfg); - while(!palReadLine(LINE_BUTTON)){ + while(!palReadLine(LINE_BUTTON)) { chprintf(chp, "Press BTN to calibrate gyroscope...\r\n"); chThdSleepMilliseconds(150); #if CHPRINTF_USE_ANSI_CODE chprintf(chp, "\033[2J\033[1;1H"); #endif + } palClearLine(LINE_LED3); chprintf(chp, "Calibrating Gyroscope sampling bias...\r\n"); diff --git a/testhal/STM32/STM32F4xx/SPI-LIS302DL/main.c b/testhal/STM32/STM32F4xx/SPI-LIS302DL/main.c index 025789275..429f7b0bb 100644 --- a/testhal/STM32/STM32F4xx/SPI-LIS302DL/main.c +++ b/testhal/STM32/STM32F4xx/SPI-LIS302DL/main.c @@ -120,7 +120,7 @@ int main(void) { accelerometerReadCooked(&LIS302DLD1, cookeddata); for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++) - chprintf(chp, "COOKED-%c:%.3f\r\n", axesID[i], cookeddata[i]); + chprintf(chp, "COOKED-%c:%.3f g\r\n", axesID[i], cookeddata[i]); chThdSleepMilliseconds(150); #if CHPRINTF_USE_ANSI_CODE diff --git a/testhal/STM32/STM32F4xx/SPI-LIS3DSH/debug/STM32F4xx-SPI-LIS3DSH (OpenOCD, Flash and Run).launch b/testhal/STM32/STM32F4xx/SPI-LIS3DSH/debug/STM32F4xx-SPI-LIS3DSH (OpenOCD, Flash and Run).launch index bfde2a1c3..df0961499 100644 --- a/testhal/STM32/STM32F4xx/SPI-LIS3DSH/debug/STM32F4xx-SPI-LIS3DSH (OpenOCD, Flash and Run).launch +++ b/testhal/STM32/STM32F4xx/SPI-LIS3DSH/debug/STM32F4xx-SPI-LIS3DSH (OpenOCD, Flash and Run).launch @@ -33,7 +33,7 @@ - + diff --git a/testhal/STM32/STM32F4xx/SPI-LIS3DSH/main.c b/testhal/STM32/STM32F4xx/SPI-LIS3DSH/main.c index 011a30cda..e67eda9b8 100644 --- a/testhal/STM32/STM32F4xx/SPI-LIS3DSH/main.c +++ b/testhal/STM32/STM32F4xx/SPI-LIS3DSH/main.c @@ -32,6 +32,7 @@ static LIS3DSHDriver LIS3DSHD1; static int32_t rawdata[LIS3DSH_NUMBER_OF_AXES]; static float cookeddata[LIS3DSH_NUMBER_OF_AXES]; +static int8_t temperature; static char axesID[LIS3DSH_NUMBER_OF_AXES] = {'X', 'Y', 'Z'}; static uint32_t i; @@ -121,7 +122,10 @@ int main(void) { accelerometerReadCooked(&LIS3DSHD1, cookeddata); for(i = 0; i < LIS3DSH_NUMBER_OF_AXES; i++) - chprintf(chp, "COOKED-%c:%.3f\r\n", axesID[i], cookeddata[i]); + chprintf(chp, "COOKED-%c:%.3f g\r\n", axesID[i], cookeddata[i]); + + accelerometerGetTemp(&LIS3DSHD1, &temperature); + chprintf(chp, "TEMP:%d \r\n", temperature); chThdSleepMilliseconds(150); #if CHPRINTF_USE_ANSI_CODE