diff --git a/libs/miosix-kernel b/libs/miosix-kernel index 9096c209182fc1c86a1f4f33c9a1546fdad4e0b3..38bea2878c5470f8dd4cdd5792c969a5bf5ab660 160000 --- a/libs/miosix-kernel +++ b/libs/miosix-kernel @@ -1 +1 @@ -Subproject commit 9096c209182fc1c86a1f4f33c9a1546fdad4e0b3 +Subproject commit 38bea2878c5470f8dd4cdd5792c969a5bf5ab660 diff --git a/sbs.conf b/sbs.conf index 1962ae20f79f9ec33e1887c22dadd85ea26548bb..cd6dccc8ea50a1d6603845d59454bfc3c1516cac 100644 --- a/sbs.conf +++ b/sbs.conf @@ -483,6 +483,14 @@ Include: %shared %spi Defines: -DDEBUG Main: drivers/test-lsm9ds1 +[test-lsm9ds1-class] +Type: test +BoardId: stm32f407vg_stm32f4discovery +BinName: test-lsm9ds1-class +Include: %shared %spi +Defines: -DDEBUG +Main: drivers/test-lsm9ds1-class + [test-rls] Type: test BoardId: stm32f429zi_skyward_death_stack diff --git a/src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.h b/src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.h index f4799a7ea78e9324d41bbae3bbf94b4646f3bda1..058bc329825ee0d715806727b26aece1bec03e03 100644 --- a/src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.h +++ b/src/shared/sensors/LSM9DS1/LSM9DS1_AxelGyro.h @@ -105,6 +105,12 @@ class LSM9DS1_XLG : public GyroSensor, public AccelSensor, public TemperatureSen } + void getWhoami() + { + SPITransaction spi(spislave); + uint8_t whoami = spi.read(regMapXLG::WHO_AM_I); + TRACE("whoami: 0x%02X\n", whoami); + } bool init() override @@ -113,34 +119,34 @@ class LSM9DS1_XLG : public GyroSensor, public AccelSensor, public TemperatureSen switch(axelFSR) { case AxelFSR::FS_2: - axelFSRval = 2.0f; + axelSensitivity = 0.061f; break; case AxelFSR::FS_4: - axelFSRval = 4.0f; + axelSensitivity = 0.122f; break; case AxelFSR::FS_8: - axelFSRval = 8.0f; + axelSensitivity = 0.244f; break; case AxelFSR::FS_16: - axelFSRval = 16.0f; + axelSensitivity = 0.732f; break; default: - axelFSRval = 2.0f; + axelSensitivity = 0.061f; break; } switch (gyroFSR) { case GyroFSR::FS_245: - gyroFSRval = 245.0f; + gyroSensitivity = 8.75f; break; case GyroFSR::FS_500: - gyroFSRval = 500.0f; + gyroSensitivity = 17.50f; break; case GyroFSR::FS_2000: - gyroFSRval = 2000.0f; + gyroSensitivity = 70.0f; break; default: - gyroFSRval = 245.0f; + gyroSensitivity = 8.75f; break; } @@ -165,8 +171,9 @@ class LSM9DS1_XLG : public GyroSensor, public AccelSensor, public TemperatureSen spi.write(regMapXLG::CTRL_REG9, (CTRL_REG9_VAL|0x02)); //DRDY_mask_bit ON, I2C OFF, FIFO ON } else + { spi.write(regMapXLG::CTRL_REG9, CTRL_REG9_VAL); //DRDY_mask_bit ON, I2C OFF, FIFO OFF - + } //Axel Setup: ODR, FSR defined by constructor, auto anti-aliasing BW (max), LPF2/HPF bypassed and disabled, axel output enabled by default @ startup @@ -181,17 +188,19 @@ class LSM9DS1_XLG : public GyroSensor, public AccelSensor, public TemperatureSen //spi.write(regMapXLG::ORIENT_CFG_G, ORIENT_CFG_VAL); //angular rate sign and orientation Setup <--- BOARD DEPENDENT //Check all the registers have been written correctly - if(spi.read(regMapXLG::CTRL_REG8)!=CTRL_REG8_VAL) return false; + if(spi.read(regMapXLG::CTRL_REG8)!=CTRL_REG8_VAL) {return false;} if(fifo_enabled) { - if(spi.read(regMapXLG::FIFO_CTRL) != (FIFO_CTRL_VAL|fifo_watermark)) return false; - if(spi.read(regMapXLG::INT1_CTRL) != INT1_CTRL_VAL) return false; - if(spi.read(regMapXLG::CTRL_REG9) != (CTRL_REG9_VAL| 0x02)) return false; + if(spi.read(regMapXLG::FIFO_CTRL) != (FIFO_CTRL_VAL|fifo_watermark)) {return false;} + if(spi.read(regMapXLG::INT1_CTRL) != INT1_CTRL_VAL) {return false;} + if(spi.read(regMapXLG::CTRL_REG9) != (CTRL_REG9_VAL| 0x02)) {return false;} } else - if(spi.read(regMapXLG::CTRL_REG9) != CTRL_REG9_VAL) return false; - if(spi.read(regMapXLG::CTRL_REG6_XL) != CTRL_REG6_XL_VAL) return false; - if(spi.read(regMapXLG::CTRL_REG1_G) != CTRL_REG1_G_VAL) return false; + { + if(spi.read(regMapXLG::CTRL_REG9) != CTRL_REG9_VAL) {return false;} + } + if(spi.read(regMapXLG::CTRL_REG6_XL) != CTRL_REG6_XL_VAL) {return false;} + if(spi.read(regMapXLG::CTRL_REG1_G) != CTRL_REG1_G_VAL) {return false;} //@ startup, some samples have to be discarded (datasheet) @@ -243,14 +252,14 @@ class LSM9DS1_XLG : public GyroSensor, public AccelSensor, public TemperatureSen // TRACE("LSM9DS1 temp: %02X\n, temp"); mLastAccel = - Vec3(x_xl * axelFSRval / 0xFFFF, - y_xl * axelFSRval / 0xFFFF, - z_xl * axelFSRval / 0xFFFF); + Vec3(x_xl / axelSensitivity, + y_xl / axelSensitivity, + z_xl / axelSensitivity); mLastGyro = - Vec3(x_gy * gyroFSRval / 0xFFFF, - y_gy * gyroFSRval / 0xFFFF, - z_gy * gyroFSRval / 0xFFFF); + Vec3(x_gy / gyroSensitivity, + y_gy / gyroSensitivity, + z_gy / gyroSensitivity); mLastTemp = tempZero + temp / tempSensistivity; //25°C + TEMP/S devo castare a float "temp"? } @@ -267,22 +276,22 @@ class LSM9DS1_XLG : public GyroSensor, public AccelSensor, public TemperatureSen //convert & store for(int i=0; i<fifo_samples; i++ ) { - uint16_t x_gy = buf[i*12] | buf[i*6 + 1] << 8; - uint16_t y_gy = buf[i*12 + 2] | buf[i*6 + 3] << 8; - uint16_t z_gy = buf[i*12 + 4] | buf[i*6 + 5] << 8; + uint16_t x_gy = buf[i*12] | buf[i*12 + 1] << 8; + uint16_t y_gy = buf[i*12 + 2] | buf[i*12 + 3] << 8; + uint16_t z_gy = buf[i*12 + 4] | buf[i*12 + 5] << 8; - uint16_t x_xl = buf[i*12 + 6] | buf[i*6 + 7] << 8; - uint16_t y_xl = buf[i*12 + 8] | buf[i*6 + 9] << 8; - uint16_t z_xl = buf[i*12 + 10] | buf[i*6 + 11] << 8; + uint16_t x_xl = buf[i*12 + 6] | buf[i*12 + 7] << 8; + uint16_t y_xl = buf[i*12 + 8] | buf[i*12 + 9] << 8; + uint16_t z_xl = buf[i*12 + 10] | buf[i*12 + 11] << 8; gyro_fifo[i] = - Vec3(x_gy * axelFSRval / 0xFFFF, - y_gy * axelFSRval / 0xFFFF, - z_gy * axelFSRval / 0xFFFF); + Vec3(x_gy / gyroSensitivity, + y_gy / gyroSensitivity, + z_gy / gyroSensitivity); axel_fifo[i] = - Vec3(x_xl * axelFSRval / 0xFFFF, - y_xl * axelFSRval / 0xFFFF, - z_xl * axelFSRval / 0xFFFF); + Vec3(x_xl / axelSensitivity, + y_xl / axelSensitivity, + z_xl / axelSensitivity); } } return true; @@ -318,8 +327,8 @@ class LSM9DS1_XLG : public GyroSensor, public AccelSensor, public TemperatureSen GyroFSR gyroFSR; ODR odr; - float axelFSRval; - float gyroFSRval; + float axelSensitivity; + float gyroSensitivity; float tempZero = 25.0f; float tempSensistivity = 16.0f; static const uint8_t samplesToDiscard = 8; //max possible val diff --git a/src/tests/drivers/test-lsm9ds1-class.cpp b/src/tests/drivers/test-lsm9ds1-class.cpp new file mode 100644 index 0000000000000000000000000000000000000000..51c9191f01177bdfa6ec54b047d33e874ea41650 --- /dev/null +++ b/src/tests/drivers/test-lsm9ds1-class.cpp @@ -0,0 +1,88 @@ +/** + * test LSM9DS1 axel + gyro + * Copyright (c) 2020 Skyward Experimental Rocketry + * Authors: Andrea Milluzzo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "drivers/spi/SPIDriver.h" +#include "sensors/LSM9DS1/LSM9DS1_AxelGyro.h" + +using namespace miosix; + +typedef Gpio<GPIOA_BASE, 5> GpioSck; //questi sono i pin SPI per f407_discovery +typedef Gpio<GPIOA_BASE, 6> GpioMiso; +typedef Gpio<GPIOA_BASE, 7> GpioMosi; + +static const bool FIFO_ENABLED = false; + +//SPI +SPIBus bus(SPI1); +SPIBusConfig cfg; +GpioPin cs(GPIOE_BASE, 7); + + + +int main(){ + + cfg.br = SPIBaudRate::DIV_64; //max 10MHz + + { + FastInterruptDisableLock dLock; + + RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //SPI1 ENABLE + + GpioSck::mode(Mode::ALTERNATE); + GpioMiso::mode(Mode::ALTERNATE); + GpioMosi::mode(Mode::ALTERNATE); + cs.mode(Mode::OUTPUT); + + GpioSck::alternateFunction(5); + GpioMiso::alternateFunction(5); + GpioMosi::alternateFunction(5); + + GpioSck::speed(Speed::_25MHz); + + } + + cs.high(); + + LSM9DS1_XLG sensor1( + bus, + cs, + cfg, + LSM9DS1_XLG::AxelFSR::FS_8, + LSM9DS1_XLG::GyroFSR::FS_245, + LSM9DS1_XLG::ODR::ODR_952 + ); + + + + sensor1.getWhoami(); + + while(1) + { + Thread::sleep(500); + } + + + return 0; +} \ No newline at end of file diff --git a/src/tests/drivers/test-lsm9ds1.cpp b/src/tests/drivers/test-lsm9ds1.cpp index bd6d5a8e79eb09b1459ddb7849e608ce1e78cbe7..9b23d2f3177551f329a91da953b5b106645e2270 100644 --- a/src/tests/drivers/test-lsm9ds1.cpp +++ b/src/tests/drivers/test-lsm9ds1.cpp @@ -34,6 +34,7 @@ typedef Gpio<GPIOA_BASE, 7> GpioMosi; static const bool FIFO_ENABLED = false; Vec3 adata, gdata; +float tdata; //SPI SPIBus bus(SPI1); @@ -44,9 +45,8 @@ GpioPin cs(GPIOE_BASE, 7); int main(){ - cfg.br = SPIBaudRate::DIV_256; //max 10MHz - cfg.cpol = 1; - cfg.cpha = 1; + cfg.br = SPIBaudRate::DIV_64; //max 10MHz + { FastInterruptDisableLock dLock; @@ -60,12 +60,16 @@ int main(){ GpioSck::alternateFunction(5); GpioMiso::alternateFunction(5); GpioMosi::alternateFunction(5); + + GpioSck::speed(Speed::_25MHz); + } cs.high(); LSM9DS1_XLG lsm9ds1( bus, cs, + cfg, LSM9DS1_XLG::AxelFSR::FS_8, LSM9DS1_XLG::GyroFSR::FS_245, LSM9DS1_XLG::ODR::ODR_952 @@ -80,10 +84,12 @@ int main(){ lsm9ds1.onSimpleUpdate(); adata = *(lsm9ds1.accelDataPtr()); gdata = *(lsm9ds1.gyroDataPtr()); - TRACE("TIMESTAMP:%.3f\taxel:%.3f,%.3f,%.3f\tgyro:%.3f,%.3f,%.3f\n", + tdata = *(lsm9ds1.tempDataPtr()); + TRACE("TIMESTAMP:%lld\t\taxel: %.3f,%.3f,%.3f\t\tgyro: %.3f,%.3f,%.3f\t\ttemp: %.3f\n", tick-first_tick, adata.getX(), adata.getY(), adata.getZ(), - gdata.getX(), gdata.getY(), gdata.getZ()); + gdata.getX(), gdata.getY(), gdata.getZ(), + tdata); Thread::sleep(500); }