From 13985fff925ba81f846f16f8a58101e54a88bdb5 Mon Sep 17 00:00:00 2001 From: imi415 Date: Fri, 22 Jul 2022 23:49:47 +0800 Subject: [PATCH] Added BME280/BMP280 sensor tests. --- .clang-format | 11 ++++++++++ .gitignore | 6 ++++++ .gitmodules | 3 +++ CMakeLists.txt | 15 ++++++++++++- lib/sensors | 1 + src/main.c | 54 ++++++++++++++++++++++++++++++++++++++++------ src/sensors_impl.c | 44 +++++++++++++++++++++++++++++++++++++ 7 files changed, 126 insertions(+), 8 deletions(-) create mode 100644 .clang-format create mode 100644 .gitignore create mode 160000 lib/sensors create mode 100644 src/sensors_impl.c diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..1e81119 --- /dev/null +++ b/.clang-format @@ -0,0 +1,11 @@ +BasedOnStyle: Google +IndentWidth: 4 +AlignConsecutiveMacros: Consecutive +AlignConsecutiveDeclarations: true +AlignConsecutiveAssignments: true +BreakBeforeBraces: Custom +BraceWrapping: + AfterEnum: false + AfterStruct: false + SplitEmptyFunction: false +ColumnLimit: 120 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ee1fbdd --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/board/*.bak +/build +/cmake-build-* +/.vscode +/*.jdebug* +/*.jflash \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index d4d2fe2..651cd5e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "SDK"] path = SDK url = https://git.minori.work/Embedded_SDK/MCUXpresso_LPC54102.git +[submodule "lib/sensors"] + path = lib/sensors + url = git@git.minori.work:Embedded_Projects/imsensors.git diff --git a/CMakeLists.txt b/CMakeLists.txt index c673f5f..19f5de5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.10) -project(lpc54102_hello) +project(wearable_functional_test) enable_language(CXX) enable_language(ASM) @@ -53,6 +53,7 @@ set(TARGET_SOURCES "board/pin_mux.c" "src/main.c" "src/pah8001_impl.c" + "src/sensors_impl.c" ) set(TARGET_C_DEFINES @@ -79,6 +80,7 @@ set(TARGET_C_INCLUDES set(TARGET_LIBS "power_cm4_hardabi" "pah8001" + "imsensors" ) # Shared library and linker script search paths @@ -109,6 +111,9 @@ set(CMAKE_EXE_LINKER_FLAGS "-specs=nano.specs -specs=nosys.specs -Wl,--gc-sectio add_subdirectory(lib/pixart_pah8001ei) +set(IMSENSORS_FLOAT_SUPPORT YES) +add_subdirectory(lib/sensors) + # Shared sources, includes and definitions add_compile_definitions(${TARGET_C_DEFINES}) include_directories(${TARGET_C_INCLUDES}) @@ -121,17 +126,25 @@ link_libraries(${TARGET_LIBS}) add_executable("${CMAKE_PROJECT_NAME}_FLASH.elf" ${TARGET_SOURCES}) target_link_options("${CMAKE_PROJECT_NAME}_FLASH.elf" PRIVATE "-T${TARGET_LDSCRIPT_FLASH}" + PRIVATE "-Wl,--Map=${CMAKE_PROJECT_NAME}_FLASH.map" ) add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_FLASH.hex" COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_FLASH.elf" "${CMAKE_PROJECT_NAME}_FLASH.hex" DEPENDS "${CMAKE_PROJECT_NAME}_FLASH.elf" ) +set_property(TARGET "${CMAKE_PROJECT_NAME}_FLASH.elf" APPEND + PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_PROJECT_NAME}_FLASH.map" +) add_custom_target("${CMAKE_PROJECT_NAME}_FLASH_HEX" DEPENDS "${CMAKE_PROJECT_NAME}_FLASH.hex") # Create ELF add_executable("${CMAKE_PROJECT_NAME}_RAM.elf" ${TARGET_SOURCES}) target_link_options("${CMAKE_PROJECT_NAME}_RAM.elf" PRIVATE "-T${TARGET_LDSCRIPT_RAM}" + PRIVATE "-Wl,--Map=${CMAKE_PROJECT_NAME}_RAM.map" +) +set_property(TARGET "${CMAKE_PROJECT_NAME}_FLASH.elf" APPEND + PROPERTY ADDITIONAL_CLEAN_FILES "${CMAKE_PROJECT_NAME}_RAM.map" ) add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_RAM.hex" COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_RAM.elf" "${CMAKE_PROJECT_NAME}_RAM.hex" diff --git a/lib/sensors b/lib/sensors new file mode 160000 index 0000000..6ee7244 --- /dev/null +++ b/lib/sensors @@ -0,0 +1 @@ +Subproject commit 6ee72440c713226cbcff2e9e148c8f61ea04b3e4 diff --git a/src/main.c b/src/main.c index fe03676..710570c 100644 --- a/src/main.c +++ b/src/main.c @@ -3,23 +3,51 @@ #include "peripherals.h" #include "pin_mux.h" +/* Debug console */ #include "fsl_debug_console.h" +/* PPG */ #include "pixart_pah8001ei.h" +/* Sensors */ +#include "imsensors/dht/dht_bme280.h" + pah_ret_t pah8001_impl_init(void *pdev); pah_ret_t pah8001_impl_write(void *pdev, uint8_t reg, uint8_t *value, uint16_t len); pah_ret_t pah8001_impl_read(void *pdev, uint8_t reg, uint8_t *value, uint16_t len); +ims_ret_t sensors_impl_i2c_xfer(void *pdev, uint16_t addr, ims_i2c_xfer_desc_t *xfer); +ims_ret_t sensors_impl_delay(void *pdev, uint32_t msec); + pah_t s_pah = { - .ops = { - .init = pah8001_impl_init, - .write = pah8001_impl_write, - .read = pah8001_impl_read, - }, + .ops = + { + .init = pah8001_impl_init, + .write = pah8001_impl_write, + .read = pah8001_impl_read, + }, .pdev = NULL, }; +ims_bme280_t s_bme = { + .user_data = NULL, + .i2c_addr = 0x77, + .cb = + { + .i2c_xfer = sensors_impl_i2c_xfer, + .delay = sensors_impl_delay, + }, +}; + +ims_bme280_t s_bmp = { + .user_data = NULL, + .i2c_addr = 0x76, + .cb = { + .i2c_xfer = sensors_impl_i2c_xfer, + .delay = sensors_impl_delay, + }, +}; + int main(void) { BOARD_InitBootPins(); BOARD_BootClockRUN(); @@ -31,7 +59,19 @@ int main(void) { pah8001_init(&s_pah); - for(;;) { - __WFI(); + ims_bme280_init(&s_bme); + ims_bme280_init(&s_bmp); + + ims_bme280_config_t dht_cfg; + + ims_bme280_preset_config(&dht_cfg, IMS_BME280_PRESET_WEATHER); + ims_bme280_apply_config(&s_bme, &dht_cfg); + ims_bme280_apply_config(&s_bmp, &dht_cfg); + ims_bme280_result_float_t r_bme_float; + ims_bme280_result_float_t r_bmp_float; + + for (;;) { + ims_bme280_measure_float(&s_bme, &r_bme_float); + ims_bme280_measure_float(&s_bmp, &r_bmp_float); } } \ No newline at end of file diff --git a/src/sensors_impl.c b/src/sensors_impl.c new file mode 100644 index 0000000..44df076 --- /dev/null +++ b/src/sensors_impl.c @@ -0,0 +1,44 @@ +#include "imsensors/sensors_common.h" + +/* SDK drivers */ +#include "fsl_i2c.h" + +ims_ret_t sensors_impl_i2c_xfer(void *pdev, uint16_t addr, ims_i2c_xfer_desc_t *xfer) { + if (xfer->tx_size > 0) { + if (I2C_MasterStart(I2C0, addr, kI2C_Write) != kStatus_Success) { + return IMS_FAIL; + } + + if (I2C_MasterWriteBlocking(I2C0, xfer->tx_data, xfer->tx_size, kI2C_TransferNoStopFlag) != kStatus_Success) { + return IMS_FAIL; + } + } + + if (xfer->rx_size > 0) { + if (xfer->tx_size > 0) { + if (I2C_MasterRepeatedStart(I2C0, addr, kI2C_Read) != kStatus_Success) { + return IMS_FAIL; + } + } else { + if (I2C_MasterStart(I2C0, addr, kI2C_Read) != kStatus_Success) { + return IMS_FAIL; + } + } + + if (I2C_MasterReadBlocking(I2C0, xfer->rx_data, xfer->rx_size, kI2C_TransferNoStopFlag) != kStatus_Success) { + return IMS_FAIL; + } + } + + if (I2C_MasterStop(I2C0) != kStatus_Success) { + return IMS_FAIL; + } + + return IMS_SUCCESS; +} + +ims_ret_t sensors_impl_delay(void *pdev, uint32_t msec) { + SDK_DelayAtLeastUs(msec * 20); + + return IMS_SUCCESS; +} \ No newline at end of file