Skip to content

读取 STS31 传感器温度

使用APP_TIMER, SCHEDULER, TWI_MNGR 库函数

include

c
#include "app_error.h"
#include "app_timer.h"
#include "app_scheduler.h"
#include "app_util_platform.h"
#include "compiler_abstraction.h"
#include "nrf_drv_clock.h"
#include "nrf_pwr_mgmt.h"
#include "nrf_twi_mngr.h"
#include "sts31.h"
#include <stdio.h>

#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"

define

c
#define TWI_INSTANCE_ID 0

#define MAX_PENDING_TRANSACTIONS 5

#define SCHED_MAX_EVENT_DATA_SIZE APP_TIMER_SCHED_EVENT_DATA_SIZE

#define SCHED_QUEUE_SIZE 10

NRF_TWI_MNGR_DEF(m_nrf_twi_mngr, MAX_PENDING_TRANSACTIONS, TWI_INSTANCE_ID);
APP_TIMER_DEF(test_timer);

static uint8_t read_trans[2] = { ((STS31_FETCH_DATA >> 8) & 0xFF),
                                 STS31_FETCH_DATA & 0xFF };
uint8_t read_buff[3] = { 0 };

程序

c
// 数据读取回调
static void read_data_callback(ret_code_t result, void *p_user_data)
{
    // if (result != NRF_SUCCESS) {
    //   NRF_LOG_WARNING("read data error code ->  %d", (int)result);
    //   // return;
    // }
    float data = 0;
    data = (-45 + 175 * (read_buff[0] * 256 + read_buff[1]) / 65535.0);
    // NRF_LOG_DEBUG("STS31 READ_BUFF:");
    // NRF_LOG_HEXDUMP_DEBUG(read_buff, 3);
    NRF_LOG_INFO("THE TEMPERATURE IS -> " NRF_LOG_FLOAT_MARKER "\r\n",
                 NRF_LOG_FLOAT(data));
}

// 数据读取
static void read_data(void)
{
    static nrf_twi_mngr_transfer_t const transfers[] = { STS31_READ(
        read_trans, read_buff) };
    static nrf_twi_mngr_transaction_t NRF_TWI_MNGR_BUFFER_LOC_IND
        transaction = { .callback = read_data_callback,
                        .p_user_data = NULL,
                        .p_transfers = transfers,
                        .number_of_transfers =
                            sizeof(transfers) / sizeof(transfers[0]) };
    APP_ERROR_CHECK(nrf_twi_mngr_schedule(&m_nrf_twi_mngr, &transaction));
}

// TWI 初始化
static void twi_config(void)
{
    uint32_t err_code;

    nrf_drv_twi_config_t const config = { .scl = STS31_SCL_PIN,
                                          .sda = STS31_SDA_PIN,
                                          .frequency = NRF_DRV_TWI_FREQ_100K,
                                          .interrupt_priority =
                                              APP_IRQ_PRIORITY_LOWEST,
                                          .clear_bus_init = false };

    err_code = nrf_twi_mngr_init(&m_nrf_twi_mngr, &config);
    APP_ERROR_CHECK(err_code);
}

static void lfclk_config(void)
{
	uint32_t err_code;
    err_code = nrf_drv_clock_init();
    APP_ERROR_CHECK(err_code);

    nrf_drv_clock_lfclk_request(NULL);
}

void timmer_callback(void *p_context)
{
    // 读取数据
    read_data();
    // NRF_LOG_INFO("APP TIMMER RUNNING..");
}

// 定时器初始化
static void timer_init(void)
{
    uint32_t err_code;
    err_code = app_timer_init();
    APP_ERROR_CHECK(err_code);
    // 创建一个定时器(时钟 id, 时钟模式,
    err_code =
        app_timer_create(&test_timer, APP_TIMER_MODE_REPEATED, timmer_callback);
    APP_ERROR_CHECK(err_code);
    // Start repeated timer (start blinking LED).
    err_code = app_timer_start(test_timer, APP_TIMER_TICKS(1000), NULL);
}

// 数据读取初始化
void read_init(void)
{
    // 传感器模式初始化
    // sts31_init();

    timer_init();
}

void log_init(void)
{
    ret_code_t err_code;

    err_code = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_DEFAULT_BACKENDS_INIT();
}

int main(void)
{
    ret_code_t err_code;

    lfclk_config();
    log_init();
    err_code = nrf_pwr_mgmt_init();
    APP_ERROR_CHECK(err_code);
    
    twi_config();
    read_init();
    APP_SCHED_INIT(SCHED_MAX_EVENT_DATA_SIZE, SCHED_QUEUE_SIZE);

    APP_ERROR_CHECK(nrf_twi_mngr_perform(&m_nrf_twi_mngr, NULL,
                                         sts31_init_transfers, 1, NULL));

	NRF_LOG_RAW_INFO(
        "\r\nTWI sts31 data test start -------------------------. \r\n");
    NRF_LOG_FLUSH();
    
    while (true) {
        app_sched_execute();
        nrf_pwr_mgmt_run();
        NRF_LOG_FLUSH();
    }
}

Released under the GPL License.